Работа с базами данных через пакет PEAR MDB2
Вход Регистрация

Работа с базами данных через пакет PEAR MDB2

PHP скрипт используется для выполнения запросов к базам данных, с помощью пакета PEAR MDB2. Пакет PEAR MDB2 (абстрактный слой баз данных) позволяет общаться с различными базами данных, предоствляя единый интерфейс.

Он устанавливает подключение к базе данных, используя DSN-строку.

Скрипт может выполнять запросы и кэшировать результаты, используя пакет Cache Lite, а также разбивать на страницы результаты запросов, используя пакет Pager.

Лицензия GPL 2.0.

Системные требования скрипта:

PHP не младше 5.0 версии.

Исходник скрипта


/**
@package AutoDBRec
@requires PEAR, MDB2 ,Cache/Lite, Pager
@author Holger Sielaff
@copyright 2010 - Holger Sielaff
@license GPL <http://www.gnu.org/licenses/gpl-2.0.html>

This package is free for use - exept for commercial proposes
In this Case please contact the author <dev@holger-sielaff.de>

HOWTO:

$result = AutoDBRec::newRec("SELECT * FROM test WHERE id = ?", $id); //returns object of first datarow
$result = AutoDBRec::newArray("SELECT * FROM test WHERE id = ?", $id); //returns array of objects 
$result = AutoDBRec::newPaged("SELECT * FROM test WHERE id = ?", $id); //returns paged array of objects 

if set CACHE in fron of query, record is cached
pEx:
$result = AutoDBRec::newPaged("CACHE SELECT * FROM test WHERE id = ?", $id);


*/
require_once 'PEAR.php';
require_once 'MDB2.php';
require_once 'Cache/Lite.php';
require_once 'Pager.php';
/**
DB Params
*/
if(!defined('DBType')) define('DBType', 'mysql');
if(!defined('DBHost')) define('DBHost', 'localhost');
if(!defined('DBName')) define('DBName', 'moebel');
if(!defined('DBPass')) define('DBPass', 'SIE7773');
if(!defined('DBUser')) define('DBUser', 'holger');
if(!defined('DBChar')) define('DBChar', 'utf8');
/**
Cache Params
*/
if(!defined('CacheDir')) define('CacheDir', '/tmp/');
if(!defined('CacheLifetime')) define('CacheLifetime', 3600);
/**
Pager Params
*/
if(!defined('PagerPerPage')) define('PagerPerPage', 5);
/**
class AutoDBRec
{{{{
*/               
class AutoDBRec{

  public static $DB    = null;
  public static $CACHE = null;

  public static function factory(){
    if(!is_object(self::$DB)){
      $_DSN_     = array('phptype'  => DBType,
                         'username' => DBUser,
                         'password' => DBPass,
                         'hostspec' => DBHost,
                         'database' => DBName,);
      $_OPTIONS_ = array('debug'       => 2,
                         'portability' => MDB2_PORTABILITY_ALL,);

      /**
      initiate DB Connection
      */
      self::$DB  =& MDB2::connect($_DSN_, $_OPTIONS_);
      self::$DB->setCharset(DBChar);
      if (PEAR::isError(self::$DB)){
          die($_DB_->getMessage());
      }
    }
    if(!is_object(self::$CACHE)){
      /**
      initiate Cache Object
      */
      $options = array('cacheDir'               => CacheDir,
                       'lifeTime'               => CacheLifetime,
                       'automaticSerialization' => true
);
      self::$CACHE =  new Cache_Lite($options);
    }
    return true;
  }

  public function newArray(){
    self::factory();
    $args = func_get_args();
    $ret = array();
    $args = self::cummulate($args);
    list($Q, $C) = self::_query($args);
    if($C){
      $CID = md5($Q);
      if($cres = self::cache($CID, 'get')){
        return $cres;
      }
    }
    $res =& self::$DB->query($Q);
    if (PEAR::isError($res)) {
      die($res->getMessage());
    }
    while($r = $res->fetchRow(MDB2_FETCHMODE_OBJECT)){
      $ret[] = $r;
    }
    return $C ? self::cache($CID, 'save', $ret) :  $ret;
  }
  public function newRec(){
    self::factory();
    $args = func_get_args();
    $args = self::cummulate($args);
    $ret  = false;
    list($Q, $C) = self::_query($args);
    if($C){
      $CID = md5($Q);
      if(false !== ($cres = self::cache($CID, 'get'))){
        return $cres;
      }
    }
    $res =& self::$DB->query($Q);
    if (PEAR::isError($res)) {
      die($res->getMessage());
    }
    while($r = $res->fetchRow(MDB2_FETCHMODE_OBJECT)){
      return $C ? self::cache($CID, 'save', $r) :  $r;
      break;
    }
  }

