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栈。

+0

嗨,请您详细说明您提供的第二条建议。谢谢:) – mtk 2012-07-28 12:56:03

+0

@mtk,对不起,我应该检查BTWs与我的代码:-(我使用第二个版本 – TerryE 2012-07-28 14:53:53

+0

嘿,非常感谢解释,所有的例子工作得很好,只是寻找一个解决方案,但得到了三个: ) – mtk 2012-07-28 15:10:20

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

+1

你需要引用的列名,以避免和通知等。 '@ id'变成''id''(除非你有一个名为'id'的定义常量)。 – cHao 2012-07-27 18:13:25

+0

@cHao:已更正。 – 2012-07-27 18:17:09

+0

@cHao。@ MadaraUchiha @ [email protected] – mtk 2012-09-19 06:11:00

或者,您可以使用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, "&nbsp;"; 
     } 
     $result->close(); 
     if($conn->more_results()) echo "<br/>"; 
    } 
    } while($conn->next_result()); 
} 
$conn->close();