MySQL无法更新表中最后一行的最后一个单元格。

4

我正在使用PHP和MySQL。

MySQL无法更新我的表中的最后一个单元格。我不知道为什么。

基本上,我在数组上使用foreach()循环进行10次INSERT。在每个循环中,我使用以下代码:

$sql = "INSERT INTO table1 (name, address, phone, date_time, process_started, process_ended)
    VALUES
    ('$name', '$address', '$phone', NOW(), 'started', '')";
$result = @mysql_query($sql, $con) or die(mysql_error());

这很好;所有信息都插入到表中。

然后,当我回过头来更新“process_ended”字段时,前9行的更新都正常。但是第10行的“process_ended”单元格无法更新。

这是更新的代码。它不使用循环;我只是将其输入脚本中10次。

$sql = "UPDATE table1 SET process_ended = 'ended' WHERE name = '$name' && address = '$address'";
$result = @mysql_query($sql, $con) or die(mysql_error());

我已经检查过名称和地址单元格,确保与脚本中的匹配;它们是匹配的。我还三次检查了我的脚本,确保没有拼写错误。
我认为这与MySQL有关,因为当我交换更新的顺序时,总是最后一个单元格不能更新。我已经删除并重新创建了表格,并在cPanel中点击了修复DB按钮,它显示一切正常。

5
我怀疑这不是问题的原因,但 && 不是正常的 SQL 语法。你应该使用 AND 代替。 - wuputah
1
@wuputah 根据手册,在MySQL中确实是有效的,但你说得对,它通常不被使用。 - 46bit
尝试手动添加数据并在MySQL上手动运行最后一个查询(echo $sql以获取最后一个查询)并查看是否仍无法正常工作。 - 46bit
5
@mysql_query 中删除 @,你可能会收到来自 MySQL 的错误消息,告诉你出了什么问题。 - Mischa
没有错误,几乎不可能提供有意义的答案。 - Jake N
1
我尝试了你提出的所有建议,然后发现这是一个时间问题。更新开始在插入完成之前进行更新。恰好最后10个插入中总是有一个没有及时完成。 - Marcus
8个回答

1

也许 UPDATE 不允许更新空字符串。你试过用占位符代替 '' 吗?


1
两个循环:串行还是并行?如果循环独立,则在第二个循环开始之前检查第一个循环是否已完成。

0

这不可能是mySQL的问题。每天都会更新数十亿个表格,如果是这个bug引起的话,将会导致巨大的问题。请将您的更新语句更改为SELECT语句并查看结果,检查是否返回了重复的行。

$sql = "SELECT FROM table1 WHERE name = '$name' && address = '$address'";
$result = @mysql_query($sql, $con) or die(mysql_error());

问题很可能出在你的WHERE子句中,我猜你会发现你正在运行相同的语句两次。因此,更新语句会更新同一行两次。

无论你以什么顺序运行更新查询,都没有关系。因为它每次都在更新表中的相同行,因此当你列出行时,它看起来是相同的行没有被更新(实际上是)。它只是碰巧是最后一个,也可能是第一个或第七个。

可能是创建语句时复制粘贴错误。我经常这样做 :(

DC


0

在MySQL中,我总是发现找到这样的错误最好的方法是手动尝试。在屏幕上执行$sql行,然后通过PHPMyAdmin运行它并查看返回结果。

这应该可以帮助您确定问题所在。


0

通常我是这样调试的。

  1. 不执行你的查询
  2. 回显语句或将它们保存到文件中
  3. 分析它!在你的情况下,我认为最后一个语句中省略了process_ended
  4. 如果没有,请运行最后一个SQL语句。获取错误消息并在此处发布!

祝好运。


或者像mysql_affected_rows这样的精确函数也会有帮助。 - funwhilelost

0

我不太确定,但我曾遇到过类似的php数组问题。对我来说,它看起来像是php中的行尾字符,在插入之前只需trim()您的最后一个单元格值即可解决此问题。


0

PHP 数组从 0 开始计数。

如果你的脚本在某处从 1 开始计数,第一个或最后一个项目可能会消失。


0

不使用循环是不好的,不使用抽象化的insertitemtotable()类型函数也是不好的,从一开始正确设计你的东西,一旦你的基本函数被整理干净,你就再也看不到那种问题了。

此外,这将极大地帮助确保所有输入都得到正确转义等等。

毫无疑问,你手动键入和复制/粘贴更新两次第9项之类的代码存在问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接