PHP mysqli prepared statement for stored procedure with out parameter

前端 未结 2 394
清歌不尽
清歌不尽 2020-12-18 16:02

I have a stored procedure IsUserPresent like:

DELIMITER $$
CREATE PROCEDURE IsUserPresent(
    in userid varchar (150),
    out isPresent bit
)
BEGIN
    SET         


        
相关标签:
2条回答
  • 2020-12-18 16:21

    The way stored procedures work with prepared statements is a bit more complicated. PHP manual states that you've got to use session variables (MySQL sessions, not PHP)

    INOUT/OUT parameter

    The values of INOUT/OUT parameters are accessed using session variables.

    So you could do it with

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

    Remark:

    I recommend to rewrite this procedure as a function with one IN parameter that returns INT.

    0 讨论(0)
  • 2020-12-18 16:30

    Should be a comment, but due to code formatting posting as answer.

    Can't comment on the PHP code, I'm no programmer, but your procedure should be more like this:

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

    Use exists(), since it stops as soon as an entry is found. count() continues to look for records, although this isn't necessary.

    And you named a parameter the same as your column name. This is confusing for MySQL and should be avoided at all costs. Good practice is, to prefix parameters with p_ and variables with v_ and/or some indications of what type the variable or parameter is.

    For better readability I also changed the paramter names to camel case.

    Oh, and finally always include error messages in questions.

    0 讨论(0)
提交回复
热议问题