我正在尝试使用Ajax和PHP更新数据。下面的脚本更新数据,但是要花费太多时间才能运行。 PHP
$groupId = $_POST['group_id'];
$Id_array = $_POST['Id'];
$result_array = $_POST['result'];
$data = array();
if(count($_POST['data']) > 0 && !empty ($_POST['data'])){
foreach($_POST['data'] as $key => $array){
$row = array();
$row['team_id'] = intval($array['team_id']);
$row['Note'] = strip_tags(trim(strval($array['Note'])));
$data[$key] = $row;
}
for ($i = 0; $i < count($Id_array); $i++) {
$Id = intval($Id_array[$i]);
$result = strip_tags(trim(strval($result_array[$i])));
$sql1 = $db->prepare("UPDATE teams SET result = :result WHERE id = :id ");
foreach($data as $key => $array){
$sql1 ->execute(array(':result' => $result, ':id' => $Id));
}
$sql2 = $db->prepare("UPDATE teams SET note = :note WHERE team_id = :teamid AND group_id = :group_id");
foreach($data as $key => $array){
$sql2->execute(array(':note' => $array['Note'], ':teamid' => $array['team_id'], ':group_id' => $groupId ));
}
答案 0 :(得分:3)
您不需要此循环:
foreach($data as $key => $array){
$sql1 ->execute(array(':result' => $result, ':id' => $Id));
}
由于$Id
在循环中没有更改,因此会重复更新相同的ID。只要做:
$sql1->execute(array(':result' => $result, ':id' => $Id));
一次。
您还可以通过以下操作获得一些小的改进:
$sql1 = $db->prepare("UPDATE teams SET result = :result WHERE id = :id ");
$sql2 = $db->prepare("UPDATE teams SET note = :note WHERE team_id = :teamid AND group_id = :group_id");
在任何循环之前,只需一次。
另一个问题是您有此循环:
foreach($data as $key => $array){
$sql2->execute(array(':note' => $array['Note'], ':teamid' => $array['team_id'], ':group_id' => $groupId ));
}
在for()
循环内,但是它不使用每次在循环中每次更改的变量。因此,它将为$Id_array
中的每个ID重新执行所有相同的查询。
将其带出循环。
所有这些更改之后,代码现在如下所示:
$groupId = $_POST['group_id'];
$Id_array = $_POST['Id'];
$result_array = $_POST['result'];
$sql1 = $db->prepare("UPDATE teams SET result = :result WHERE id = :id ");
$sql2 = $db->prepare("UPDATE teams SET note = :note WHERE team_id = :teamid AND group_id = :group_id");
$data = array();
if(count($_POST['data']) > 0 && !empty ($_POST['data'])){
foreach($_POST['data'] as $key => $array){
$row = array();
$row['team_id'] = intval($array['team_id']);
$row['Note'] = strip_tags(trim(strval($array['Note'])));
$data[$key] = $row;
}
foreach ($Id_array as $i => $Id) {
$Id = intval($Id);
$result = strip_tags(trim(strval($result_array[$i])));
$sql1 ->execute(array(':result' => $result, ':id' => $Id));
}
foreach($data as $key => $array){
$sql2->execute(array(':note' => $array['Note'], ':teamid' => $array['team_id'], ':group_id' => $groupId ));
}
}
答案 1 :(得分:-1)
我将使用事务而不是在循环中自动提交。 所以,
//PDO::beginTransaction ( void )
$dbh->beginTransaction();
foreach () {
$smt->exec();
}
//PDO::commit ( void )
$dbh->commit();
此外,由于将变量绑定到execute函数中,因此只需要一次准备一条语句,因此请尝试将所有prepare语句置于循环之外。
这应该有助于减少循环中查询的一些开销。