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

mtk*_*mtk 3 php mysql out-parameters

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

$rs = $mysqli->query("CALL addNewUser($name,$age,@id)");
Run Code Online (Sandbox Code Playgroud)

这里,@ id是out参数.接下来,我触发以下查询以获取out参数的值:

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

输出var_dump如下.

object(stdClass)#5 (1) { ["@id"]=> string(6) "100026" }
Run Code Online (Sandbox Code Playgroud)

所以,现在我想要检索@id我无法获取的值.我试过$row[0]->{@id}但这给出了以下错误:

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

Ter*_*ryE 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();
Run Code Online (Sandbox Code Playgroud)

或者将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
Run Code Online (Sandbox Code Playgroud)

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