  public static function newPaged(){
    self::factory();
    $args = func_get_args();
    if($_POST['PagerPerPage'] > 0) define('PagerPerPage', (int)$_POST['PagerPerPage']);
    if($_GET['PagerPerPage'] > 0)  define('PagerPerPage', (int)$_GET['PagerPerPage']);

    $options = array('itemData' => self::newArray($args),
                     'perPage'  => PagerPerPage,
                     'urlVar'   => md5($args[0]));
    $_ = Pager::factory($options);
    return $_;
  }
  
  public static function pagerOptions(&$pager, $options = array()){
    /**
    @see http://pear.php.net/manual/en/package.html.pager.factory.php for documentation
    */
    $pager->setOptions($options);
    $pager->build();
  }

  public static function getPagerData($pager){
    /**
    @see http://pear.php.net/manual/en/package.html.pager.php for documentation
    */
    return $pager->getPageData();
  }

  public static function getPagerLinks($pager, $parse = false){
    /**
    @see http://pear.php.net/manual/en/package.html.pager.php for documentation
    */
    $_ = $pager->getLinks();
    return $parse ? $_[5] : $_;
  }


  public static function cache($id, $method = 'get', $data = null){
    if($method == 'get'){
      if($ret = self::$CACHE->get($id)){
        return $ret;
      }else{
        if($data){
          self::$CACHE->save($data, $id);
          return $data;
        }
      }
    }elseif($method == 'save'){
      if(self::$CACHE->save($data, $id)){
        return $data;
      }else{
      }
    }
    return false;
  }

  public function _query($args){
    $_   = array();
    $query = trim(array_shift($args));
    if(preg_match('/^CACHE\s+/i', $query)){
      $_[] = true;
      $query      = preg_replace('/^CACHE\s+/i', '', $query);
    }else{
      $_[] = false;
    }
    $query = preg_replace('/\'\s*?\?\\s*?\'/', '?', $query);
    $query = preg_replace('/%/', '%%', $query);
    $query = preg_replace('/\?/','%s', $query); # fГјr sprintf vorbereiten
    $query = vsprintf($query, self::mysql_escape_and_quote($args));
    $query = preg_replace('/LIKE *(%*)\'(.*)\'(%*)/i', "LIKE '\\1\\2\\3'", $query);
    $_[] = $query;
    return array_reverse($_);
   }

  
  
  public function quoteSmart($in){
    $NOQUOTES = array('NOW()', 'TIME()', 'DATE()', 'NULL');
    $in = trim((string)$in);
    if($in{0} == "'" && $in{strlen($in) - 1} == "'"){
      $in = substr($in, 1, -1);
    }
    if(is_int($in) || in_array($in, $NOQUOTES)) {
        return $in;
    }elseif (is_int($in)) {
        return $in;
    }elseif (is_bool($in)) {
        return self::quoteBoolean($in);
    }elseif (is_null($in)) {
        return 'NULL';
    }else{
      return self::quoteString($in);
    }
  }
  public function quoteBoolean($boolean) {
      return $boolean ? '1' : 'NULL';
  }
  public function quoteFloat($float) {
      return "'".self::escapeSimple(str_replace(',', '.', strval(floatval($float))))."'";
  }
  public function quoteString($string) {
      return "'".self::escapeSimple($string)."'";
  }
  public function escapeSimple($str){
      return mysql_escape_string(htmlentities($str, ENT_NOQUOTES, "UTF-8"));
  }
  public function mysql_escape_and_quote($thing){
    $ret = array();
    if(is_array($thing) || is_object($thing)){
      foreach($thing as $key => $val){
        $ret[$key] = self::quoteSmart($val);
      }
      return $ret;
    }else{
      return self::quoteSmart($thing);
    }
  }
  public static function cummulate($args){
    return (is_array($args[0])) ? $args[0] : $args;
  }

}
/**
}}}}
*/

Скачать архивы


Комментировать

captcha

Вход

Зарегистрируйтесь, если нет учетной записи

Напомнить пароль
Регистрация
Напомнить пароль
Войти в личный кабинет