2014-09-05 58 views
1

我有一個存儲過程IsUserPresent喜歡:PHP的mysqli準備語句存儲過程輸出參數

DELIMITER $$ 
CREATE PROCEDURE IsUserPresent(
    in userid varchar (150), 
    out isPresent bit 
) 
BEGIN 
    SET isPresent=0; 
    SELECT COUNT(*) 
    INTO isPresent 
    FROM users_table 
    WHERE users_table.userid=userid; 
END$$ 

,我想使用的mysqli準備好的聲明從PHP調用它。我正在做下面的代碼片段,但它給了我警告。

$connect=&ConnectDB(); 
$stmt=$connect->prepare("CALL IsUserPresent(?,?)"); 
$stmt->bind_param('si',$uid,$userCount); 
$stmt->execute(); 
$toRet = $userCount!=0; 
Disconnect($connect); 
return $toRet; 

警告如下:

Premature end of data (mysqlnd_wireprotocol.c:1112) 
Warning: mysqli_stmt::execute(): RSET_HEADER packet 1 bytes shorter than expected 
Warning: mysqli_stmt::execute(): Error reading result set's header 

回答

4

存儲過程處理預處理語句的方式有點複雜。那你一定要使用會話變量PHP manual狀態(MySQL的會議,而不是PHP)

INOUT/OUT參數

的INOUT/OUT參數的值是使用會話變量訪問。

所以,你可以用

$connect=&ConnectDB(); 
// bind the first parameter to the session variable @uid 
$stmt = $connect->prepare('SET @uid := ?'); 
$stmt->bind_param('s', $uid); 
$stmt->execute(); 

// bind the second parameter to the session variable @userCount 
$stmt = $connect->prepare('SET @userCount := ?'); 
$stmt->bind_param('i', $userCount); 
$stmt->execute(); 

// execute the stored Procedure 
$result = $connect->query('call IsUserPresent(@uid, @userCount)'); 

// getting the value of the OUT parameter 
$r = $connect->query('SELECT @userCount as userCount'); 
$row = $r->fetch_assoc();    

$toRet = ($row['userCount'] != 0); 

備註做到這一點:

我建議重寫這個程序與一個函數的參數,返回INT。

3

應該是一個評論,但由於代碼格式發佈的答案。因爲它只要發現了一個條目停止

DELIMITER $$ 
CREATE PROCEDURE IsUserPresent(
    in p_userId varchar (150), 
    out p_isPresent bit 
) 
BEGIN 

    SELECT EXISTS (SELECT 1 FROM users_table WHERE user_table.userid = p_userId) 
    INTO p_isPresent; 

END$$ 

使用exists(),:

不能在PHP代碼進行評論,我不是程序員,但你的程序應該是更喜歡這一點。 count()繼續查找記錄,雖然這不是必需的。

而且您命名的參數與列名相同。這對於MySQL來說是令人困惑的,應該不惜一切代價避免。好的做法是用p_和變量v_和/或變量或參數是什麼類型的一些指示作爲參數的前綴。

爲了更好的可讀性,我還將參數名稱更改爲駱駝大小寫。

呵呵,最後總是包括問題中的錯誤信息。

+0

上述聲明放入p_isPresent中是什麼?我不認爲我們可以使用外部嵌套查詢返回的結果。謝謝你的提示。 – Talha5389 2014-09-05 13:41:35

+0

'exists()'返回0或1(true或false)。當你將結果放入一個變量時,子查詢不是問題。 – fancyPants 2014-09-05 14:51:35