php运行一次并在mysql数据库中插入两次

时间:2011-02-20 07:50:00

标签: php mysql insert

我在下面有一个简单的代码。运行一次后,它会将结果两次插入到mysql数据库中。

如果它在页面上1次刷新时运行两次或请求两次基数,为什么输出只有1个结果?

我一直在谷歌上搜索,并努力解决这个问题。但是,我没有弄清楚这段代码有什么问题。代码在localhost上运行完美,但在将其移动到服务器后,问题会弹出。以前有人遇到过这样的事吗?如何解决这个问题?

完整代码

<?php
$db=mysql_connect('localhost','zzzzzzz','xxxxxx') or die('Unable to connect.'.mysql_error());
mysql_select_db('test',$db) or die(mysql_error($db));

$sql="INSERT INTO test_table(value,insert_time) VALUES ('testing','".time()."')";
$result=mysql_query($sql);
echo "result=".$result;

$select="select * from test_table";
$rs=mysql_query($select);
while($row=mysql_fetch_array($rs)){
echo $row["test_id"]." -- ".$row["value"]." -- ".$row["insert_time"]."<br />";
}
?>

RESULT
结果= 1个
    1 - 测试 - 1298185509

但数据库
test_id,value,insert_time
1,测试,1298185509
2,测试,1298185511

15 个答案:

答案 0 :(得分:14)

我面临着和你一样的问题,当我使用Opera或chrome时,这个问题才会出现。

对于我的情况,我有.htaccess指向索引文件的每一件事。当然,浏览器会两次请求脚本,一次是脚本,另一个是favicon。

修复: 尝试编辑.htaccess以防止在浏览器请求favicon.ico

时重定向到索引文件

答案 1 :(得分:2)

你看到了吗

$result = $db->query($query);

下一行:

if ($db->query($query) === TRUE) {

这意味着您运行查询两次。删除其中一个$db->query,例如:

$result = $db->query($query);
if ($result === TRUE) {    /* do stuff */

答案 2 :(得分:1)

正如您所提到的,当您在本地进行测试时不会出现问题,只有在您在服务器中部署时才会出现 - 我猜您的页面中有Google Adsense。 在这种情况下,adsense抓取工具会抓取您的网页(将第二个http请求发送到网址)

要避免这种情况,请在php文件的开头添加以下内容:

if(strpos($_SERVER['HTTP_USER_AGENT'],'Mediapartners-Google') !== false) {
        exit();
}

我在发送电子邮件的脚本中遇到过类似的问题。每个动作我收到了两封电子邮件:(

然后,我调查了服务器访问日志,并发现了该用户代理的每个操作的第二个请求......

答案 3 :(得分:1)

由于您可能混合GETPOST

,也可能会出现此问题

或者

您可能已经下载了在线模板,该模板可能在提交页面之前进行后台ajax调用。

请查看,如果您找到解决方案或有任何其他问题,请告诉我们。

答案 4 :(得分:1)

代码很好。

尝试更改浏览器。 如果仍然没有工作。

重启服务器 仍然没有

尝试在项目之外的另一个文件中编写单个脚本。

它会起作用。

我尝试将您的代码用于我的系统。

答案 5 :(得分:1)

我在Chrome浏览器上发生了此问题,并找到了两种解决方法;

  1. 您可以在表单上添加验证码控件。这样可以防止它运行两次并在SQL中输入额外的数据行。您可以从此处获取验证码;

click for Captcha information

  1. 通过在表单页面上启动会话来创建会话控件;

    $_SESSION['formzt']= 0;

然后在您的POST页面中,在插入之前使用“ if”语句;

if ($_SESSION['formzt']==0){

$sql="INSERT INTO members (user)
VALUES ('testini')";

if (mysqli_query($conn, $sql)) {
   echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

  $_SESSION['formzt']++;

 }

这将阻止它重新插入。

答案 6 :(得分:0)

好的,我知道这没有任何意义,但我解决了删除$.ajax({async:true}); 来自我的js文件。

答案 7 :(得分:0)

我的网站上遇到了同样的问题。调试后我找到了根本原因。这是Yandex Metrica js图书馆。它调用ajax请求到同一页面来计算加载时间和其他一些参数。

你使用它吗?如果没有打开chrome dev面板并查看http请求。可能是对favicon等的要求。

答案 8 :(得分:0)

有很多理由导致这种情况,因此我建议您使用最佳做法:

如果您要在数据库中创建新记录,则应使用 POST请求初始化逻辑。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // …
}

现在应该很容易避免非代码问题:.htaccess事,Firebug事,广告跟踪事......

答案 9 :(得分:0)

您的代码没有问题.Firebug或类似工具有时会发出双重请求。您页面中的度量标准脚本(yandex metrica,chartbeat等)也可以执行相同的操作。你应该检查这些情况。

要调试它,您可以记录插入请求,您可以检查它以找出错误。

如果您使用的是linux环境;

在代码中添加日志行:

error_log(print_r($_SERVER,true));

打开控制台窗口并键入(日志目录取决于您的服务器配置)

tail -f /var/log/apache/error.log

然后你可以调用你的插入页面。在每次请求时,您都可以看到发生了什么。

答案 10 :(得分:0)

我猜这个来自index.php的代码是所有请求的前端控制器 当浏览器抓取页面时,它通常也试图获取favicon.ico。如果缺少favicon,第二个请求将再次处理您的php文件。你可以检查一下 假设将$ _SESSION ['REQUEST_URI']写入DB。

我建议不要随时更改GET请求和研究Web服务器访问日志中的数据。

答案 11 :(得分:0)

您的代码似乎很好,应该是您正在使用的外部插件,每次都会发送第二个请求。

如果您使用的是谷歌浏览器,则很可能是由于此错误https://bugs.chromium.org/p/chromium/issues/detail?id=123121。此错误导致Chrome将每个请求重定向到index.php,因此PHP脚本将运行两次。

这可以使用以下代码修复,如网站所示。

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !favicon.ico
RewriteRule .* index.php [L]

您还可以使用debug_print_backtrace进行调试:http://php.net/debug_print_backtrace

  

debug_print_backtrace()打印PHP回溯。它打印函数调用,包含/必需文件和eval()ed。

或者,您可以使用SQL UNIQUE Constraint来防止首先插入重复的行。请访问http://www.w3schools.com/sql/sql_unique.asp了解更多信息。

只需注释:已弃用mysql(),请改用MySQLi

答案 12 :(得分:0)

Endy Jasmi的解决方案为我工作。这是我编辑.htaccess文件的方法。


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/ [L]
    </IfModule>

    # END WordPress

以前就像


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/index.php [L]
    </IfModule>

    # END WordPress

答案 13 :(得分:-1)

在标头html中尝试此解决方案。

<base href="/">

答案 14 :(得分:-3)

$result=mysql_query($sql); echo "result=".$result;

这是因为您运行mysql_query($sql)两次。试试吧,不要回复$result