在一个服务器设置中,我遇到了非常奇怪的错误。有用于MySQL的PDO驱动程序的PHP 5.3.6,客户端库版本5.1.61。一切都是手工编制的。
当我使用bindValue绑定params并将第三个参数设置为\ PDO :: PARAM_BOOL时,语句执行返回false并且没有任何反应(没有数据插入MySQL,甚至根本没有例外)。当我不使用第三个参数时,它很顺利。事实上我不能省略第三个参数,培养Doctrine2 DBAL在转换参数时设置它......
这是代码:
<?php
$pdo = new \PDO('mysql:host=***;dbname=***', '***', '***'); // hidden DB access
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('insert into outage (name, description, start_at, end_at, is_exception, extranet_id) values (?,?,?,?,?,?)');
$stmt->bindValue(1, 'Test name', \PDO::PARAM_STR);
$stmt->bindValue(2, 'Test desc', \PDO::PARAM_STR);
$stmt->bindValue(3, '2012-01-01 00:00:00', \PDO::PARAM_STR);
$stmt->bindValue(4, null, \PDO::PARAM_NULL);
$stmt->bindValue(5, false, \PDO::PARAM_BOOL);
$stmt->bindValue(6, 2, \PDO::PARAM_INT);
var_dump(array('stmt result' => ($result = $stmt->execute()), 'last insert id' => $pdo->lastInsertId(), 'stmt err code' => $stmt->errorCode(), 'pdo err code' => $pdo->errorCode()));
结果:
array(4) {
["stmt result"]=>
bool(false)
["last insert id"]=>
string(1) "0"
["stmt err code"]=>
string(5) "00000"
["pdo err code"]=>
string(5) "00000"
}
可能出现什么问题?我已经在其他4台服务器上试过了,但没有得到这个bug。此外,如果我将'0'(作为字符串)传递给$stmt->bindValue(5, false, \PDO::PARAM_BOOL);
,它的效果很好。
答案 0 :(得分:13)
我在使用PHP 5.3.10的Ubuntu上遇到了同样的问题。 (有趣的是,窗户上没有问题......)
实际上它是pdo中的已知错误:https://bugs.php.net/bug.php?id=38546
我使用PDO :: PARAM_INT而不是PDO :: PARAM_BOOL。它运行良好,你不必将布尔值转换成上面的字符串。