Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过存储过程中的MySQL结果进行循环_Php_Mysql_Stored Procedures_Mysqli - Fatal编程技术网

Php 通过存储过程中的MySQL结果进行循环

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

为了简单起见,我有以下SQL查询:

"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(); //!!!
}