PHP-MySQL从存储过程中获取输出参数的值
问题描述:
我使用mysqli
从PHP调用了一个MySQL存储过程。这有一个输出参数。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 Fatal error: Cannot use object of type stdClass as array
答
甚至只是做一个"SELECT @id AS id"
然后$row->id
将正常工作。我总是选择重命名列,以保持名称有意义必要时:-)
顺便说一句,你可以简单地拼接呼叫,并选择@ ......(用;语句分隔符)和RS将返回值。不幸的是,这会返回一个mutli结果集,你需要刷新整个集合,否则随后的查询将停止。见以下实施例:
$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函数并返回,而不是出PARAM一个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
第一返回设定multiquery(NULL,RS)和第二一个(RS ,NULL)set,因此你可以使用一个简单的query()调用来嵌入第一个fetch_object(),但你仍然需要刷新RS栈。
答
或者,您可以使用mysqli::fetch_assoc()
将数据作为数组提取并使用$row['@id']
访问数据。
答
另一种正确的方法其工作正常:干杯!
$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"};
}
}
答
这里是工作的解决方案:
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();
嗨,请您详细说明您提供的第二条建议。谢谢:) – mtk 2012-07-28 12:56:03
@mtk,对不起,我应该检查BTWs与我的代码:-(我使用第二个版本 – TerryE 2012-07-28 14:53:53
嘿,非常感谢解释,所有的例子工作得很好,只是寻找一个解决方案,但得到了三个: ) – mtk 2012-07-28 15:10:20