在foreach循环中的Mysqli多查询

时间:2017-03-02 13:07:03

标签: php mysql loops mysqli foreach

我必须在我的数据库中进行大量插入,从xml导入数据。 现在,如果我在循环中打开和关闭连接,脚本可以工作但崩溃以获取最大连接数,如果我使用以下代码,它只执行一次mysqli_multi_query。

  

我只需要知道如何维护连接以在循环中执行新的多查询。

$xml = simplexml_load_file('demo.xml');
$mysqli =new mysqli($servername, $username, $password, $dbname);
foreach($xml->datas as $data) {
    $sql="INSERT IGNORE INTO table1 (hobby) values ('".$data->child74."');";
    $sql.="INSERT IGNORE INTO table2 (pizza, spaghetti) values ('".$data->child55."', '".$data->child52."');";
    // a lot more insert...
    mysqli_multi_query($mysqli,$sql);
}
mysqli_close($mysqli);

1 个答案:

答案 0 :(得分:2)

对于多个插入,您应该使用预准备语句。这种方法可以解决您一次遇到的所有问题。唯一可能的问题(与可能的非最佳数据库设置有关)通过使用事务来解决。

以下代码仅使用单一连接,并且速度尽可能快

$xml = simplexml_load_file('demo.xml');

$stmt1 = $mysqli->prepare("INSERT IGNORE INTO table1 (hobby) values (?)");
$stmt1->bind_param("s",$hobby);

$stmt2 = $mysqli->prepare("INSERT IGNORE INTO table2 (pizza, spaghetti) values (?,?)");
$stmt2->bind_param("ss", $pizza, $spaghetti);

$mysqli->autocommit(FALSE);
foreach($xml->order as $data) {
    $hobby = $data->child74;
    $pizza = $data->child55;
    $spaghetti = $data->child52;
    $stmt1->execute();
    $stmt2->execute();
}
$mysqli->commit();
$mysqli->close();

使用交易准备好的报表使其成为文明,安全和有效的解决方案。