web-dev-qa-db-ja.com

PDO SQL状態 "00000"でもエラーが発生しますか?

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

$sql->execute($params);

FALSEを返しますが、

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

どちらもSQLSTATE00000を返します。これは、ドキュメントの成功によれば、これは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());
26
Chris

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

$sql->execute()がfalseを返す理由については、わかりません... $params配列またはデータベース接続に問題があります。

PDO :: errorCode —データベースハンドルの最後の操作に関連付けられているSQLSTATEを取得する

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

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

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

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
16
user1122069

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

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

User1122069が$ pdo-> errorInfo()の理由を説明したように、何も問題はないと考えられます

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

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

1
Renjith K N

PHPマニュアルから:

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

したがって、レコードを挿入したように思えます。テーブルの最後のレコードIDを確認してください。

1
Diego Saa

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

0
Matthew