我在下面有一个简单的代码。运行一次后,它会将结果两次插入到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
答案 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)
由于您可能混合GET
和POST
或者
您可能已经下载了在线模板,该模板可能在提交页面之前进行后台ajax调用。
请查看,如果您找到解决方案或有任何其他问题,请告诉我们。
答案 4 :(得分:1)
代码很好。
尝试更改浏览器。 如果仍然没有工作。
重启服务器 仍然没有
尝试在项目之外的另一个文件中编写单个脚本。
它会起作用。
我尝试将您的代码用于我的系统。
答案 5 :(得分:1)
我在Chrome浏览器上发生了此问题,并找到了两种解决方法;
通过在表单页面上启动会话来创建会话控件;
$_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
。