10

在一个服务器设置中,我遇到了非常奇怪的错误。有用于 MySQL 的带有 PDO 驱动程序的 PHP 5.3.6,客户端库版本 5.1.61。一切都是手工编译的。

当我用 bindValue 绑定参数并将第三个参数设置为 \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 台服务器上尝试过,但没有遇到此错误。此外,如果我将 '0' (作为字符串)传递给$stmt->bindValue(5, false, \PDO::PARAM_BOOL);它,它的效果也很好。

4

1 回答 1

16

我在使用 PHP 5.3.10 的 Ubuntu 上遇到了同样的问题。(有趣的是,在带有 wamp 的 Windows 上没有问题......)

实际上这是 pdo 中的一个已知错误:https ://bugs.php.net/bug.php?id=38546

我使用 PDO::PARAM_INT 而不是 PDO::PARAM_BOOL。它运行良好,您不必像上面那样将布尔值转换为字符串。

于 2013-01-28T07:26:05.720 回答