2017-03-02 108 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