Пример использования статического класса для удобной работы с базой

PHP
PHP продолжает развиваться и с каждой новой версией радует всякими плюшками.
Вот захотел поделится интересной идеей использования статических классов на php.

Задачи которые должен был реализовывать класс:
1. Уменьшать количество буков которые надо набирать(минимум лишней писанины)
2. Соединение с базой должно происходить непосредственно при необходимости(перед запросом)
3. Упростить жизнь, если в дальнейшем захочется сменить базу данных.

собственно хоть в конфиге делаем
require_once 'Sql.php';
Sql::initialize($connectionString);

Ну а дальше всё просто и лаконично: Sql::query($sql); $fn = Sql::fetchField('field_name'); $ff = Sql::fetchAll();

class Sql
{

  static protected $params;

  static public $connected = 0;
  static public $handle;
  static public $res;

  static public $history = array();
  static public $save_history = 0;

  static function initialize($connection_string)
  {
    static::$params = $connection_string;
  }

  static function connect()
  {
    if (self::$save_history) $b = microtime(true);
    static::$handle = pg_pconnect(static::$params) or die('Postgres ' . get_called_class() . ' connection failed!');
    if (self::$save_history) self::$history[] = number_format(microtime(true) - $b, 8) . ' ' . get_called_class() . ' connect';
    static::$connected = 1;
  }

  static function query($q)
  {
    if (!static::$connected) self::connect();
    if (self::$save_history) $b = microtime(true);
    static::$res = @pg_query(static::$handle, $q) or die('SQL ERROR! ' . error_log($q . "\n" . pg_last_error(static::$handle)));
    if (self::$save_history) self::$history[] = number_format(microtime(true) - $b, 8) . ': ' . preg_replace('/\s+/', ' ', $q);
    return static::$res;
  }

  static function numRows($handle = null)
  {
    if (!$handle) $handle = static::$res;
    if (!static::$connected) self::connect();
    if (!$handle) return false;
    return pg_num_rows($handle);
  }

  static function lastId($handle = null)
  {
    if (!$handle) $handle = static::$res;
    if (!self::$connected) self::connect();
    if (!$handle) return false;
    return pg_last_oid($handle);
  }

  static function fetchAssoc($handle = null, $row = null)
  {
    if (!$handle) $handle = static::$res;
    if (!static::$connected) self::connect();
    if (!$handle) return false;
    return pg_fetch_assoc($handle, $row);
  }

  static function fetchArray($handle = null, $row = null)
  {
    if (!$handle) $handle = static::$res;
    if (!static::$connected) self::connect();
    if (!$handle) return false;
    return pg_fetch_array($handle, $row, PGSQL_NUM);
  }

  static function fetchField($field, $row = 0, $handle = null)
  {
    if (!$handle) $handle = static::$res;
    if (!static::$connected) self::connect();
    if (!$handle) return false;
    return pg_fetch_result($handle, $row, $field);
  }

  static function fetchAll($handle = null)
  {
    if (!$handle) $handle = static::$res;
    if (!static::$connected) self::connect();
    if (!$handle) return false;

    return pg_fetch_all($handle);
  }

  static function freeResult($handle = null)
  {
    if (!$handle) $handle = static::$res;
    if (!$handle) return false;
    return pg_free_result($handle);
  }

  static function escapeString($s)
  {
    if (!static::$connected) self::connect();
    return pg_escape_string(static::$handle, $s);
  }

  static function dumplog()
  {
    return '
'</font> . dump(self::$history, <font color="#0000ff">true</font>) . <font color="#A31515">'
';
  }
}


p.s. Пример для postgre, но я думаю если идея понравится как переделать под mysql, уже можно сообразить.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.