与持久连接一起禁用ATTR_EMULATE_PREPARES会导致连接断开

时间:2014-05-02 21:47:00

标签: php mysql pdo

我目前正在重新考虑我的PHP框架的数据库包装器类以使用PDO。

我在数据库包装类中必须完成的主要任务很少:

  • 对MySQL,PostgreSQL和Oracle数据库的基本DML操作(INSERT,SELECT,UPDATE,DELETE)总是完全相同的结果
  • 仅限持久连接(每个请求的新连接不是Oracle的选项,因为建立连接的成本在延迟方面非常高)
  • 始终绑定参数(提供开箱即用的SQL注入证明方法)

不幸的是我遇到了#34; ERR_CONNECTION_RESET"每次我在对MySQL数据库执行查询时都使用以下两个PDO属性ATTR_EMULATE_PREPARES => FALSEATTR_PERSISTENT => TRUE的组合。

以下是示例代码(不是实际的包装类,但它重复了相同的错误):

$connection = new PDO(
    'mysql:host=localhost;dbname=test'
    ,'root'
    ,''
    ,array(
        PDO::ATTR_AUTOCOMMIT => FALSE
        ,PDO::ATTR_CASE => PDO::CASE_LOWER
        ,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ,PDO::ATTR_EMULATE_PREPARES => FALSE
        ,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ,PDO::ATTR_PERSISTENT => TRUE
        ,PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING
    )
);

if (!$connection->inTransaction()) $connection->beginTransaction();

$statement = $connection->prepare('INSERT INTO dms_devices (model_id, serial_no, name, status) VALUES (:model_id, :serial_no, :name, :status)');

foreach (array('model_id' => 1, 'serial_no' => 12219321, 'name' => 'Demo', 'status' => 'DSS_MANUFACTURED') as $name => $value) {
    $statement->bindValue(':'.$name, $value);
}

$statement->execute();

$connection->commit();

一旦我注释掉任何属性ATTR_EMULATE_PREPARESATTR_PERSISTENT,它就能正常运行。

我在我的开发机器上使用WampServer 2.4 64位(Apache 2.4.4,PHP 5.4.12,MySQL 5.6.12)。

任何建议什么是最好的解决方案(牢记我必须达到的目标)?

1 个答案:

答案 0 :(得分:0)

发现这已经注册PHP segmentation fault bug #61411

不幸的是,它仍未在5.4.12版中修复。