4

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

$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 类型的对象用作数组

4

5 回答 5

7

或者甚至只是做一个"SELECT @id AS id"then$row->id就可以了。我总是重命名选择列以在必要时保持名称有意义:-)

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

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

或者将选择添加到 addNewUser 并返回 RS 而不是 out 参数

$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 堆栈。

于 2012-07-27T22:08:51.370 回答
4

只是$row->{"@id"}会在这里工作。您不能将 anstdClass用作数组 ( $row[0]...)。

于 2012-07-27T18:07:31.537 回答
3

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

于 2012-07-27T18:10:01.983 回答
3

另一个正确的方法它工作正常:干杯!

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

    }
}
于 2015-11-26T19:19:34.303 回答
0

这是工作解决方案:

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();
于 2017-11-03T19:46:48.967 回答