插入MYSQL的PHP​​数组在11,000行后停止

时间:2015-08-17 15:33:13

标签: php mysql arrays limit

目前,我通过从URL下载csv文件并使用str_getcsv()解析它来获取二维PHP数据数组。

之后,我遍历每一行并将值插入相应的SQL列:

foreach($array as $a=>$value){

    //defining variables

    $sql = "INSERT INTO Ranking (ra, na, sc, kd, wi, ki, de, sh, ti)
           VALUES ('$ra','$na','$sc','$kd','$wi','$ki','$de','$sh','$ti')";

    $conn->query($sql);
}

$conn->close();

我有大约16,000行数据,但奇怪的是,插入在10,999行之后停止。多数约929 kb。

我无法找到原因,因为我的托管服务提供商声明没有行限制。我不认为由于执行时间限制而导致PHP文件的执行停止,因为在此插入命令之后,数组也会在本地存储,并且在文件下载后大约4秒发生。

foreach() - 循环是否有某种时间限制?一定次数的执行后它会停止吗?如果我只使用一个SQL查询连接一次,它会工作吗?

更新

结果是sql导入时间超出了。

Fatal error: Maximum execution time of 10 seconds exceeded
in /home/mainhost/public_html/phpMyAdmin/libraries/import/sql.php on line 118

(手动插入的输出尝试在phpmyadmin中)

我该怎么办?将输入拆分为两个查询?

3 个答案:

答案 0 :(得分:2)

我不知道以下内容是否有用 - 您可能需要调整它,但如上所述,在循环中多次插入....

在填充values数组后构建sql并执行一次。

$values=array();
foreach( $array as $a => $value ){
    $values[]="('$ra','$na','$sc','$kd','$wi','$ki','$de','$sh','$ti')";
}
$sql="INSERT INTO `Ranking` (`ra`,`na`,`sc`,`kd`,`wi`,`ki`,`de`,`sh`,`ti`)
      values ".implode( ','.PHP_EOL, $values ).";";

$conn->query( $sql );

答案 1 :(得分:1)

我知道这并没有直接回答你的问题,但更好的解决办法是:

$sql = '';

foreach($array as $a=>$value){

    //defining variables

    $sql .= "INSERT INTO Ranking (ra, na, sc, kd, wi, ki, de, sh, ti)
           VALUES ('$ra','$na','$sc','$kd','$wi','$ki','$de','$sh','$ti')";

}

$conn->query($sql);

$conn->close();

原因是你只有1次往返DB。无论这是否只是本地连接,将插入批处理在一起效率更高。这可以让你在同一时间看到你所遇到的限制。

答案 2 :(得分:0)

想出一个解决方案!

由于循环遍历所有行并且不是正确的方式并且整个查询数组超过了导入时间,我将它们组合在一起,这样就可以立即导入6000行了,这对我来说很好用!

foreach($array as $a=>$value){
    $i += 1;
    if(!fmod($i / 6000, 1) == 1){
        $sql = substr($sql, 0, -1);
        $conn->query($sql);
        $sql = "INSERT INTO Ranking (rank, name, score, kd, wins, kills, deaths, shots, time) VALUES ";
    }

    //defining variables

    $sql .= "('$ra',' $na ','$sc','$kd','$wi','$ki','$de','$sh','$ti'),";
}

$sql = substr($sql, 0, -1);

祝你有个美好的一天!