2015-11-02 54 views
1

我有以下代码,并试图改变这一行:扩展PDO准备方法,以取代查询前缀

$sth = $db->prepare(Utils::prepareSQLPrefix($sql, Config::get('DB_PREFIX'))); 

延长某种$ DB->在我DatabaseFactory做好上课的准备功能(如果要替换查询前缀) 。

$db   = DatabaseFactory::getFactory()->getConnection(); 
$sql  = ' SELECT 
        `id`, `manifest` 
       FROM 
        `#__extensions` 
       WHERE 
        `name` = :name 
       LIMIT 1'; 

     $sth = $db->prepare(Utils::prepareSQLPrefix($sql, Config::get('DB_PREFIX'))); 
     $sth->execute(array('name' =>$extension->component_name)); 
     $result = $sth->fetch(); 

我DatabaseFactory类:

class DatabaseFactory { 
    private static $factory; 
    private $database; 

    public static function getFactory() 
    { 
     if (!self::$factory) { 
      self::$factory = new DatabaseFactory(); 
     } 
     return self::$factory; 
    } 

    public function getConnection() { 
     if (!$this->database) { 
      $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
      $this->database = new PDO(
        Config::get('DB_TYPE') . ':host=' . Config::get('DB_HOST') . ';dbname=' . 
        Config::get('DB_NAME') . ';port=' . Config::get('DB_PORT') . ';charset=' . Config::get('DB_CHARSET'), 
        Config::get('DB_USER'), Config::get('DB_PASS'), $options 
      ); 

     } 

     return $this->database; 
    } 
} 

我的Utils类:

class Utils { 
    public static function prepareSQLPrefix($sql, $prefix) { 
     return str_replace('#__', $prefix, $sql); 
    } 
} 

我怎么能这样做呢?谢谢!

+0

你的代码似乎是有效的。你有什么问题或问题? – Alex

+0

我想将prepareSQLPrefix移动到DatabaseFactory类 – user889349

+0

,您应该在DatabaseFactory类上使用_contruct,然后在Utils上使用parent ::构造。或者使用protected和扩展DatabaseFactory到子类 –

回答

1

我想你应该创建延伸PDO新类,并重新定义prepare功能:

class myPDO extends PDO { 

    public function prepare ($sql, $options = NULL) { 
     $sql = Utils::prepareSQLPrefix($sql, Config::get('DB_PREFIX')); 
     return parent::prepare($sql, $options); 
    } 

} 

然后你你的工厂getConnection更改为:

public function getConnection() { 
    if (!$this->database) { 
     $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
     $this->database = new myPDO(
       Config::get('DB_TYPE') . ':host=' . Config::get('DB_HOST') . ';dbname=' . 
       Config::get('DB_NAME') . ';port=' . Config::get('DB_PORT') . ';charset=' . Config::get('DB_CHARSET'), 
       Config::get('DB_USER'), Config::get('DB_PASS'), $options 
     ); 

    } 

    return $this->database; 
} 

,然后代替:

$sth = $db->prepare(Utils::prepareSQLPrefix($sql, Config::get('DB_PREFIX'))); 

你可以:

$sth = $db->prepare($sql); 

得到同样的预期结果

+0

谢谢!我有更新我的代码,但得到一个错误:严格的标准:DB :: prepare()的声明应该与...中的\ core \ DB.php中的PDO :: prepare($ statement,$ options = NULL)兼容52 – user889349

+0

因为你做了你的方式不是我的。按照我所说的去做,但不是你认为你所理解的。类myPDO应该用一个重新定义的方法分隔类。但你做了不同的事情 - 为什么?你做'$ this-> database = new DB('这样看起来就像'DB'类中的递归调用你为什么这么做? – Alex

+0

@ user889349通过我读过你的错误发布的方式,所以添加',$ options = NULL' to'prepare'函数重新定义 – Alex