如何处理禁用预准备语句

时间:2012-07-11 10:45:33

标签: php pdo

我有一个用户可以实例化的数据库类。

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 个答案:

答案 0 :(得分:1)

我会避免全局,因为你无法确定这些参数的副作用,你不应该这样做。

顺便说一下,你只是试图为mysql禁用它们,所以只对mysql这样做。

我认为使用PDO::ATTR_DRIVER_NAME是一个不错的选择。

我记得Doctrine\DBAL使用这些东西加上一个driverMap来确定这些东西(需要来源)

它看起来比使用DSN更好,因为您可以使用PDO的DSN别名,因此mysql部分可能不存在。