INSERT INTO调用一次但运行两次(不是循环)

时间:2013-03-21 06:05:44

标签: php mysql sql pdo

我有一个查询,每次遇到它,运行两次,这不是意图。我已将日志记录添加到文件之前和之后,并在运行脚本之前清除文件。

我认为我不需要发布其他代码,因为我相信我的日志记录证明此查询只被调用一次。

代码:

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,即使它被调用了两次,我的PDOErrors.txt文件也会显示每次运行的诊断数据,而不是。< / p>

第一个诊断数据运行到PDOErrors.txt,但第二个不会运行!

以下是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会包含两组诊断数据,如果没有的话。错误消息似乎是在空数据库表的第一次查询运行时生成的。有什么可能导致这个问题?

1 个答案:

答案 0 :(得分:2)

PDO-&gt;查询将执行查询并返回PDOStatement对象,现在您再次执行返回的PDOStatement,导致此错误。

使用PDO-&gt; prepare返回PDOStatement对象然后执行语句或只使用PDO-&gt;查询并且不执行PDOStatement