2012-07-11 53 views
2

我有一個用戶可以實例化的數據庫類。如何處理已準備好的語句的禁用

class Foo extends PDO 
{ 
    public function __construct($dsn, $username, $password) 
    { 
     parent::__construct($dsn, $username, $password); 

     $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
} 

$dsn = 'mysql:host=127.0.0.1;dbname=dbdatabase;charset=utf8'; 
$dbConnection = new Foo($dsn, 'root', 'password'); 

但是我需要禁用在構造函數中準備語句的仿真時所使用的驅動程序是mysql

$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

對於其他驅動器(據我所知)預處理語句的仿真被禁用默認情況下(就像它應該)。什麼是正確的方法來禁用我的課程中模擬的準備好的語句。

  • 總是添加行來禁用模擬預處理語句?這會有什麼副作用嗎?
  • 做一stripos($dsn, 'mysql:')在dsn中查找mysql?
  • 使用PDO::getAttribute('PDO::ATTR_DRIVER_NAME')

回答

1

我會避免做全球性的,因爲你不能確定這些參數的副作用,你不應該這樣做。

順便說一下,你正試圖禁用它們只爲MySQL,所以只能爲MySQL。

我的確認爲使用PDO::ATTR_DRIVER_NAME是一個不錯的選擇。

我記得使用Doctrine\DBAL再加上driverMap這樣的事情,以確定這樣的事情(對於需要源)

它看起來也比用DSN工作,因爲,你可以使用一個DSN別名與PDO更好,因此mysql部分可能不存在。