2013-04-01 42 views
0

參數我需要檢索存儲過程中的MySQL OUT參數。我找不到任何解釋這一點的東西(對我來說很有意義)。PHP PDO /檢索OUT從MySQL存儲過程

try { 
$dsn = 'mysql:dbname=db_name;host=localhost'; 
$dbh = new PDO($dsn, 'usr_name', 'password'); 
} catch (PDOException $e) { 
echo 'Connection failed: ' . $e->getMessage(); 
} 

$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)"); 

$stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR); 
$stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
$stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 

$stmt->execute(); 

$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC); 

print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n"; 

我發現了另一個SO項目的最後兩行,但它只是返回NULL值。

回答

1

除了使用MySQL的會話變量,你可以使用bindParam()

bool PDOStatement::bindParam (mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]])

綁定一個PHP變量到對應的命名或問號 佔位符的SQL語句的使用方法是,爲了製備 聲明。不同於PDOStatement對象:: bindValue(),該變量被綁定爲 參考,將僅在時間來評價該 PDOStatement對象::執行()被調用。

大多數參數都是輸入參數,也就是參數是一個只讀的方式用來建立查詢 。有些司機 支持的返回數據作爲輸出 參數的存儲過程的調用,有的還爲輸入/輸出參數,無論在 數據發送和更新接受它。

不要忘記使用相應的佔位符:

$stmt = $dbh->prepare("CALL superior_main_db.stprNewUser(:usrEmail, :newUserOK, :stprComment)"); 

一旦執行該語句,你的變量,會自動包含您需要的值。

+0

的OP是問如何使用存儲過程,而不是如何綁定參數不是他? – vascowhite

+0

@vascowhite - 請再次閱讀問題。他要求如何檢索** OUT參數。 –

+0

哦,是的,你說得對。他已經說過他不懂這本手冊,所以沒有一個例子,這不會有幫助。 – vascowhite

-1

要調用存儲過程,如下

SELECT @newUserOK, @stprComment 
+0

Amit,我如何在當前代碼的上下文中執行上述查詢? – aSystemOverload

+0

你一樣執行其他查詢$語句= $ dbh->準備( 「SELECT @newUserOK,@stprComment」); – Amit

+0

神祕的答案,它不起作用;) – argon

2

試試這個後取回@newUserOK和@stprComment變量,只需要執行下面的查詢...... 看作品......

try 
{ 
    $dsn = 'mysql:dbname=db_name;host=localhost'; 
    $dbh = new PDO($dsn, 'usr_name', 'password'); 
} 
catch (PDOException $e) 
{ 
    echo 'Connection failed: ' . $e->getMessage(); 
} 


//$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,:newUserOK,:stprComment)"); 
//changed :newUserOK to @newUserOK 
//changed :stprComment to @stprComment 
$stmt = $dbh->prepare("CALL db.stprNewUser(:usrEmail,@newUserOK,@stprComment);"); 

//declare only input parameters. 
//good pratice put string length. assuming varchar(100). 
$stmt->bindParam(':usrEmail', $tmpEmail, PDO::PARAM_STR,100); 

//dont need these 
// $stmt->bindParam(':newUserOK', $newUserOK, PDO::PARAM_INT,1); 
// $stmt->bindParam(':stprComment', $stprComment, PDO::PARAM_STR,100); 

$stmt->execute(); 

$outputArray = $dbh->query("select @newUserOK, @stprComment;")->fetchAll(); 

foreach($outputArray as $row) 
{ 
    "NewUserOk:" . $row["@newUserOk"] . ", StprComment:" . $row["@stprComment"]; 
} 

//$outputArray = $dbh->query("select @newUserOK, @stprComment")->fetch(PDO::FETCH_ASSOC); 
//print "procedure returned [" . $outputArray['@newUserOK'] . $outputArray['@stprComment'] . "]\n";