【问题标题】:PHP - MySQL gets value of out parameter from a stored procedurePHP - MySQL 从存储过程中获取 out 参数的值
【发布时间】:2012-07-26 10:51:41
【问题描述】:

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

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

这里,@id 是输出参数。接下来,我触发以下查询以获取 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 类型的对象作为数组

【问题讨论】:

    标签: php mysql out-parameters


    【解决方案1】:

    或者甚至只是做一个"SELECT @id AS id" 然后$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 堆栈。

    【讨论】:

    • 您好,您能否详细说明您提出的第二条建议。谢谢:)
    • @mtk,对不起,我应该对照我的代码检查 BTW :-( 我使用了第二个版本。
    • 嘿,非常感谢您的解释。所有示例都运行良好。正在寻找一种解决方案,但得到了三种解决方案:)
    【解决方案2】:

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

    【讨论】:

    • 您需要引用列名,以避免通知等。 @id 变为 'id'(除非您定义了一个名为 id 的常量)。
    • @cHao .@MadaraUchiha @ exapmle@abc.com
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 你拯救了我的一天 :) 干杯!!
      【解决方案5】:

      这是可行的解决方案:

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

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 1970-01-01
        • 2023-02-08
        • 1970-01-01
        • 2014-10-14
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多