繁体   English   中英

使用PHP更新MySQL字段的问题

[英]Problem with updating a MySQL field with PHP

我有一个问题:

更新选项SET votes = votes + 1 WHERE choice_id ='$ user_choice'

但是当我在我的脚本中执行它时,投票字段会更新两次,所以投票将从4变为6而不是5。它似乎没有被调用两次,因为我回应了测试这个的东西而且只是得到一个回声。 有没有办法让它这样PHP只会在每页“刷新”时执行一次这个查询?

编辑 :感谢您的回复,我使用的是常规MySQL,没有MySQLi或PDO。 我发现的另一件事是,在进行查询时,当你从0开始并更新为1时它会起作用,但之后它会变为3,5,7,......

另一个选择是,如果您使用的是firefox并安装了firbug,则需要禁用缓存。 由于某种原因,firbug导致两次调用dB。 花了好几周的时间才弄清楚我在哪里工作,因为QA在测试时会得到各种奇怪的结果。 他是唯一一个有萤火虫的人。

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

这个答案是一种矫枉过正,但你可以通过启用mysql中的二进制日志来确保它被执行两次(记住,矫枉过正!)。 然后,您可以使用mysqllog工具查看这些文件,并查看查询是否执行了两次。

每个人都相信你的代码中的某个地方正在被查询两次:)我正在使用这样的查询,它的工作正常。 另一件事,我有一个PEAR_DB对象的包装类。 如果要求,它可以输出在呈现当前页面时使用的查询(以及时间戳+堆栈跟踪)。 我用它来查找重复的查询(如你的)和慢速更新。

首先,您需要进行正确的查询:

UPDATE `choices` SET `votes` = `votes` + 1 WHERE `choice_id` = '$user_choice'

此查询必须正常工作。 也许你在PHP代码中出错并且这个查询执行了两次?

您可能只需要在votes + 1周围加上括号,例如:

UPDATE choices SET votes = (votes + 1) WHERE choice_id = '$user_choice';

我也可以在最后加上一个LIMIT 1

另外,尝试在PHP之外运行查询,例如通过PHPMyAdmin? 另外,在运行之前尝试回显整个SQL ...您可能只是发现错误。

我刚刚创建了一个数据库表来测试这个查询,我必须说它运行正常。

UPDATE choices SET votes =(投票+1)WHERE choice_id ='1'

我认为代码可以在你的应用程序中执行两次,你可以尝试打印出正在运行的sql。 您还可以针对数据库本机运行输出的sql语句。

总而言之,sql语句很好,只需将应用程序脚本加倍。

我只是在这里猜测,但是这个代码可能会对页面上使用的每个资源执行一次吗? 因此,如果您有一个使用相同代码的图像或iframe,则两个资源都会执行一次,从而导致该字段被更新两次。

我上周刚刚在基于PDO的会话处理程序中使用了这个,我的测试计数器会触发两次,因为站点徽标也由php提供,我正在更新auto_prepend_file中的测试计数器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM