如何处理禁用准备好的语句


How to handle disabling of prepared statements

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

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

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

顺便说一句,您正试图仅对mysql禁用它们,所以只对mysql执行此操作。

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

我记得Doctrine'DBAL使用这样的东西和driverMap来确定这样的东西(需要来源)

它看起来也比使用DSN更好,因为您可能会将DSN别名与PDO一起使用,因此mysql部分可能不存在。