Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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 在关联数组上循环时优化SQL更新_Php_Mysql - Fatal编程技术网

Php 在关联数组上循环时优化SQL更新

Php 在关联数组上循环时优化SQL更新,php,mysql,Php,Mysql,我正在迭代一个具有键值对的关联数组。在循环中有一个SQL更新、SQL选择和另一个更新。是否可以将两个或所有这些语句组合在一个语句中以减少执行时间?简而言之:foreach是通过给定的点数循环给玩家的。它应该将这些点添加到点表中。然后,它将计算玩家当前的总积分,并将foreach的新积分值添加到该总积分中。然后,它应该更新球员的总分 这段代码确实有效,并且给出了正确的结果,但是当有很多玩家时,只需要运行很长时间。它给了我12秒的总执行时间来运行这个脚本,到目前为止只有800名玩家 foreach(

我正在迭代一个具有键值对的关联数组。在循环中有一个SQL更新、SQL选择和另一个更新。是否可以将两个或所有这些语句组合在一个语句中以减少执行时间?简而言之:foreach是通过给定的点数循环给玩家的。它应该将这些点添加到点表中。然后,它将计算玩家当前的总积分,并将foreach的新积分值添加到该总积分中。然后,它应该更新球员的总分

这段代码确实有效,并且给出了正确的结果,但是当有很多玩家时,只需要运行很长时间。它给了我12秒的总执行时间来运行这个脚本,到目前为止只有800名玩家

foreach($arrPoints as $key => $value)
{
    $sqlUpdatePoints = "UPDATE tblPoints SET Points = '$value' WHERE Game='FPS' AND PlayerId ='$key' AND Gamenumber = 2";

    $PointsBefore=0;$PointsAfter=0;
    $sqlReadPoints = "SELECT TotalPointsBefore, TotalPointsAfter FROM tblplayer WHERE Id=$key";
    $parameters=array('');
    $resultReadPoints = dataQuery($sqlReadPoints,$parameters);
    foreach($resultReadPoints AS $rowRP)
    {
        $PointsBefore= $rowRP['TotalPointsBefore'];
        $PointsAfter= $rowRP['TotalPointsAfter'];
    }
    $NewTotalBefore= $PointsBefore + $value;
    $NewTotalAfter= $PointsAfter+ $value;
    $sqlUpdateNewPoints = "UPDATE tblplayer SET TotalPointsBefore='$NewTotalBefore', TotalPointsAfter='$NewTotalAfter' WHERE Id=$key";
}

我解决了这个问题。我可以通过增加update语句本身中的值来消除foreach。这大大减少了执行时间,因为不需要进行查找。以下示例中未包含的最终执行应通过@ArtisticPhoenix使用PDO作为statet完成

foreach($arrPoints as $key => $value)
{
    $sqlUpdatePoints = "UPDATE tblPoints SET Points = '$value' WHERE Game='FPS' AND PlayerId ='$key' AND Gamenumber = 2";
    $sqlUpdateNewPoints = "UPDATE tblplayer SET TotalPointsBefore=TotalPointsBefore+$value, TotalPointsAfter=TotalPointsAfter+$value WHERE Id=$key";
}

首先,我会切换到PDO,或者msqli,然后您可以使用事务等。更不用说msql_*函数将在将来的更新中从php中删除,因此了解msql_*函数是一种浪费时间的行为,并且在向sql中注入变量而不进行转义时充满了安全问题。您可以删除select and use SET TotalPointsBefore=TotalPointsBefore+$value。。。。这还有一个好处,就是没有潜在的竞争条件。在foreach循环之外可能总共运行2个查询,但这取决于表的主键/唯一键是什么。