Php 从准备好的语句多次调用存储过程

Php 从准备好的语句多次调用存储过程,php,mysql,stored-procedures,prepared-statement,Php,Mysql,Stored Procedures,Prepared Statement,这似乎是一些人遇到的Windows特定问题,但没有令人满意的结果。我还没有在我的Linux服务器上尝试这段代码 当使用准备好的语句多次调用存储过程时,Apache崩溃。 存储过程似乎返回了两个结果,即使是对于一个简单的SELECT*FROM users,也会导致下一次执行不起作用 我现在使用的解决方法是$mysqli->next_result()在每次执行之间 我的问题是,有没有人经历过这种情况?这是一个bug还是我只是做错了什么 视窗7 wamp服务器 -Apache 2.4.2 -Mysql

这似乎是一些人遇到的Windows特定问题,但没有令人满意的结果。我还没有在我的Linux服务器上尝试这段代码

当使用准备好的语句多次调用存储过程时,Apache崩溃。 存储过程似乎返回了两个结果,即使是对于一个简单的
SELECT*FROM users
,也会导致下一次执行不起作用

我现在使用的解决方法是
$mysqli->next_result()在每次执行之间

我的问题是,有没有人经历过这种情况?这是一个bug还是我只是做错了什么

视窗7 wamp服务器 -Apache 2.4.2 -Mysql 5.5.24 -PHP 5.4.3

/* MySQL code */
DELIMITER $$
PROCEDURE `get_data`(IN var1 VARCHAR(45),IN var2 VARCHAR(45) )
BEGIN
    SELECT * 
    FROM data_table
    WHERE `data1` = var1 AND `data2` = var2;
END
/* End MySQL code */

代码显然是为了调试和stackoverflow而修改的


使用普通查询的确切代码,即
SELECT*FROM users
工作正常,直到调用存储过程为止,即
call get_data(?)

您的过程很可能根本不会返回任何数据,因为
data1
不能同时具有两个不同的值。在这种情况下,你为什么要使用程序?发布真实代码,因为还不清楚“存储过程似乎返回了两个结果”是什么意思。我将data1更改为data2,即从实际代码更改为data2,只是更改了变量名。Prepared语句只能处理接收一个结果集,而Prepared语句返回两个结果集。根据其他人的经验,它似乎返回了数据以及“查询确定”结果。打破一切,这可能会有帮助。结果比预期的要多。另外,请阅读的和部分,特别是示例3和4(输出)的最后一部分。这里有一个我以前发布过的。@谢谢,PHP页面很有用,我忽略了“…有其他存储过程结果集对用户隐藏…”所以这是正常行为,但不能解释为什么它会崩溃Apache并且不返回错误。您对不同步错误的解决方案将起作用,它只解决从查询中检索多个结果集的问题。这不是我的问题所在,它是在一条准备好的语句上执行多次。所以它看起来像$stmt->next_result();是必需的,但在阅读示例3$result->free()后更合适;
<?php
if( !($stmt = $mysqli->prepare("CALL get_data(?,?)")) )
    die("Prepare failed: (" . $stmt->errno . ") " . $stmt->error);


$var1 = "some_data_1";
$var2 = "some_data_2";
if( $stmt->bind_param("ss", $var1, $var2) )
{
    if( $stmt->execute() )
    {
        echo "Execute one complete.";
    }
    else
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
else
    echo "Bind failed: (" . $stmt->errno . ") " . $stmt->error;


/* Current fix to clear stray results sent from the stored procedure */
$stmt->next_result();


$var2 = "some_data_555";
if( $stmt->bind_param("ss", $var1, $var2) )
{
    if( $stmt->execute() )
    {
        echo "Execute two complete.";
    }
    else
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
else
    echo "Bind failed: (" . $stmt->errno . ") " . $stmt->error;
?>