PHP - MySQL gets value of out parameter from a stored procedure

前端 未结 5 2029
自闭症患者
自闭症患者 2021-01-06 13:20

I have called a MySQL stored procedure from PHP using mysqli. This has one out parameter.

$rs = $mysqli->query(\"CALL addNewUser($name,$age,@         


        
相关标签:
5条回答
  • 2021-01-06 14:05

    Another correct methods its working fine: Cheers!!

    $procedureName = 'VALIDATE_USER';
    $procedure = "CALL $procedureName('$username','$pwd',@p_userid)";
    $results1 = $dbconnection->query($procedure);
    $results2 = $dbconnection->query("SELECT @p_userid");
    $num_rows = $results2->num_rows;
    if ($num_rows > 0) {
    
        while($row = $results2->fetch_object())
        {
        echo $row->{"@p_userid"};
    
        }
    }
    
    0 讨论(0)
  • 2021-01-06 14:06

    Or even just do a "SELECT @id AS id" then $row->id will work fine. I always rename select columns to keep the name meaningful when necessary :-)

    BTW, you can simply concatenate the call and select @... (with a ; statement delimiter) and the RS will be the returned value. Unfortunately this returns a mutli-resultset and you need to flush the full set otherwise the subsequent queries will stall. See following examples:

    $db->multi_query( "CALL addNewUser($name,$age,@id);SELECT @id as id" );
    $db->next_result();            // flush the null RS from the call
    $rs=$db->store_result();       // get the RS containing the id
    echo $rs->fetch_object()->id, "\n";
    $rs->free();
    

    Alternatively add the select into the addNewUser and return a RS instead of out param

    $rs = $db->query( "CALL addNewUser($name,$age)" );
    echo $rs->fetch_object()->id, "\n";
    $rs->close();
    $db->next_result();            // flush the null RS from the call
    

    The first returns a multiquery (NULL, RS) set and the second a (RS, NULL) set, hence you can use a simple query() call which embeds the first fetch_object(), but you still need to flush the RS stack.

    0 讨论(0)
  • 2021-01-06 14:15

    Here is the working solution:

    enter code $res = $conn->multi_query( "CALL PROCNAME(@x);SELECT @x" );
    if( $res ) {
      $results = 0;
      do {
        if ($result = $conn->store_result()) {
          printf( "<b>Result #%u</b>:<br/>", ++$results );
          while( $row = $result->fetch_row() ) {
            foreach( $row as $cell ) echo $cell, "&nbsp;";
          }
          $result->close();
          if( $conn->more_results() ) echo "<br/>";
        }
      } while( $conn->next_result() );
    }
    $conn->close();
    
    0 讨论(0)
  • 2021-01-06 14:16

    Just $row->{"@id"} would work here. You can't use an stdClass as an array ($row[0]...).

    0 讨论(0)
  • 2021-01-06 14:20

    Alternatively, you can just fetch the data as an array using mysqli::fetch_assoc() and access the data using $row['@id'].

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