誰かが理由を説明できますか
$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());
$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 );
私は同様の問題に直面しました、
これはクエリのエラーが原因で発生しますphp-myadminでクエリを実行または他のクエリランナーとconfirmクエリは機能しています結構です。
クエリ構文が正しい場合でも、nullを残したり、テーブル構造でnullとして設定されていない列をメンションしないなど、他の単純なエラーがこのエラーの原因になります(これは私が作成したエラーです)。
User1122069が$ pdo-> errorInfo()の理由を説明したように、何も問題はないと考えられます
$ pdo-> errorInfo()は、正常に実行された最後のステートメントを参照します。
$ sql-> execute()はfalseを返すため、そのステートメントを参照することはできません(何も参照しないか、以前のクエリを参照することはできません)
これが役に立てば幸い:)
PHPマニュアルから:
PDO :: ERR_NONE(文字列)SQLSTATE '00000'に対応します。これは、SQLステートメントがエラーや警告なしで正常に発行されたことを意味します。この定数は、PDO :: errorCode()またはPDOStatement :: errorCode()をチェックしてエラーが発生したかどうかを判断するときに便利です。いずれにせよ、エラー状態を引き起こしたメソッドからの戻りコードを調べることによって、これが当てはまるかどうか通常はわかります。
したがって、レコードを挿入したように思えます。テーブルの最後のレコードIDを確認してください。
一度にこのエラーが発生しました。すべての障害に対して1つのサーバーでのみ取得しました。別のサーバーが同じエラーに対してエラーを正しく報告します。そのため、MySQLクライアントの設定エラーであると思いました。特定のエラーを解決したことはありませんが、構成を確認してください。