通过php脚本检索mysql存储过程的out参数时出现问题

通过php脚本检索mysql存储过程的out参数时出现问题,php,mysql,stored-procedures,Php,Mysql,Stored Procedures,嗨,我有一个简单的MYSQL存储过程,它有一个IN(int)和一个OUT(int)参数。 我从PHP脚本调用存储过程 存储过程代码: DELIMITER $$ USE `testing`$$ DROP PROCEDURE IF EXISTS `test_sp_inout_params`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `test_sp_inout_params`(IN username VARCHAR(30), OU

嗨,我有一个简单的MYSQL存储过程,它有一个IN(int)和一个OUT(int)参数。 我从PHP脚本调用存储过程

存储过程代码:

  DELIMITER $$
  USE `testing`$$

  DROP PROCEDURE IF EXISTS `test_sp_inout_params`$$

  CREATE DEFINER=`root`@`localhost` PROCEDURE `test_sp_inout_params`(IN username VARCHAR(30), OUT user_id INT)
  BEGIN
   INSERT INTO users (`name`) VALUES (username);
   SET user_id = LAST_INSERT_ID();
  END$$

 DELIMITER ;
我可以通过以下方式从mysql查询窗口运行存储过程:

 CALL test_sp_inout_params('TestName', @user_id);
 SELECT @user_id
但从PHP脚本中,我发现了错误..:(

[已编辑] 上述PHP脚本在单独运行时执行得非常完美。 但是我有另一个存储过程..当我在上面的php脚本之前调用它时,我得到了类似的警告消息。 因此,我使用的脚本是(在上面提到的php脚本之前):

调用第二个存储过程时出现了什么问题

谁能帮帮我吗

提前感谢,,
SuryaPavan

我最近在MySQLI上也遇到了问题。我正在使用MySQLI::multi_query,但我认为这可能也是您的解决方案。在您调用查询后,请尝试使用此函数,并告诉我它是否恢复了您的预期。鉴于您只执行一个查询,而不是多个查询,我很抱歉当然你也可以从这个功能中去除一些脂肪

public function getResultSets() {
    $retVal = array();
    do {
        if ($result = $this->mysqli->store_result())
            $retVal[] = $result;
    } while ($this->mysqli->next_result());
    return $retVal;
}
但是,我要说的是,存储过程调用不会返回任何内容。如果希望返回,则必须设置参数并传递它们。例如,如果我有一个包含2个IN和2个out的存储过程,我会将其传递到MySQLI::multi_查询中(它的multi_查询部分意味着您可以指定多个查询,以与mysql workbench中相同的方式传递)


然后,getResultSets()将返回一个数组,其中包含每个查询的结果(只要结果集中有某些内容,初始存储过程调用将不返回任何内容,因此mysqli对象中存在一个空结果集,我们将在函数中处理该结果集)。

警告:mysqli_fetch_assoc()期望参数1是mysqli_result,null在……….var_dump($row)==>NULLHmm中给出,如果是这种情况,那么我很抱歉。我自己刚刚开始处理这个问题。基本上,您可以将您在MySQL工作台中编写的任何内容复制到一个多_查询中,它将以相同的方式运行。您在上面写的“调用test_sp_no_params()调用test_sp_inout_params('surya',@user_id;);选择@user_id;”),实际上会调用test_sp_no_params,后面跟着test_sp_inout_params,后面跟着SELECT语句。它是根据我的经验按顺序执行的。好的,谢谢yaar的回复。这个问题通过使用mysqli_多参数查询($conn,“CALL test_sp_no_params();调用test_sp_inout_params('surya',@user_id;);选择@user_id;)。但执行多查询并不总是正确的吗?我希望这些存储过程一个接一个地单独执行:(另外,你说我会说,存储过程调用不会返回任何结果。如果存储过程只是“
SELECT*FROM users
”,则即使没有OUT参数,存储过程调用也会返回结果集。此外,如果希望一次只执行一个结果集(我没有这样做,所以不要在其上引用我的话)我认为您可以使用mysqli_query并传入要运行的单行查询。根据我的理解,两者之间的区别在于,multi_query运行多个以分号分隔的查询。检索结果应采用相同的格式。
    $rs1 = mysqli_query($conn, "CALL test_sp_no_params()");
    $arr = array();
    while($row1 = mysqli_fetch_assoc($rs1))
        $arr[] = $row1;
public function getResultSets() {
    $retVal = array();
    do {
        if ($result = $this->mysqli->store_result())
            $retVal[] = $result;
    } while ($this->mysqli->next_result());
    return $retVal;
}
$thisGuy = new MySQLI(inputParamsHere);
$retVal = $thisGuy->multi_query("CALL myDB.storedProc($var1, $var2, @return1, @return2); select @return1 as firstValue, @return2 as secondValue;");
if ($retVal) getResultSets();