2013-04-22 59 views
2

我寫了一個數據庫遷移PHP腳本,它循環了一系列SQL文件並執行它們的內容。它應該有助於自動完成項目的設置和更新。現在,我得到象這樣的錯誤:如何從PHP創建MySQL存儲過程?

mapCoursesToSport.sql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER | 
DROP PROCEDURE IF EXISTS mapCoursesToSport| 
CREATE PROCEDURE mapCo' at line 1 

我得到了同樣的錯誤,當我路過的腳本文件,以期定義,即使用DELIMITER S還了。然後我找到了解決方法,只是從SQL文件中刪除分隔符。它的工作。但現在它不是一種選擇,因爲存儲過程確實需要定界符定義。

那麼,我怎樣才能從PHP定義MySQL存儲過程呢? (或者一般morre:如何把這個SDELIMITER被handeled?)

+1

http://stackoverflow.com/a/5025730/2153758你已經評論過了,下面的答案指出你必須將每個變量一個接一個地傳遞給'mysql(i)_query'而不是使用逗號。 – bwoebi 2013-04-22 18:02:29

+0

謝謝你的提示,但它不適合我。我確實需要存儲過程中的分隔符。所以我不能將它們從代碼中移除。如果我這樣做,程序不會創建。 – automatix 2013-04-22 20:15:57

+0

你不需要分隔符?分號應該按原樣傳遞...並且不要通過一個分隔符結束查詢 – bwoebi 2013-04-22 20:20:32

回答

3

您可以使用本機PHP函數mysqli::querymysqli::prepare或者創建存儲過程:

http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

使用的mysqli :: multi_query也適用,但處理起來有點棘手,因爲您可能需要在逐個執行前先計算查詢的執行次數(前提是最終查詢分隔符是可選的,計算查詢可能很繁瑣)

http://php.net/manual/en/mysqli.multi-query.php

<?php 
    // Using mysqli extension below in object-oriented mode 
    // after having executing queries 
    // with mysqli::multi_query 

    do { 
     $queryResult = $mysqli->use_result(); 
     unset($results); 
     while ($result = $queryResult->fetch_array(MYSQLI_ASSOC)) { 
      $results[] = $result; 
     } 
     $queryResult->close(); 

     if ($mysqli->more_results()) { 
      $mysqli->next_result(); 
     } 

     $queryCount--; 
    } while ($queryCount > 0); 

P.S:我沒有使用mysqli:more_results也不mysqli:next_result作爲循環語句的原因是,某些查詢可能不返回任何結果正確執行。在這種情況下,我們不希望在執行所有查詢之前打破循環。

+0

謝謝你的回答!我不是很瞭解,它應該如何工作......你傳遞給'multi_query'的是什麼?你如何定義'queryCount'?你在哪裏/如何使用'$ results'數組? – automatix 2013-04-22 19:53:52

+1

用於創建過程的所有查詢都應傳遞給multi_query。查詢的計數可以使用「;」上的「implode」來定義;「 (如果定義爲查詢分隔符)存儲在傳遞給mysql_multi_query的變量中的查詢字符串。我已經介紹了結果數組以涵蓋一般情況(不想創建過程但執行多個查詢返回結果的情況)。 請考慮遵循第一個鏈接指出的文檔,因爲它更簡單的使用。 – 2013-04-22 19:57:06

+0

感謝您的詳細解釋! – automatix 2013-04-22 21:59:36