2016-05-03 86 views
1

我從PHP調用存儲過程調用存儲過程從PHP

<?php 
include('global/db.php'); 
$id = 1; 
$base = conn(); 
$query = "CALL get_id(:id,@userid)"; 
$stmt = $base->prepare($query); 
$stmt->bindParam(':id',$id); 
$stmt->execute(); 
print_r($stmt->fetch()); 
?> 

存儲過程是這樣的

BEGIN 
SET @userid = (SELECT * FROM user WHERE user.id = id); 
SELECT @userid; 
END 

過程參數

IN id int(10), OUT userid VARCHAR(255) 

問題:

  • 爲什麼我的結果沒有任何結果?
  • 我的輸出變量@userid需要什麼數據類型?

回答

1

您的存儲過程有一些問題。

既然你有一個輸出userid爲什麼這個@userid

而且你輸出userid,所以沒有必要SELECT

另一件事是,你不能選擇整行成一個單一變量,多列,你應該使用多個輸出變量。

BEGIN 
    SET userid = (SELECT column_name FROM user WHERE user.id = id); 
END 

更新

$result = $base->query("CALL get_id($id)"); 
while($data = $result->fetch_array(MYSQL_ASSOC)){ 
    echo $data['column_name']; 
} 
+0

是無論如何,例如'SET somevariable ='說'SELECT分割從用戶WHERE division = blah'結果將返回多個'division1,division2,division3'又名標量值'array' –

+0

您是否指多行(匹配條件)? – Sachin

+0

是的,正是我的意思 –

1

目前,正在定義一個標量參數,整個查詢結果集,作爲由星號。考慮使用INTO第一個查詢結果的值傳遞到OUT參數:

DELIMITER $$ 
CREATE PROCEDURE get_id (
    IN id int(10), 
    OUT userid VARCHAR(255)) 
BEGIN 
    SELECT user.id 
    INTO userid 
    FROM user 
    WHERE user.id = id; 
END$$ 
DELIMITER ; 

而在PHP中,你需要運行第二個查詢到取命令返回@userid變量:

try { 
    include('global/db.php'); 
    $id = 1; 
    $base = conn(); 
    $query = "CALL get_id(:id,@userid)"; 
    $stmt = $base->prepare($query); 
    $stmt->bindParam(':id',$id); 
    $stmt->execute(); 

    $result = $base->query("SELECT @userid")->fetchAll(); 
    if ($result) { print_r($result); } 

} catch (PDOException $pe) { 
    echo $pe->getMessage()."\n";   
} 
+0

所以基本上使用不能使用'*',因爲它會返回一個'array'或標量值,你不能設置爲變量? –

+0

正確,除非MySQL有數組/矢量類型。請注意,您可以返回完整的查詢結果集,而不會傳入「OUT」變量。 – Parfait