2014-09-05 94 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