PHP 数组到 MYSQL 插入在 11,000 行后停止
PHP array to MYSQL insertion stops after 11,000 rows
目前,我通过从 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()
-loop 有某种时间限制吗?执行一定次数后会停止吗?如果我仅通过一个 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中手动插入尝试的输出)
我该怎么办?将输入拆分为两个查询?
我不知道以下内容是否有帮助 - 您可能需要对其进行调整,但如上所述,在循环中插入多次....
填充值数组后构建 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 );
我知道这不能直接回答您的问题,但更好的解决方法是:
$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 次到数据库的往返行程。不管这是否只是一个本地连接,将您的插入批处理在一起仍然更有效。这应该可以让您绕过您同时看到的限制。
想出办法了!
由于循环遍历所有行被证明不是正确的方法并且查询整个数组超过了导入时间,所以我将它们合并,以便一次导入 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);
祝你有个愉快的一天!
目前,我通过从 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()
-loop 有某种时间限制吗?执行一定次数后会停止吗?如果我仅通过一个 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中手动插入尝试的输出)
我该怎么办?将输入拆分为两个查询?
我不知道以下内容是否有帮助 - 您可能需要对其进行调整,但如上所述,在循环中插入多次....
填充值数组后构建 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 );
我知道这不能直接回答您的问题,但更好的解决方法是:
$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 次到数据库的往返行程。不管这是否只是一个本地连接,将您的插入批处理在一起仍然更有效。这应该可以让您绕过您同时看到的限制。
想出办法了!
由于循环遍历所有行被证明不是正确的方法并且查询整个数组超过了导入时间,所以我将它们合并,以便一次导入 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);
祝你有个愉快的一天!