我使用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类型的对象作为数组
答案 0 :(得分:6)
或者只是做一个"SELECT @id AS id"
然后$row->id
将正常工作。我总是重命名选择列以在必要时使名称有意义: - )
$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, " ";
}
$result->close();
if( $conn->more_results() ) echo "<br/>";
}
} while( $conn->next_result() );
}
$conn->close();