PHP:使用一个查询更新多个表行

时间:2011-01-25 19:26:58

标签: php mysql

使用PHP脚本更新表中的所有行。在我看来,似乎没有太多数据被传递。直到大约两周前,当我开始在提交时收到“连接重置”错误时,我对脚本没有任何问题。我玩了一点脚本,但我找不到加快速度的方法。

for ($i = 1; $i <= 360; $i++) {
  $info  = mysql_real_escape_string($_POST[$i]);
  $check = mysql_real_escape_string($_POST[''.$i.'Check']);

  mysql_query("UPDATE $table SET info = '$info', status = '$check' WHERE ID = '$i'")
    or die (mysql_error());
}

我真的不知道导致错误的是什么。它长期没有问题。我知道它有很多更新,但我确信存在更大的脚本。此脚本也会在某些时候完美地完成。当它工作时,脚本在大约2-3秒内执行,这就是为什么我不确定这个脚本是否真的导致错误。

谢谢!

编辑 - 我玩过并确定问题肯定是我运行的查询数量。如果我将循环切换到($i - 1; $i <= 5; $i++),则每次都没有重置时脚本正确执行。我将循环向上移回360并且该数字越高,查询越多,并且看起来脚本超时的可能性越大。我仍然无法找到解决这个问题的方法,请帮忙!

4 个答案:

答案 0 :(得分:1)

如果必须在一系列记录中输入相同的值,
然后BETWEEN startingRecordID AND endingRecordID
可用于使用单个查询更新多个记录 (从而减少查询总数)。

答案 1 :(得分:0)

是否已将“ID”编入索引?如果没有在ID上创建索引并尝试它。

答案 2 :(得分:0)

您可以在类似的SELECT查询上运行EXPLAIN,看看发生了什么:

EXPLAIN $table WHERE ID = '1';
EXPLAIN $table WHERE ID = '360';
...

...但这些是如此简单的查询,我不知道你会看到什么。我会查看@ jmm的建议并检查ID是否已编入索引,以及它是什么数据类型。此外,此表中有多少行?这个号码最近有变化吗?

最后,如果相同的查询之前有效,但现在会造成麻烦,您还应该查看外部更改。服务器最近有变化吗?或多或少RAM?对MySQL或PHP配置的更改?也许这样的事情可能是由MySQL内存设置或PHP最大执行设置引起的。

答案 3 :(得分:0)

我在您的代码中看到了一些内容,

首先在查询中,如果它的数据类型是一个整数,你不需要$ i周围的引号,我认为它是主键。

你的第二个帖子变量

  

$ _ POST [ ''。$ i.'Check']

不确定为什么在$ i前面有第一组单引号

在您的查询中,您有

  

$表

是一个正在改变的变量?您是否在不同的表上执行此查询?

我会回复查询,看看它是什么样的。

$query = "UPDATE $table SET info = '$info', status = '$check' WHERE ID = '$i'";
echo $query;

我经常使用mysqli-MySQL改进扩展和多次执行相同查询时的预处理语句。这看起来像这样。

$conn = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); //creates resource link
//create query
$query = "UPDATE table SET info = '?', status = '?' WHERE ID = ?"
// now create the statement
$stmt = $conn->prepare($query);
// check for an error when creating statement
echo $conn-error;
//now bind variables to the ?
// i for integers, s for strings, d for decimals
$stmt->bind_param('ssi', $info, $check, $i);
// checking for errors every step when testing
echo $stmt->error;

// now run the loop
for ($i = 1; $i <= 360; $i++) {
  $info  = mysql_real_escape_string($_POST[$i]);
  $check = mysql_real_escape_string($_POST[''.$i.'Check']);

  $stmt->execute();
  echo $stmt->error;
}  

这应该更快,因为不必在每个循环上处理查询。