Запросы в цикле занимают слишком много времени для выполнения - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь обновить данные с помощью 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 голосов
/ 24 августа 2018

Вам не нужен этот цикл:

    foreach($data as $key => $array){
        $sql1 ->execute(array(':result' => $result, ':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.

. Извлеките его из цикла.

Со всеми этими изменениями код теперь выглядит следующим образом:

$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 ));
    }
}
0 голосов
/ 24 августа 2018

Я бы использовал транзакцию вместо автоматической фиксации в цикле. Таким образом,

//PDO::beginTransaction ( void )
$dbh->beginTransaction();
foreach () {
    $smt->exec();
}
//PDO::commit ( void )
$dbh->commit();

Кроме того, вам нужно подготовить оператор только один раз, так как вы связываете свои переменные в функции execute, поэтому старайтесь не допускать в цикл любых подготовительных операторов.

Это должно помочь с некоторыми издержками запроса в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...