簡體   English   中英

PHP mysqli為帶out參數的存儲過程准備了語句

[英]PHP mysqli prepared statement for stored procedure with out parameter

我有一個存儲過程IsUserPresent像:

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 prepare語句從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

存儲過程與准備好的語句一起工作的方式要復雜一些。 PHP手冊指出您必須使用會話變量(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的IN參數的函數。

應該是注釋,但由於代碼格式過帳而作為答案。

無法評論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_和/或對變量或參數的類型進行一些指示。

為了提高可讀性,我還將參數名稱更改為駝峰式。

哦,最后總是在問題中包含錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM