Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.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存储过程只返回一个Select查询_Php_Mysql_Sql_Stored Procedures - Fatal编程技术网

Php MySQL存储过程只返回一个Select查询

Php MySQL存储过程只返回一个Select查询,php,mysql,sql,stored-procedures,Php,Mysql,Sql,Stored Procedures,我有以下存储过程: CREATE PROCEDURE `Get_Events_And_Deadlines_By_User`(IN `intervalStart` INT, IN `intervalEnd` INT) BEGIN IF (intervalStart != 0 AND intervalEnd != 0) THEN SELECT 1 AS `test`; ELSEIF (intervalStart != 0 AND int

我有以下存储过程:

CREATE PROCEDURE `Get_Events_And_Deadlines_By_User`(IN `intervalStart` INT, IN `intervalEnd` INT)
    BEGIN
        IF (intervalStart != 0 AND intervalEnd != 0) THEN
            SELECT 1 AS `test`;
        ELSEIF (intervalStart != 0 AND intervalEnd = 0) THEN
            BEGIN
                SELECT 2 AS `test`;
                IF ((SELECT FOUND_ROWS())=1) THEN
                    SELECT 3 AS `test`;
                END IF;
            END;
        ELSE
            SELECT 4 AS `test`;
        END IF;
    END

当我通过_User1,0运行call Get_Events_和_detailures_时,我只得到select查询,结果是2,if语句中的select永远不会返回。在返回存储过程之前,似乎只执行遇到的第一个select查询。为什么会这样?我能做些什么来解决这个问题?我希望if语句中的select查询是if保持不变时的唯一结果。

您的过程返回多个结果集。 PDO:

我的测试:

mysql>分隔符$$ mysql>删除过程(如果存在)`Get\u Events\u和截止日期\u By\u User`$$ 查询正常,0行受影响,1条警告0,00秒 mysql>通过用户创建过程“获取事件”和“截止日期”` ->在“intervalStart”INT中, ->IN`intervalEnd`INT -> ->开始 ->如果intervalStart!=0和intervalEnd!=0那么 ->选择1作为“测试”; ->ELSEIF intervalStart!=0和intervalEnd=0,则 ->选择2作为“测试”; ->如果选择FOUND_ROWS=1,则 ->选择3作为“测试”; ->如果结束; ->否则 ->选择4作为“测试”; ->如果结束; ->结束$$ 查询确定,0行受影响0,00秒 mysql>分隔符; mysql>通过用户调用“获取事件”和“截止日期”`1,0; +---+ |试验| +---+ | 2 | +---+ 设置为1行0.00秒 +---+ |试验| +---+ | 3 | +---+ 设置为1行0.00秒 查询确定,0行受影响0,00秒 之后:。

Q:我只得到结果为2的select查询,if语句中的select永远不会返回。在返回存储过程之前,似乎只执行遇到的第一个select查询。为什么会这样

答:该过程正在返回第二个结果集。客户端负责请求第二个和后续结果集。在PHP中,这需要调用mysqli mysqli_next_result或PDO nextRowset函数,具体取决于您使用的接口库

但这似乎不是你真正的问题

问:我能做些什么来解决这个问题

答:这取决于你想要达到什么样的行为。一个过程可以返回多个结果集,客户端也可以处理这些结果集

Q:我希望if语句中的select查询是if保持时的唯一结果

答:您希望运行示例过程中的SELECT 2查询,但不希望该过程将其作为结果集返回。您只想知道查询返回的行数,并根据返回的行数有条件地控制存储程序中的流

有几种构造可以用来实现这一点。可以在过程中运行查询,而无需将查询结果作为resultset返回

使用SELECT EXISTS子查询测试超过零行

我怀疑您不是真的想使用find_ROWS函数;我怀疑您不想测试找到的行数是否正好等于1

如果您试图实现的是确定特定查询是否将返回一行或多行,则可以使用如下模式:

      IF ( SELECT EXISTS ( SELECT 2 AS `test` ) ) THEN
         SELECT 2 AS `test`;
      ELSE
         SELECT 3 AS `test`;
      END IF;
   DECLARE myrowcount INT;
   SELECT COUNT(1) INTO myrowcount FROM (subquery) q
   IF ( myrowcount = 1 ) THEN 
      -- subquery returned exactly one row
   ELSE
      -- subquery either returned zero rows, or returned more than one row
   END IF;
假设示例代码中的查询保证只返回一行,我只是在猜测您想要实现什么

如果您有一个查询,并且希望查看该查询是否返回一行,则可以将其包装在EXISTS条件中,该条件将返回布尔值

如果子查询返回至少一行,则EXISTSsubquery返回值1;如果子查询不返回行,则返回0

该构造可在IF中用于控制存储程序中的逻辑流

   IF ( SELECT EXISTS(subquery) ) THEN
      -- subquery returned at least one row, so do something
   ELSE
      -- subquery didn't return any rows, so do something else
   END IF;
使用SELECT COUNT1从子查询q获取精确的行数

如果测试子查询中是否存在行是不够的;如果出于某种原因需要获取子查询返回的精确行数,则可以使用计数聚合。例如:

  SELECT COUNT(1) FROM (subquery) q
为了避免将该查询的结果作为过程的结果集返回,可以将该查询返回的值分配到过程变量或用户定义的变量中。假设您在过程的顶部声明了一个过程变量,如下所示:

      IF ( SELECT EXISTS ( SELECT 2 AS `test` ) ) THEN
         SELECT 2 AS `test`;
      ELSE
         SELECT 3 AS `test`;
      END IF;
   DECLARE myrowcount INT;
   SELECT COUNT(1) INTO myrowcount FROM (subquery) q
   IF ( myrowcount = 1 ) THEN 
      -- subquery returned exactly one row
   ELSE
      -- subquery either returned zero rows, or returned more than one row
   END IF;
你可以这样做:

      IF ( SELECT EXISTS ( SELECT 2 AS `test` ) ) THEN
         SELECT 2 AS `test`;
      ELSE
         SELECT 3 AS `test`;
      END IF;
   DECLARE myrowcount INT;
   SELECT COUNT(1) INTO myrowcount FROM (subquery) q
   IF ( myrowcount = 1 ) THEN 
      -- subquery returned exactly one row
   ELSE
      -- subquery either returned zero rows, or returned more than one row
   END IF;
可以使用用户定义的变量代替过程变量。我的首选是使用过程变量,如果不需要在过程执行之后保留行数

使用用户定义变量的最大缺点是它引入了不必要的歧义。稍后阅读代码的人会怀疑在过程结束后是否需要存储在用户定义变量中的值。他们不知道这是否是一个有目的的,有意识的副作用的程序,是依赖于其他东西。
在我看来,避免歧义是使用过程变量的充分理由。

根据您在评论中提到的内容,我认为您正在寻找以下内容。我所做的只是添加一个新参数作为过程的输出,而不是使用SELECT来填充test的值,我使用了一个从外部发送到函数的变量,并从外部接收更新的值,然后使用SELECT@test来获取您的值,它一次只会是一个值,而不是两个

如果您对我在程序中留下的评论有疑问,我建议您阅读更多


我希望它能有所帮助。

您也可以发布您的PHP代码吗?该过程在2个选择中返回多个结果集,您的代码不仅需要循环遍历每个结果集的记录,还需要循环遍历多个结果集resultsets@vmachan我现在没有任何PHP代码,我只在phpmyadmin中对其进行了测试,并且只从if语句之前的第一个查询中获得了一个结果集。更改:如果SELECT FOUND_ROWS==1,那么由if SELECT FOUND_ROWS=1进行测试。@wchiquito抱歉,这是我问题中的一个输入错误,我已对其进行了编辑。这个问题仍然存在。如果我一起删除if语句,并且只选择了:选择2作为测试,我甚至会遇到问题;选择3作为测试@谢谢你的回答!有没有办法从存储过程返回第二个查询?是的,跳过第一个查询。实际的查询是什么来代替选择2作为“test”;?对于您来说,在tablename中的@nmrows中使用SELECT Count*这样的选项可能会更容易,其中。。。。然后选中@nmrows