29

誰もが理由を説明できますか

$sql->execute($params);

を返しますがFALSE

print $pdo->errorCode();
print_r($pdo->errorInfo());

両方とも戻りSQLSTATE 00000ます。つまり、ドキュメントの成功によると?それはであり、INSERT実際には何もデータベースに挿入されていません...それで、なぜ私はから成功メッセージを受け取るのSQLSTATEですか?


それが役立つ場合は、これがコードです...

$sql = $pdo->prepare("
        INSERT INTO user (
            username, fname, pass, salt, email,
            loc_id_home, country_id_home, region_id_home,
            cont_id_home, timestamp_reg, timestamp_upd, timestamp_lastonline, 
            online_status, gender, birthdate
            )
        VALUES (
            :username,:fname,:pass,:random_salt,:email,
            :loc_id_home,:country_id_home,:region_id_home,
            :cont_id_home,'".time()."','".time()."','".time()."',
            1,:gender,:birthdate)
        ");

$params=array(
    ':username'=>$username,
    ':fname'=>$fname,
    ':pass'=>$pass,
    ':random_salt'=>$random_salt,
    ':email'=>$email,
    ':loc_id_home'=>$loc_id_home,
    ':country_id_home'=>$country,
    ':region_id_home'=>$region,
    ':cont_id_home'=>$continent,
    ':gender'=>$gender,
    ':birthdate'=>$birthdate
);  

$sql->execute($params);

print $pdo->errorCode();
print_r($pdo->errorInfo());
4

5 に答える 5

20

これは、$pdo->errorInfo()正常に実行された最後のステートメントを参照しているためです。falseを返すため$sql->execute()、そのステートメントを参照することはできません(何も参照しないか、以前のクエリを参照することはできません)。

なぜ$sql->execute()falseが返されるのか、わかりません...$params配列またはデータベース接続に問題があります。

PDO :: errorCode —データベースハンドルの最後の操作に関連付けられたSQLSTATEをフェッチします

注:PHPマニュアル(http://php.net/manual/en/pdo.errorinfo.php)では、「データベースハンドルの最後の操作」の意味が正確に定義されていませんが、バインディングパラメーターに問題があった場合は、エラーは、PDO内で、データベースとの対話なしで発生していました。$pdo->execute()が返された場合true、それ$pdo->errorInfo()は有効であると言っても過言ではありません。$pdo->execute()を返す場合false、の動作は$pdo->errorInfo()ドキュメントから明示的に明確ではありません。私の経験から正しく思い出せば、実行は戻り値を返しますtrue。MySQLがエラーを返したとしてfalseも、操作が行われなかった場合は戻ります。ドキュメントは特定されていないため、dbドライバー固有である可能性があります。

この回答は、2012年9月に作成された時点での実際の経験を反映しています。ユーザーが指摘しているように、ドキュメントはこの解釈を明示的に再確認していません。また、特定のデータベースドライバの実装のみを反映している場合もありますが、が$pdo->execute()返された場合true、それ$pdo->errorInfo()は有効であることが常に当てはまります。

接続シーケンスでPDO::ERRMODE_EXCEPTIONを設定することもできます。例外処理により、エラーのチェックとクエリが不要になります。

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
于 2012-09-15T15:32:47.500 に答える
1

私は同様の問題に直面しました、

これはクエリのエラーが原因で発生します。php-myadmin またはその他のクエリランナーでクエリを実行して、クエリが正常に機能していることを確認してください。クエリ構文が正しい場合でも、テーブル構造でnullを残したり、列をmentioanしないなど、他の単純なエラーが発生すると、このエラーが発生します(これは私が作成したエラーでした)

user1122069が説明したように、$ pdo-> errorInfo()の理由は、何も問題がないことが原因である可能性があると述べています

$ pdo-> errorInfo()は、正常に実行された最後のステートメントを参照します。
$ sql-> execute()はfalseを返すため、そのステートメントを参照することはできません(何も参照しないか、以前のクエリを参照する)。

これがお役に立てば幸いです:)

于 2012-09-27T16:34:20.723 に答える
1

PHPマニュアルから:

PDO :: ERR_NONE(文字列)SQLSTATE '00000'に対応します。これは、SQLステートメントがエラーや警告なしで正常に発行されたことを意味します。この定数は、PDO :: errorCode()またはPDOStatement :: errorCode()をチェックして、エラーが発生したかどうかを判断するときに便利です。とにかくエラー条件を発生させたメソッドからの戻りコードを調べることで、通常、これが当てはまるかどうかがわかります。

つまり、レコードを挿入したように聞こえます。テーブルの最後のレコードIDを確認してください...たぶんあなたはそれを見逃しましたか?

于 2012-10-24T23:45:01.957 に答える
0

一度にこのエラーが発生していました。私はすべての失敗のために1つのサーバーでそれを手に入れました。別のサーバーは、同じエラーに対してエラーを正しく報告します。それは私にそれがMySQLクライアント構成エラーであると信じさせました。特定のエラーを解決したことはありませんが、構成を確認してください。

于 2012-10-04T04:01:39.950 に答える
-1

print_r()で$ sqlを確認し、クエリをコピーしてから、phpMyadminで結果のクエリを試してください。希望が理由を得るでしょう。無関係な価値の可能性があります。

于 2012-10-18T10:14:27.090 に答える