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

PHP:使用一个查询更新多个表行,php,mysql,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("UP

使用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());
}

for($i=1;$i是否为“ID”编制了索引?如果没有,请在ID上创建索引并重试。

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

EXPLAIN $table WHERE ID = '1';
EXPLAIN $table WHERE ID = '360';
...
…但这些都是非常简单的查询,我不知道您会看到什么。我会参考@jmm的建议,检查ID是否被索引,以及它是什么数据类型。此外,这个表中有多少行?这个数字最近有变化吗


最后,如果相同的查询以前工作过,但现在出现了问题,那么您还应该查看外部更改。服务器最近有没有更改?内存多少?MySQL或PHP配置的更改?可能是MySQL内存设置或PHP max execution设置造成的。

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

首先,在查询中,如果$i的数据类型是整数,则不需要在$i周围加引号,如果它是主键,则假定它是整数

在第二个post变量中

$\u POST[''.$i.“检查”]

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

在你的查询中,你有

$table

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

我会回显这个查询,看看它是什么样子

$query = "UPDATE $table SET info = '$info', status = '$check' WHERE ID = '$i'";
echo $query;
在多次执行相同的查询时,我总是使用mysqli-MySQL改进扩展和prepared语句

$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;
}  
$conn=newmysqli('localhost','my_user','my_password','my_db');//创建资源链接
//创建查询
$query=“更新表集信息='?',状态='?',其中ID=?”
//现在创建语句
$stmt=$conn->prepare($query);
//在创建语句时检查错误
echo$conn错误;
//现在将变量绑定到?
//i代表整数,s代表字符串,d代表小数
$stmt->bind_参数('ssi',$info,$check,$i);
//测试时每一步都要检查错误
echo$stmt->错误;
//现在运行循环
对于($i=1;$i execute();
echo$stmt->错误;
}  

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

如果必须在一系列记录中输入相同的值,
然后在startingRecordID和endingRecordID之间执行

可用于使用单个查询更新多个记录

(从而减少了查询的总数)。

我非常感谢您的帮助,我以前从未使用过mysli(尽管我以前见过它,也不太了解它的语法)但是,即使使用这种方法,我仍然会遇到不稳定的处理速度。它似乎与我以前的脚本一样有效。我将假设问题与托管服务有关,而不是与脚本本身有关(尽管脚本显然不完美)你的脚本前后是什么样子的。我只是觉得问题出在其他地方。你用来连接数据库的代码是什么样子的?前后还有其他查询吗?在循环中放入一些echo语句,看看它运行了多少次而没有问题。