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')
4

1 回答 1

1

我会避免在全球范围内这样做,因为您无法确定此类参数的副作用,因此您不应该这样做。

顺便说一句,你试图只为 mysql 禁用它们,所以只为 mysql 禁用它们。

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

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

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

于 2012-07-11T10:54:16.087 回答