標籤:
最近要做一個軟體升級,其中涉及到資料庫表欄位的變動(新增或刪除或修改),所有的關於資料庫的變動的sql語句都是存放在Sqlupdate.sql檔案中,每次升級的時候都需要執行一次Sqlupdate.sql裡的所有sql語句,這就涉及到執行多條語句的問題了。軟體在CodeIgniter架構上開發的,CodeIgniter有封裝好的執行sql語句的函數:$this->db->query(‘****‘),但此函數一次只能執行一條sql語句。所以得另外想辦法了。百度了下,找到了一些資料。multi_query()方法是完全按照在sql環境下的語句執行,所以可以一次執行多條sql語句(按sql文法拼字,每條語句以;結束)。
$mysqli = new mysqli($this->db->hostname,$this->db->username,$this->db->password,$this->db->database); //串連MySQL資料庫 if ($mysqli->connect_errno) { //判斷是否串連成功 printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } $mysqli->multi_query($dataStr); //執行sql語句
以下是百度到的參考資料:
使用mysqli對象中的query()方法每次調用只能執行一條SQL命令。如果需要一次執行多條SQL命令,就必須使用mysqli對象中的 multi_query()方法。具體做法是把多條SQL命令寫在同一個字串裡作為參數傳遞給multi_query()方法,多條SQL之間使用分號 (;)分隔。如果第一條SQL命令在執行時沒有出錯,這個方法就會返回TRUE,否則將返回FALSE。
因為multi_query()方法能夠串連執行一個或多個查詢,而每條SQL命令都可能返回一個結果,在必要時需要擷取每一個結果集。所以對該方 法返回結果的處理也有了一些變化,第一條查詢命令的結果要用mysqli對象中的use_result()或store_result()方法來讀取,當 然,使用store_result()方法將全部結果立刻取回到用戶端,這種做法效率更高。另外,可以用mysqli對象中的 more_results()方法檢查是否還有其他結果集。如果想對下一個結果集進行處理,應該調用mysqli對象中的next_result()方 法,擷取下一個結果集。這個方法返回TRUE(有下一個結果)或FALSE。如果有下一個結果集,也需要使用use_result()或 store_result()方法來讀取。執行多條SQL命令代碼如下所示:
<?php $mysqli = new mysqli("localhost", "mysql_user","mysql_pwd", "demo"); //串連MySQL資料庫 if (mysqli_connect_errno()) { //檢查串連錯誤 printf("串連失敗: %s<br>", mysqli_connect_error()); exit(); } /* 將三條SQL命令使用分號(;)分隔, 串連成一個字串 */ //設定查詢字元集為GB2312 $query = "SET NAMES GB2312;"; //從MySQL伺服器擷取目前使用者 $query .= "SELECT CURRENT_USER();"; //從contactinfo表中讀取資料 $query .= "SELECT name,phone FROM contactinfo LIMIT 0,2"; //執行多條SQL命令 if ($mysqli->multi_query($query)) { do { //擷取第一個結果集 if ($result = $mysqli->store_result()) { //遍曆結果集中每條記錄 while ($row = $result->fetch_row()) { //從一行記錄數組中擷取每列資料 foreach($row as $data){ //輸出每列資料 echo $data." "; } //輸出分行符號號 echo "<br>"; } //關閉一個開啟的結果集 $result->close(); } //判斷是否還有更多的結果集 if ($mysqli->more_results()) { //輸出一行分隔線 echo "-----------------<br>"; } } while ($mysqli->next_result()); //擷取下一個結果集,並繼續執行迴圈 } $mysqli->close(); //關閉mysqli串連?>
輸出結果如下所示:
- [email protected]
- -----------------
- 高某某 15801688338
- 洛某某 15801681234
在上面的樣本程式中,使用mysqli對象中的multi_query()方法一次執行三條SQL命令,擷取多個結果集並從中遍曆資料。如果在命令 的處理過程中發生了錯誤,multi_query()和next_result()方法就會出現問題。multi_query()方法的傳回值,以及 mysqli的屬性errno、error、info等只與第一條SQL命令有關,無法判斷第二條及以後的命令是否在執行時發生了錯誤。所以在執行 multi_query()方法的傳回值是TRUE時,並不意味著後續命令在執行時沒有出錯。
mysql -- 一次執行多條sql語句