10

あるサーバーのセットアップで、非常に奇妙なエラーが発生しました。PDO Driver for MySQL、クライアント ライブラリ バージョン 5.1.61 を備えた PHP 5.3.6 があります。すべてが手作業でコンパイルされます。

params を bindValue にバインドし、3 番目のパラメーターを \PDO::PARAM_BOOL に設定すると、ステートメントが return false を実行し、何も起こりません (MySQL にデータが挿入されず、例外もまったくありません)。3番目のパラメーターを使用しないとうまくいきます。実際、3 番目のパラメーターを省略することはできません。パラメーターの変換中に 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

PHP5.3.10のUbuntuでも同じ問題が発生しました。(興味深いことに、wampのあるウィンドウでは問題はありませんでした...)

実際、これはpdoの既知のバグです:https ://bugs.php.net/bug.php?id = 38546

PDO::PARAM_BOOLの代わりにPDO::PARAM_INTを使用します。これはうまく機能し、ブール値を上記のように文字列に変換する必要はありません。

于 2013-01-28T07:26:05.720 に答える