循环查询需要太多时间才能执行

时间:2018-08-24 17:57:49

标签: php ajax database loops

我正在尝试使用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 ));
        }

网络计时 enter image description here

2 个答案:

答案 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语句置于循环之外。

这应该有助于减少循环中查询的一些开销。