2012-11-14 114 views
11

我一直在使用PDO一段時間,並且正在重構一個項目,以便它使用存儲的procs而不是內聯SQL。我收到一個我無法解釋的錯誤。我正在使用PHP版本5.3.5和MySQL版本5.0.7。使用PDO使用Out參數調用存儲過程

我只是想獲得一個基本的存儲過程與輸出工作。這裏是存儲過程:

DELIMITER // 
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100)) 
BEGIN 
    SET var1 = 'This is a test'; 
END // 

這裏是我使用調用PROC代碼,$ DB是PDO的一個實例:

$stmt = $db->prepare("CALL proc_OUT(?)"); 
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

    // call the stored procedure 
    $stmt->execute(); 
    echo $returnvalue; 

簡單吧?然而,這將導致以下錯誤:

exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger 

如果我直接調用PROC像這樣:

CALL proc_OUT(@res); 
SELECT @res; 

如期工作,導致我相信,有一個與它是怎樣一個問題被稱爲PHP,但我似乎無法找到問題是什麼。我正在按照the manual中的說明進行操作,但仍然出現此錯誤。任何人都可以提出我可能做錯了什麼?任何建議將非常感激。非常感謝!

+1

http://stackoverflow.com/a/4502524/815386 –

+1

我已經複製這與MySQL 5.5.28和PHP 5.3.10。另外,你似乎有兩個版本的'$ return_value'-另一個沒有下劃線。這是打算嗎?似乎沒有在輸出上有所作爲。 –

回答

8

這似乎有在工作中的錯誤在這裏,我找到了最好的解決辦法是這樣的:

http://www.php.net/manual/en/pdo.prepared-statements.php#101993

從註釋在上面的鏈接:

$dbh->query("CALL SomeStoredProcedure($someInParameter1, $someInParameter2, @someOutParameter)"); 
$dbh->query("SELECT @someOutParameter"); 

// OR, if you want very much to use PDO.Prepare(), 
// insert "SELECT @someOutParameter" in your stored procedure and then use: 

$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)"); 
$stmt ->execute(array($someInParameter1, $someInParameter2)); 

見此外:https://stackoverflow.com/a/4502524/815386

4

您需要指定您的參數是IN/OUT樣式,如PHP網站示例:

http://php.net/manual/en/pdo.prepared-statements.php例如#5

<?php 

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); 
$value = 'hello'; 
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

// call the stored procedure 
$stmt->execute(); 

print "procedure returned $value\n"; 
+0

感謝您的回覆。我的存儲過程沒有輸入/輸出參數,它只是一個輸出參數,如鏈接 – TheMethod

+1

頁面上的示例#4我的錯誤。看看這裏http://www.danstraw。com/calling-mysql-stored-procedures-from -phps -pdo-output-parameters/2010/12/21 /它可能是一個MySQL錯誤 – sdespont

+0

似乎固定爲MySQL版本5.5.3 +&6.0.8+。你能升級嗎? – sdespont

4

明白了!只需在存儲過程結束時添加一個

SELECT @outputparam; 

其中@outputparam是存儲過程定義中用於參數的名稱。如果您不能編輯存儲過程,則應該使用PHP PDO對SELECT @outputparam執行第二個查詢以獲取輸出參數值。

提示:如果您使用不推薦的DBLib連接到SQL Server,並按照建議修改了存儲過程,則還需要調整語法以獲取調用PHP腳本中的輸出參數值:

$out = 0; 
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib 
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT); 
$sth->execute(); 
$sth->bindColumn(1, $out, PDO::PARAM_INT); 
$sth->fetch(PDO::FETCH_BOUND); 

var_dump($out); // works 
+1

非常感謝您的回答,這個解決方案節省了我的時間 – vietnguyen09

相關問題