2012-08-07 51 views
4

我在MySQL數據庫中的一個簡單的存儲過程:使用PHP PDO與存儲過程

DELIMITER $$ 
CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT) 
BEGIN 
    SELECT var_datain; 
END 

當調用的mysql-工作臺此過程中,它返回我放在數據:

Screenshot form mysql work bench

現在,當我使用PDO把它從PHP我得到一個錯誤:

Fatal error: Cannot pass parameter 2 by reference in C:/apache......(3rd line) 

這裏是我的PHP代碼:

$db = new PDO(DSN, DBUSER, DBPASS); 
$stmt = $db->prepare("CALL test(?)"); 
$stmt->bindParam(1, 'hai!', PDO::PARAM_STR); 
$rs = $stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
echo $result[0]; 
+0

哪條線?我沒有看到任何通過引用 – 2012-08-07 00:48:23

+0

傳遞的行,它具有$ stmt-> bindParam(1,'hai!',PDO :: PARAM_STR); – Krimson 2012-08-07 00:49:59

回答

17

您需要使用bindValue,而不是bindParam

當您使用bindParam時,它綁定提供給參數的變量,而不是變量的值。

所以,如果你這樣做:

$x = 5; 
$stmt->bindParam(1, $x, PDO::PARAM_INT); 
$x = 6; 
$stmt->execute(); //executes with 6 instead of 5 

它實際上有6個,而不是5。要做到這一點執行,該方法必須對變量的引用。你不能引用一個文字,所以這意味着bindParam不能用於文字(或任何你不能引用的東西)。

$x = 5; 
$stmt->bindValue(1, $x, PDO::PARAM_INT); 
$x = 6; 
$stmt->execute(); //executes with 5 instead of 6 

然後:

-1

下面的代碼工作調用沒有準備發言!

$query="CALL store_procedure_name(@a)"; 
$conn->query($query); 

$query="SELECT @a as outvar;"; 
$result = $conn->query($query); 
foreach ($result as $x) 
{ 
    $res=$x['outvar']; 
} 

echo $res;