【问题标题】:PHP mysqli insert only works oncePHP mysqli 插入只工作一次
【发布时间】:2016-06-21 16:31:57
【问题描述】:

我有一个脚本需要更改,因为要插入数据库的数据太大而无法立即执行。所以我创建了一个循环,将数组分成 6000 行的块,然后插入它。

我不确切知道数据是否太大而无法让服务器立即处理,或者是否太大而无法上传,但是 atm 我将这两个步骤分成了这 6000 个块。

代码:

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 行,但不像它只执行一次循环一样。没有错误信息..

【问题讨论】:

  • 我无法重现此内容。您的逻辑按我的预期工作。请提供一个最小、完整且可验证的示例。

标签: php arrays loops mysqli insert


【解决方案1】:

不知道这是否一定会有所帮助,但是使用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)。

另一个提示是检查查询的响应,您的代码不包含该响应。

【讨论】:

    【解决方案2】:

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

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

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

    这会在每个用户面前增加一个附加值,即“排名”。但是一个循环结束后数字会重复,它不能导入具有相同等级的用户。 现在可以了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2017-10-20
      • 2017-10-22
      • 2014-11-04
      • 2013-09-26
      • 2023-03-29
      • 2011-09-16
      相关资源
      最近更新 更多