【问题标题】:Mysqli multi query in foreach loopforeach循环中的Mysqli多查询
【发布时间】:2017-07-22 05:36:53
【问题描述】:

我必须在我的数据库中进行大量插入,从 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);

【问题讨论】:

  • 你错过了"或者是类型?
  • 为什么需要mysqli_multi_query
  • 无论如何,只要数据包含引号或其他一些特殊字符,您的脚本就会随机崩溃。我建议你放弃当前的 PHP 教程,学习准备好的语句的乐趣。
  • 无论如何,在投票否决之后,我需要一些解释来理解我做错了什么。
  • 对不起?我不是故意回答你的问题。这就是我离开 cmets 而不是填充 answer 框的原因。

标签: php mysql loops mysqli foreach


【解决方案1】:

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

下面的代码只使用单一连接,并且尽可能快

$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();

准备好的交易语句使其成为文明、安全和高效的解决方案。

【讨论】:

  • 我很喜欢你的回答,但我的问题是已经完成了大约 60 个插入查询,每个 var 都进行了很多字符串转换......对于一些插入来说它会没问题,但想象一下 50/60 插入,每列 10 列...我不知道
  • 不知道什么?如何在查询中添加 10 个问号?
  • 是的,我正在处理它;)谢谢!
  • 有什么方法可以打印准备好的查询?一种无需执行即可在屏幕上进行检查的方法。
  • 不,如果您的意思是插入值。值将单独发送到服务器,并且永远不会干扰查询
猜你喜欢
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多