2014-09-05 2 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$$ 

, и я хочу, чтобы вызвать из PHP с помощью Mysqli подготовленного заявления. Я делаю это после фрагмента кода, но это дает мне предупреждение.

$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); 

Примечание:

Я рекомендую переписать эту процедуру как функцию с одним параметром IN, который возвращает INT.

3

Должен быть комментарий, но из-за форматирование коды проводки в качестве ответа.

Не можете прокомментировать код PHP, я не программист, но ваша процедура должна быть больше, как это:

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(), так как он останавливается, как только будет найден запись. count() продолжает искать записи, хотя это необязательно.

И вы назвали параметр таким же, как имя вашего столбца. Это запутывает MySQL, и его следует избегать любой ценой. Хорошая практика заключается в префиксных параметрах с p_ и переменными с v_ и/или некоторыми указаниями какого типа переменная или параметр.

Для лучшей читаемости я также сменил имена параметров на верблюжьей кейсе.

О, и, наконец, всегда включают сообщения об ошибках в вопросах.

+0

Что делается выше Заявление помещено в p_isPresent. Я не думаю, что мы можем использовать результат, возвращенный вложенным запросом снаружи. Спасибо за совет. – Talha5389

+0

'exists()' возвращает 0 или 1 (true или false). И подзапрос не является проблемой, так как вы помещаете результат в переменную. – fancyPants

Смежные вопросы