PHP-MySQL从存储过程中获取out参数的值


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

我使用mysqli从PHP调用了一个MySQL存储过程。这有一个out参数。

$rs = $mysqli->query("CALL addNewUser($name,$age,@id)");

这里,@id是out参数。接下来,我启动以下查询以获取out参数的值:

$rs2 = $mysqli->query("SELECT @id");
while($row = $rs->fetch_object()){
    echo var_dump($row);
}

var_dump的输出如下。

object(stdClass)#5 (1) { ["@id"]=> string(6) "100026" }

所以,现在我想检索@id的值,但我无法检索。我尝试了$row[0]->{@id},但出现了以下错误:

PHP致命错误:无法将stdClass类型的对象用作数组

或者,即使只执行"SELECT @id AS id"$row->id也会正常工作。我总是重命名选定的列,以在必要时保持名称的意义:-)

顺便说一句,你可以简单地连接调用并选择@。。。(带有;语句分隔符),RS将是返回值。不幸的是,这会返回一个mutli结果集,您需要刷新完整集,否则后续查询将暂停。参见以下示例:

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

或者,将select添加到addNewUser中,并返回一个RS而不是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

第一个返回多查询(NULL,RS)集,第二个返回(RS,NULL)集,因此可以使用嵌入第一个fetch_object()的简单query()调用,但仍需要刷新RS堆栈。

这里只需要$row->{"@id"}。不能将stdClass用作数组($row[0]...)。

或者,您可以使用mysqli::fetch_assoc()将数据作为数组获取,并使用$row['@id']访问数据。

另一个正确的方法很好:干杯!!

$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"};
    }
}

以下是工作解决方案:

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