2017-03-02 96 views
0

我必须在我的数据库中做很多插入操作,从xml导入数据。 现在,如果我在循环中打开和关闭连接,脚本可以正常工作,但会崩溃以获取最大连接数,如果使用下面的代码,它只执行一次mysqli_multi_query。在foreach循环中的mysqli多查询

我只需要知道,如何保持连接在循环中执行新的多查询。

$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); 
+0

你错过了'“'或它的类型是? – C2486

+1

为什么你需要'mysqli_multi_query'? – bew

+0

typeof运算错误........ – Beginner

回答

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

与交易预处理语句使文明,安全,高效的解决方案。

+0

我爱上了你的答案,但我的问题是,大约有60个插入查询已经完成,每个var都有大量的字符串转换...对于一些插入它会好的,但想象50/60插入每个10列...我不知道 – Vixed

+0

不知道什么?如何向查询添加10个问号? –

+0

是的,我在上面;)谢谢! – Vixed