2017-10-03 14 views
0

ここでは無効なSQLがありますが、エラーが予想されますが、PDOエラーは常に00000と思われます。不正なPDOクエリを実行してもエラーが発生しない

<?php 
run('select now()'); 
run('pls give me an error'); 

function run($sql) { 
    $pdo = new PDO('mysql:host=localhost;db=mydb', $user, $pass); 
    echo $sql . "<br>"; 
    $sth = $pdo->prepare($sql); 
    $sth->execute(); 
    $row = $sth->fetch(PDO::FETCH_ASSOC); 
    print_r($row); 
    print_r($pdo->errorInfo()); 
} 

そして、ここでの結果である:

select now() 
Array 
(
    [now()] => 2017-10-03 02:58:09 
) 
Array 
(
    [0] => 00000 
    [1] => 
    [2] => 
) 
pls give me an error 
Array 
(
    [0] => 00000 
    [1] => 
    [2] => 
) 

しかし、私は同じデシベルに対して別のページを実行していると、このエラーが発生します。

更新

Err 1064: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'please give me an error' at line 1

他のページは実際にはfを使用してエラーを生成することができますollowing:PDOはない正直にものを、エミュレートするように設定されているデフォルトで

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

構文的またはその他の方法で間違って準備された文の場合
$sth = $pdo->query($sql); 
print_r($pdo->errorInfo()); 

答えて

1

は、あなたが準備された文のエミュレーションを無効にする必要がスローします感知してください。

エミュレートされた準備が無効にされているPDO::prepare()メソッドは、プリペアドステートメントを保持する一時的なサーバー側オブジェクトを作成して実行します。

さらにあなたはそれが予期しないクエリの失敗を処理しないように難しくなってそのように、PDOの例外を有効にすることができます:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

参考文献:

+0

あなたのエラーメッセージ最初のクラスがあります。)(準備にエラーがある場合、私はキャッチする必要があります私はこの前にこのような状況があったことはありませんでした。同じデータベースで2ページ実行していましたが、dbの設定はすべてデフォルトと同じです。なぜ1つのページには常にエラーはありませんか? – SIDU

+0

@SIDU私はあなたの質問に従っているか分からない。これはPDO構成であり、データベースの構成ではありません。 – zerkms

+0

感謝の気持ち!先週のデフォルトのPDO設定が変更されたかどうか疑問に思っていますか? – SIDU

0

ノーましたなぜerrorInfo()が動作しないのか、私は彼の動作を確認します。

エラーモードを例外に設定すると、常にが動作し、例外が手動エラーチェックよりもはるかに便利であるとすれば、この機能は役に立ちません。だから、

、このよう

function run($pdo, $sql, $params = null) { 
    $sth = $pdo->prepare($sql); 
    $sth->execute($params); 
    return $stmt; 
} 

$pdo = new PDO('mysql:host=localhost;db=mydb', $user, $pass); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

run($pdo, 'select now()'); 
run($pdo, 'pls give me an error'); 

あなたの機能を変更し、あなたの方法に従って行った場合、うまく

+0

"異常な"動作は、 'PDOStatement :: fetch'がSQL-92標準に準拠していないという事実に由来します。 [note of terry](http://php.net/manual/en/pdostatement.fetch.php#62536)は、私がこの情報を見つけたWeb上の唯一の場所です。しかし、それは空のレコードセットに関してです。それは "_..."でなければならず、** FALSE **を呼び出し元に返します。 "重要な部分は: "これはまた、例外メカニズムが発射されるのを防ぎます。" –

+0

とにかく、この動作は 'fetch()'の場合にのみ観測され、 'fetchAll()'、 'query()'などとは異なります。 '' fetch() '私が思い出したように、いくつかのテストケースでは、エラーコードは実際には予期せず「00000」のままでした。 –

関連する問題