Php 插入一次被调用但运行两次(不是在循环中)

Php 插入一次被调用但运行两次(不是在循环中),php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有一个查询,每次遇到它时,它都会运行两次,这是无意的。我在文件前后添加了日志记录,并在运行脚本之前清除了该文件 我不认为我需要发布其他代码,因为我相信我的日志记录证明这个查询只被调用一次 守则: file_put_contents( $_SERVER['DOCUMENT_ROOT'].'/PDOErrors.txt', "\n\nImmediately before ban query 1. ".date('r ')." (1)", FILE_APPEND); $st

我有一个查询,每次遇到它时,它都会运行两次,这是无意的。我在文件前后添加了日志记录,并在运行脚本之前清除了该文件

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

守则:

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;
请注意,在运行后也会有一个
返回
,即使调用了两次,我的
PDOErrors.txt
文件也会显示每次运行的诊断数据,但它不会

进入
pdorerrors.txt
的第一个诊断数据将运行,但第二个诊断数据永远不会运行

这是pdorerrors.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}
我应该提到的是,在每次运行之前,我完全清空了
banked_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将包含两组诊断数据(如果不是的话)。错误消息似乎是在第一次运行空数据库表上的查询时生成的。请问是什么原因导致此错误?

PDO->query将执行一个查询并返回PDOStatement对象,现在您再次执行返回的PDOStatement,这将导致此错误


使用PDO->prepare返回PDOStatement对象,然后执行语句,或者只使用PDO->query不执行PDOStatement

我曾经遇到过类似的问题,我的页面上有一个脚本,它正在加载基于可见图像的滑块图像,每个图像都有一个新的请求,由于我的URL重写,所有内容都指向我的
index.php
,然后被加载。我希望这个技巧可以帮助你,因为我不确定你的系统到底出了什么故障。谢谢@MahanGM,我不确定这是否适用于我的情况。根据Firebug,只发送了一个http请求,但感谢你的输入。我找到了一个解决方法。数据库表的
ip_add
索引为unique,但是当我添加了一个带有自动递增值的
id
列时,它突然不再出错,尽管它仍然输入了两次。我想这一定是MySQL中的一个bug,因为如果脚本多次运行,PDOErrors.txt就会显示出来。我想这项工作对我来说已经足够了,因为这是一个很少运行的过程。你到底为什么要在insert命令中使用
SET
<代码>插入表(列、名称)值(“列”、“值”)或执行更新:
更新表集列=“列”,名称=“值”,其中something=“this”