1

クエリが発生するたびに 2 回実行されるクエリがありますが、これは意図したものではありません。ファイルの前後にログを追加し、スクリプトを実行する前にファイルをクリアしました。

私のロギングは、このクエリが一度だけ呼び出されたことを証明していると信じているので、他のコードを投稿する必要はないと思います。

コード:

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt',
    "\n\nImmediately before ban query 1. ".date('r ')." (1)",
    FILE_APPEND);

$sth=$Mdbh->query("
    INSERT INTO
        banned_IP
    SET
        ip_add      = '$ip',
        proxy_ip    = '$proxy_ip'
");
$sth->execute();

file_put_contents(
    $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt',
    "\n\nBanned the user using query1. ".date('r ')." (2)",
    FILE_APPEND);

return 999;

return実行直後にもあることに注意してください。2回呼び出された場合でも、PDOErrors.txtファイルには実行ごとの診断データが表示されますが、表示されません。

最初の診断データはPDOErrors.txt実行されますが、2 番目の診断データは実行されません!

PDOErrors.txt のコピーを次に示します。

Immediately before ban query 1. Thu, 21 Mar 2013 13:38:56 +0800  (1)

exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '127.0.0.1' for key 'ip_add'' in /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper/public/includes/classes/loginAttempt.class.php:137
Stack trace:
#0 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/loginAttempt.class.php(137): PDOStatement->execute()
#1 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/includes/classes/login.class.php(980): loginAttempt->recordLoginAttempt(Array)
#2 /home/peter/Documents/websites/Our_websites/bookkeeper/books.bookkeeper.ph/public/ajax/login.user.php(25): Login->doLogin(Array)
#3 {main}

banned_IP毎回実行する前に、データベース テーブルを完全に空にすることに注意してください。

これは開発環境であり、クエリのログを以下に示すため、すべてのクエリもログに記録しています。

708 Query     INSERT INTO
                        banned_IP
              SET
                        ip_add          = '127.0.0.1',
                        proxy_ip        = ''

708 Query     INSERT INTO
                        banned_IP
              SET
                        ip_add          = '127.0.0.1',
                        proxy_ip        = ''
708 Quit

PDOErrors.txt には 2 セットの診断データが含まれているため、クエリが 1 回だけ呼び出されていることに満足していると思います。エラー メッセージは、空のデータベース テーブルでクエリを最初に実行したときに生成されたようです。何が原因でしょうか?

4

1 に答える 1

2

PDO->query はクエリを実行して PDOStatement オブジェクトを返しますが、返された PDOStatement を再度実行すると、このエラーが発生します。

PDOStatement オブジェクトを返す PDO->prepare を使用してステートメントを実行するか、単に PDO->query を使用して PDOStatement を実行しないでください

于 2013-03-25T11:57:38.163 に答える