繁体   English   中英

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

[英]PHP: update multiple table rows with one query

有一个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,并且查询次数越多,脚本超时的机会就越大。 我仍然找不到解决此问题的方法,请帮忙!

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

是否为“ ID”建立索引? 如果没有,请在ID上创建索引并尝试。

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

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

...但是这些查询非常简单,我不知道您会看到什么。 我会参考@jmm的建议,并检查ID是否被索引以及它是什么数据类型。 另外,此表中有几行? 这个数字最近改变了吗?

最后,如果相同的查询以前曾起作用,但现在却引起麻烦,则还应该考虑外部更改。 服务器最近更改了吗? 或多或少的RAM? 更改MySQL或PHP配置? 也许这种情况可能是由MySQL内存设置或PHP max执行设置引起的。

我在您的代码中看到了一些东西,

首先在查询中,如果$ i的数据类型是整数(如果我将其作为主键,则不需要),则不需要在$ 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;
}  

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

暂无
暂无

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

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