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

时间:2012-07-27 18:03:37

标签: php mysql out-parameters

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

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

5 个答案:

答案 0 :(得分:6)

或者只是做一个"SELECT @id AS id"然后$row->id将正常工作。我总是重命名选择列以在必要时使名称有意义: - )

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

$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)集,因此你可以使用一个简单的query()调用嵌入第一个fetch_object(),但你仍然需要刷新RS堆栈。

答案 1 :(得分:4)

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

答案 2 :(得分: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"};

    }
}

答案 3 :(得分:2)

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

答案 4 :(得分: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();