Php 通过存储过程中的MySQL结果进行循环
为了简单起见,我有以下SQL查询:Php 通过存储过程中的MySQL结果进行循环,php,mysql,stored-procedures,mysqli,Php,Mysql,Stored Procedures,Mysqli,为了简单起见,我有以下SQL查询: "SELECT id,name FROM employees WHERE birthdate<'$dymd'" 问题是,在存储过程中有记录的情况下,为什么我需要显式地推送记录指针!?为什么fetch_assoc()不像前面的例子那样为我执行此操作 更重要的是,上面的代码只适用于从每个PHP页面的存储过程中检索到的一个结果集。如果对于第二个存储过程,在同一个PHP页面上有两个存储过程(例如CALL YoungEmployees()和CALL oldsem
"SELECT id,name FROM employees WHERE birthdate<'$dymd'"
问题是,在存储过程中有记录的情况下,为什么我需要显式地推送记录指针!?为什么fetch_assoc()不像前面的例子那样为我执行此操作
更重要的是,上面的代码只适用于从每个PHP页面的存储过程中检索到的一个结果集。如果对于第二个存储过程,在同一个PHP页面上有两个存储过程(例如CALL YoungEmployees()和CALL oldsemployees()),则会收到前面提到的错误消息。如果我使用标准查询(不是来自存储过程),那么它工作得很好-两个结果集都正确地显示在一个页面上 根据@jurisegregrov评论,解决方案是
//first stored procedure
$sql1="CALL YoungEmployees('$dymd')";
if($rst1=$mysqli->query($sql1))
{
while($row1=$rst1->fetch_row())
{
...
}
$rst1->close();
$mysqli->next_result(); //!!!
}
//second stored procedure
$sql2="CALL OldEmployees('$dymd')";
if($rst2=$mysqli->query($sql2))
{
while($row2=$rst2->fetch_row())
{
...
}
$rst2->close();
$mysqli->next_result(); //!!!
}
据我所见,从标准查询和存储过程检索的结果集之间的区别在于,存储过程返回多个结果集,mysqli需要以不同的方式处理它们。@JurgisGregov非常感谢-这就是解决方案!只需在每次检索存储过程后放置$mysqli->next_result()!虽然这与PHP手册中关于存储过程()的规定相反,即不能使用$msqli->query(),但这对我来说是有效的。注意:不要忘记数据库用户必须具有运行(调用)存储过程的EXECUTE权限!
CREATE PROCEDURE GetEmployees(IN dymd DATE)
READS SQL DATA
BEGIN
SELECT id,name FROM employees WHERE birthdate<dymd;
END;
$sql="CALL GetEmployees('$dymd')";
$rst=$mysqli->query($sql);
if($rst->num_rows)
{
do
{
$row=$rst->fetch_assoc();
...
}
while($mysqli->next_result());
$rst->free();
}
//first stored procedure
$sql1="CALL YoungEmployees('$dymd')";
if($rst1=$mysqli->query($sql1))
{
while($row1=$rst1->fetch_row())
{
...
}
$rst1->close();
$mysqli->next_result(); //!!!
}
//second stored procedure
$sql2="CALL OldEmployees('$dymd')";
if($rst2=$mysqli->query($sql2))
{
while($row2=$rst2->fetch_row())
{
...
}
$rst2->close();
$mysqli->next_result(); //!!!
}