4

を使用してPHPからMySQLストアドプロシージャを呼び出しましたmysqli。これには1つの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型のオブジェクトを配列として使用できません

4

5 に答える 5

7

"SELECT @id AS id"または、それを実行するだけでも問題なく$row->id動作します。必要に応じて名前を意味のあるものに保つために、常にselect列の名前を変更します:-)

ところで、呼び出しを連結して@ ...(;ステートメント区切り文字を使用)を選択すると、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();

または、selectをaddNewUserに追加し、outparamの代わりにRSを返します。

$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

1つ目はマルチクエリ(NULL、RS)セットを返し、2つ目は(RS、NULL)セットを返すため、最初のfetch_object()を埋め込む単純なquery()呼び出しを使用できますが、RSスタックをフラッシュする必要があります。

于 2012-07-27T22:08:51.370 に答える
4

ここ$row->{"@id"}で動作します。stdClassを配列として使用することはできません( $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 に答える