2012-04-20 5 views
7

あるサーバーの設定で、私は非常に奇妙なエラーが発生します。 MySQL用PDOドライバ付きPHP 5.3.6、クライアントライブラリバージョン5.1.61があります。すべてが手でまとめられています。PDO bindValue with PDO :: PARAM_BOOL原因文の実行が自動的に失敗する

私はbindValueでパラメータをバインドし、\ PDO :: PARAM_BOOLとして3番目のパラメータを設定すると、statementはreturn falseとなり、何も起こりません(MySQLにデータが挿入されず、例外もありません)。 3番目のパラメータを使用しないとうまくいく。実際、私は三番目のパラメータをOMMITことができないパラメータを変換しながら、bacues 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台のサーバーで試してみましたが、このバグはありませんでした。また、私は$stmt->bindValue(5, false, \PDO::PARAM_BOOL);に(文字列として) '0'を渡す場合、それは良い作品です。

+0

問題なく、このサーバー上でPHP 5.3.10で問題が解決されました(Red Hat 5.4) –

答えて

12

PHP 5.3.10でUbuntuで同じ問題が発生しました。 https://bugs.php.net/bug.php?id=38546

私はPDOを使用:: PARAM_INT代わりにPDO ::のPARAM_BOOL:

は、実際には、PDOの既知のバグです(興味深いことに何ら問題は... WAMPと窓の上にありませんでした)。それはうまく動作し、上記のようにブール値を文字列に変換する必要はありません。

関連する問題