我有一个问题:
更新选择SET votes = votes + 1 WHERE choice_id ='$ user_choice'
但是当我在我的脚本中执行它时,投票字段会更新两次,所以投票将从4变为6而不是5。它似乎没有被调用两次,因为我回应了测试的东西这只能得到一个回声。有没有办法让它这样PHP只会在每页“刷新”时执行一次这个查询?
编辑:感谢您的回复,我使用的是常规MySQL,没有MySQLi或PDO。我发现的另一件事是,在进行查询时,当你以0开始并更新为1时它会起作用,但之后它会变为3,5,7,......
答案 0 :(得分:4)
另一个选择是,如果您使用的是firefox并安装了firbug,则需要禁用缓存。由于某种原因,firbug导致两次调用dB。花了好几周的时间才弄清楚我在哪里工作,因为QA在测试时会得到各种奇怪的结果。他是唯一一个有萤火虫的人。
答案 1 :(得分:3)
PHP中有许多不同品牌的数据库有几个SQL接口。您没有显示用于执行查询的PHP代码,也没有确定您使用的数据库品牌。
在PHP的某些SQL接口中,创建语句会隐式执行SQL。然后你有机会获取结果(如果它是一个SELECT语句)。如果您的语句是SELECT或DELETE,则可能没有造成任何损害,尽管不必执行两次语句。但是,如果您的语句是INSERT或UPDATE,您可能会发现它已生效两次。
例如,使用PDO:
$pdo = new PDO(...options...);
$stmt = $pdo->query('UPDATE ...'); // executes once
$stmt->execute(); // executes a second time
答案 2 :(得分:1)
这个答案是一种矫枉过正,但你可以通过启用mysql中的二进制日志来确保它被执行两次(记住,矫枉过正!)。然后,您可以使用mysqllog工具查看这些文件,并查看查询是否已执行两次。
每个人都相信你的代码中的某个地方正在被查询两次:)我正在使用这样的查询并且它工作得很好。另一件事,我有一个PEAR_DB对象的包装类。如果要求,它可以输出在呈现当前页面时使用的查询(以及时间戳+堆栈跟踪)。我用它来查找重复的查询(比如你的)和慢速更新。
答案 3 :(得分:1)
首先,您需要进行正确的查询:
UPDATE `choices` SET `votes` = `votes` + 1 WHERE `choice_id` = '$user_choice'
此查询必须正常运行。也许你在PHP代码中出错并且这个查询执行了两次?
答案 4 :(得分:1)
您可能只需要在votes + 1
周围添加括号,例如:
UPDATE choices SET votes = (votes + 1) WHERE choice_id = '$user_choice';
我最后也可能会加LIMIT 1
。
另外,尝试在PHP之外运行查询,例如通过PHPMyAdmin?另外,在运行它之前尝试回显整个SQL ...你可能只是发现错误。
答案 5 :(得分:0)
我刚刚创建了一个数据库表来测试这个查询,我必须说它在我身边运行正常。
更新
choices
设置votes
=(投票+1)WHEREchoice_id
='1'
我认为代码可以在你的应用程序中执行两次,你可以尝试打印出sql 因为它正在运行。您还可以针对数据库本机运行输出的sql语句。
总而言之,sql语句很好,只需将应用程序脚本加倍。
答案 6 :(得分:0)
我只是在这里猜测但是这个代码可能会对页面上使用的每个资源执行一次吗?因此,如果您有一个使用相同代码的图像或iframe,则两个资源都会执行一次,从而导致该字段被更新两次。
我上周在基于PDO的会话处理程序中有这个,我的测试计数器会激活两次,因为站点徽标也由php提供,我正在更新auto_prepend_file中的测试计数器。