PHP mysqli插入只能工作一次

时间:2016-06-21 16:31:58

标签: php arrays loops mysqli insert

我有一个我需要更改的脚本,因为要插入数据库的数据太大而无法立即执行。所以我创建了一个循环,它将数组拆分为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("&#44;", ",", $array[$a][1]);
        $na = str_replace("&#92;", "\\\\", $na);
        $na = str_replace("&#39;", "\'", $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行,但不会更多,就好像它只执行一次循环一样。没有错误消息..

2 个答案:

答案 0 :(得分:0)

不知道这是否一定会有所帮助,但是如何使用array_chunkarray_walk和检查error codes(如果有的话)呢?像这样:

function create_query(&$value, $key) { 
    //returns query statements; destructive though.
    $value[1] = str_replace("&#44;", ",", $value[1]);
    $value[1] = str_replace("&#92;", "\\\\", $value[1]);
    $value[1] = str_replace("&#39;", "\'", $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_pa​​cket)。

另一个提示是检查查询的响应,而您的代码并未包含这些响应。

答案 1 :(得分:-1)

感谢您的提示,但我明白了。没想到这个^^

这是for循环之后的第一行,我没有在我的问题中包含:

array_unshift($array[$a], $a + 1);

这为每个用户增加了一个额外的价值,即&#34; rank&#34;。但是,在一个循环结束后,这些数字会重复,并且无法导入具有相同排名的用户。 现在它起作用了:

array_unshift($array[$a], $a + 1 + $j * 5999);