3
$PDO_db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF-8' , DB_USER, DB_PWD);
$sth = $PDO_db->prepare($insert);   
$arrPar = array(':nome' =>  $nome);         
$r = $sth->execute($arrPar);    
var_dump($arrPar);
print_r($PDO_db->errorInfo());
var_dump($r);
exit();

$ insertステートメットにSQLエラーが含まれていると仮定します。上記のコードでは、次のことに気づきました。

  1. コードA

    print_r($PDO_db->errorInfo());
    

    とにかく出力します:

    Array (
        [0] => 00000
        [1] => 
        [2] => 
    )
    

    しかし、var_dump($ s)はfalseです

  2. 挿入ステートメントにいくつかのplacemark例があります:name

    "Insert into mytable (name) VALUE(:name);"
    

    そして$arrPar = array(':name' => $value)$value=NULL

    print_r($PDO_db->errorInfo());
    

    再び出力されます:

    Array
    (
        [0] => 00000
        [1] => 
        [2] => 
    )
    

    しかし、var_dump($ s)はfalseです

だから私は、エラーの説明を与えるはずのメソッドerrorInfoが静かにエラーを静める場合、PDOでMySQLステートメントをデバッグする正しい方法を知りたいと思っていますか?

PDO::errorInfo()エラー情報の配列を返します」

4

1 に答える 1

1

奇妙な...本当に何もイサートされていないのですか?成功した場合の MySQL のリターン コード0 であり、これerrorInfoが返されます。しかし、@ジャックが言ったように:

try
{
    $PDO_db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF-8' , DB_USER, DB_PWD);
    $PDO_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sth = $PDO_db->prepare($insert);
    echo 'Insert prepared<br/>';
    $arrPar = array(':nome' =>  $nome);//shouldn't this be :name?
    $r = $sth->execute($arrPar);
    echo 'Insert executed<br/>';
    var_dump($r);
}
catch(PDOException $pdoE)
{
    echo $pdoE->getMessage().'<br/>';
    var_dump($pdoE);
}
exit();//?

これにより、何が起こっているかについてより多くの手がかりが得られるはずです。var_dumpまた、あなたは a of$sが false であると (2 回) 述べていますが、execute 呼び出しの戻り値を$r... に代入しています':nome'
また、@Clarence のアドバイスを心に留め、php.ini エラー レポートを に設定します。E_ALL | E_STRICT最初は大量の警告が表示されるのが嫌かもしれませんが、コードをデプロイするときに発生する可能性がある (そしておそらく発生する可能性がある) 問題を回避できます。別のマシンを使用するか、PHP のバージョンをアップグレードします。とにかく、PHP が警告を修正するのに莫大な時間を費やすE_STRICTほど厳格な言語ではないということはありません...

于 2012-09-28T16:27:35.887 に答える