我有一个用户可以实例化的数据库类。
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')
?答案 0 :(得分:1)
我会避免全局,因为你无法确定这些参数的副作用,你不应该这样做。
顺便说一下,你只是试图为mysql禁用它们,所以只对mysql这样做。
我认为使用PDO::ATTR_DRIVER_NAME
是一个不错的选择。
我记得Doctrine\DBAL
使用这些东西加上一个driverMap来确定这些东西(需要来源)
它看起来比使用DSN更好,因为您可以使用PDO
的DSN别名,因此mysql
部分可能不存在。