我有一个我需要更改的脚本,因为要插入数据库的数据太大而无法立即执行。所以我创建了一个循环,它将数组拆分为6000行,然后插入它。
我不确切地知道服务器一次处理的数据是否很大,或者它是否太大而无法上传,但是我在这些6000s块中分成两个步骤。
代码:
for ($j = 0; $j <= ceil($alength / 6000); $j++){
$array = array_slice($arraysource, $j * 6000, 5999);
$sql = "INSERT INTO Ranking (rank, name, score, kd, wins, kills, deaths, shots, time, spree) VALUES ";
foreach($array as $a=>$value){
//transforming code for array
$ra = $array[$a][0];
$na = str_replace(",", ",", $array[$a][1]);
$na = str_replace("\", "\\\\", $na);
$na = str_replace("'", "\'", $na);
$sc = $array[$a][2];
$kd = $array[$a][3];
$wi = $array[$a][4];
$ki = $array[$a][5];
$de = $array[$a][6];
$sh = $array[$a][7];
$ti = $array[$a][8];
$sp = $array[$a][9];
$sql .= "('$ra',' $na ','$sc','$kd','$wi','$ki','$de','$sh','$ti','$sp'),";
}
$sql = substr($sql, 0, -1);
$conn->query($sql);
}
$conn->close();
现在它只插入前5999行,但不会更多,就好像它只执行一次循环一样。没有错误消息..
答案 0 :(得分:0)
不知道这是否一定会有所帮助,但是如何使用array_chunk,array_walk和检查error codes(如果有的话)呢?像这样:
function create_query(&$value, $key) {
//returns query statements; destructive though.
$value[1] = str_replace(",", ",", $value[1]);
$value[1] = str_replace("\", "\\\\", $value[1]);
$value[1] = str_replace("'", "\'", $value[1]);
$queryvalues = implode("','",$value);
$value = "INSERT INTO Ranking (rank, name, score, kd, wins, kills, deaths, shots, time, spree) VALUES ('".$queryvalues."');";
}
$array = array_chunk($arraysource, 6000);
foreach($array as $key=>$value){
array_walk($value,'create_query');
if (!$conn->query($value)) {
printf("Errorcode: %d\n", $conn->errno);
}
}
$conn->close();
其次,您考虑过使用mysqli::multi_query吗?它会立即执行更多查询,但您必须检查允许的最大数据包大小(max_allowed_packet)。
另一个提示是检查查询的响应,而您的代码并未包含这些响应。
答案 1 :(得分:-1)
感谢您的提示,但我明白了。没想到这个^^
这是for循环之后的第一行,我没有在我的问题中包含:
array_unshift($array[$a], $a + 1);
这为每个用户增加了一个额外的价值,即&#34; rank&#34;。但是,在一个循环结束后,这些数字会重复,并且无法导入具有相同排名的用户。 现在它起作用了:
array_unshift($array[$a], $a + 1 + $j * 5999);