Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 循环中的查询执行时间过长_Php_Ajax_Database_Loops - Fatal编程技术网

Php 循环中的查询执行时间过长

Php 循环中的查询执行时间过长,php,ajax,database,loops,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']

我正在尝试用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 ));
        }
$groupId=$\u POST['group\u id'];
$Id\u数组=$\u POST['Id'];
$result_array=$_POST['result'];
$data=array();
如果(计数($_POST['data'])>0&&!空($_POST['data']){
foreach($_POST['data']作为$key=>$array){
$row=array();
$row['team_id']=intval($array['team_id']);
$row['Note']=strip_标签(trim(strval($array['Note']));
$data[$key]=$row;
}
对于($i=0;$iprepare(“更新团队设置结果=:结果,其中id=:id”);
foreach($key=>$array形式的数据){
$sql1->execute(数组(':result'=>$result':id'=>$id));
}
$sql2=$db->prepare(“更新团队集合注释=:注释,其中团队id=:团队id=:团队id=:团队id=:团队id”);
foreach($key=>$array形式的数据){
$sql2->execute(数组(':note'=>$array['note'],':teamid'=>$array['team\u id'],':group\u id'=>$groupId));
}
网络定时
我将使用事务,而不是在循环中自动提交。 所以

此外,由于要在execute函数中绑定变量,所以只需准备一条语句,因此请尝试将任何prepare语句排除在循环之外


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

您不需要此循环:

    foreach($data as $key => $array){
        $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 ));
    }
它重复更新相同的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){
        $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 ));
    }
for()
循环中,但它不使用每次通过循环时都会更改的任何变量。因此它对
$ID\u数组中的每个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 ));
    }
}

您可能需要对每个查询或循环进行一些计时和日志记录。您一次更新了多少行?第一个查询应该进行优化,因为您正在按id进行更新(我猜这是您的主键),但如果您没有团队id和组id的索引,则第二个可能会很慢。您能在不进行第二次查询的情况下执行此脚本吗?@Shujaat是的,它不会导致1次查询出现问题。@aynber我在第一次查询中为每个id更新1行,而在查询2中,它应该是多行stry移动
$sql1=$db->prepare
$sql2=$db->p在
for(){}
循环之外重新编写
语句。只需准备一次并执行多次。是的,通过删除
foreach($key=>data$array){}
时间缩短了,现在需要2到3秒的时间来执行。是否可以进一步改进?因此,首先你谴责我的评论,然后决定用它们来回答,tsk tsk tsk.Lol,老实说,idc,所以有一个upvote@MonkeyZeus我只是说把准备工作从循环中去掉是一个小小的改进,我从来没有谴责过你的任何其他人r评论。我甚至试图澄清其中一个。@KoiToHoga我更新了答案,以显示另一个改进,这可能是最大的改进。是的,谢谢Barmar。这对我帮助很大,现在更新不到一秒钟。