PHP数组到MYSQL的插入在11000行之后停止
目前,我通过从URL下载csv文件并使用PHP数组到MYSQL的插入在11000行之后停止,php,mysql,arrays,limit,Php,Mysql,Arrays,Limit,目前,我通过从URL下载csv文件并使用str\u 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','
str\u 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();
我有大约16000行数据,但奇怪的是,插入正好在10999行之后停止。大约929KB
我找不到原因,因为我的主机提供商声明没有行限制。我不认为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中手动插入尝试的输出)
我该怎么办?将输入拆分为两个查询?我不知道以下内容是否有帮助-您可能需要调整它,但如上所述,在循环中插入多次 填充值数组后构建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并执行一次
$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并执行一次
$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并执行一次
$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次往返DB。不管这是否只是一个本地连接,将插入批处理在一起仍然更有效。这应该可以让你同时绕过你所看到的限制。我知道这并不能直接回答你的问题,但更好的解决办法是:
$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。不管这是否只是一个本地连接,将插入批处理在一起仍然更有效。这应该可以让你同时绕过你所看到的限制。我知道这并不能直接回答你的问题,但更好的解决办法是:
$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。不管这是否只是一个本地连接,将插入批处理在一起仍然更有效。这应该可以让你同时绕过你所看到的限制。我知道这并不能直接回答你的问题,但更好的解决办法是:
$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。不管这是否只是一个本地连接,将插入批处理在一起仍然更有效。这将使您同时绕过所看到的限制。想出了一个解决方案 由于遍历所有行的方式都不正确,并且查询整个数组超过了导入时间,因此我将它们组合在一起,以便一次导入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);
祝你有愉快的一天 想出了一个解决办法 由于遍历所有行的方式都不正确,并且查询整个数组超过了导入时间,因此我将它们组合在一起,以便一次导入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);
祝你有愉快的一天 想出了一个解决办法 由于遍历所有行的方式都不正确,并且查询整个数组超过了导入时间,因此我将它们组合在一起,以便一次导入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);
祝你有愉快的一天 想出了一个解决办法 由于遍历所有行的方式都不正确,并且查询整个数组超过了导入时间,因此我将它们组合在一起,以便一次导入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);
祝你有愉快的一天 是否显示PHP错误?他们什么也没告诉你?
count($array)
是否给出结果>10999?哦,天哪,你实际上是在插入一个循环?永远不要那样做。您的执行时间和可用内存是有限的。从CLI运行此脚本,以确定您的脚本是否正在消亡,或者它是否是处理器。我不显示错误,但由于文件路径不同,该文件只能由服务器以任何方式(cronjob)成功执行。我可以稍后再试试。我知道长度大于10999,因为本地存储file@Andrew我同意,但实际上可以让别人知道你所知道的东西,而不使用措辞,就像他们不知道一样愚蠢。你会显示PHP错误吗?他们什么也没告诉你?count($array)
是否给出结果>10999?哦,天哪,你实际上是在插入一个循环?永远不要那样做。您的执行时间和可用内存是有限的。从CLI运行此脚本,以确定您的脚本是否正在消亡,或者它是否是处理器。我不显示错误,但由于文件路径不同,该文件只能由服务器以任何方式(cronjob)成功执行。我可以稍后再试试。我知道长度大于10999,因为本地存储file@Andrew我同意,但实际上可以让别人知道你知道的事情