Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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 嵌套的While循环仅在循环内部正确运行_Php_Mysql_While Loop - Fatal编程技术网

Php 嵌套的While循环仅在循环内部正确运行

Php 嵌套的While循环仅在循环内部正确运行,php,mysql,while-loop,Php,Mysql,While Loop,我有两个while循环,用来运行一些MySQL数据 第一个while循环遍历一组报告并检查表中存储的“state”(如在美国) 在该循环中,我正在用while循环检查第二个表中的“state”,如果状态匹配,我会将一些信息推送到数组中。为了简单起见,我去掉了其他代码 基本上,我从第一个while循环开始,将所有信息记录到控制台,它成功地循环了表中的所有条目 然后,我将嵌套的while循环放在那里,当我尝试向控制台发出警报或将其记录到控制台时,它只循环通过父循环中第一个条目的实例 我的意思是,在$

我有两个while循环,用来运行一些MySQL数据

第一个while循环遍历一组报告并检查表中存储的“state”(如在美国)

在该循环中,我正在用while循环检查第二个表中的“state”,如果状态匹配,我会将一些信息推送到数组中。为了简单起见,我去掉了其他代码

基本上,我从第一个while循环开始,将所有信息记录到控制台,它成功地循环了表中的所有条目

然后,我将嵌套的while循环放在那里,当我尝试向控制台发出警报或将其记录到控制台时,它只循环通过父循环中第一个条目的实例

我的意思是,在$row_wind循环中,第一个条目是CT(康涅狄格州)。当我注销父循环时,它会记录该表中的所有内容(CT是第一个)。当我使用下面的代码时,它只记录CT,然后记录子循环中的所有条目,但之后不会对父循环进行计数。我不能在循环时嵌套吗

while($row_wind = mysqli_fetch_array($sql_wind_result)){
    while($row_alert = mysqli_fetch_array($result_user_alerts)){
        echo "<script>alert('".$row_wind['state']." ".$row_alert['state']."');</script>";
    }
}
while($row\u wind=mysqli\u fetch\u数组($sql\u wind\u result)){
while($row\u alert=mysqli\u fetch\u array($result\u user\u alerts)){
回声“警报(“$row_wind['state']”..“$row_alert['state']);”;
}
}

mysqli_fetch_array
类似于
array_pop()
,它一旦获取结果,就不会再获取该结果

所以我猜你的
$row\u wind
循环实际上运行得很好,但是第二次通过
$row\u alert
循环查找更多结果时,发现它已经运行过了(在
$row\u wind='CT'的循环中)

如果您将一些调试信息放在$row\U wind循环内,但放在$row\U alert循环外,您应该会看到区别

要解决此问题,您必须在内部循环之前重新运行$result\u user\u alerts查询,或者-如果内部查询不依赖于状态,可能会更好-事先运行
mysqli\u fetch\u all()
来获取内部循环的所有结果,然后使用
foreach()
while()
通过内部循环遍历生成的数组。那样你只需要取一次

如果您没有可用的
mysqli\u fetch\u all()

$user_alerts = array();
while($row_alert = mysqli_fetch_array($result_user_alerts)){
    $user_alerts[] = $row_alert;
}

需要注意的是:这种结构似乎可以通过一些更好的查询更好地执行—我不知道应用程序的细节,但是当您在PHP循环中匹配两个SQL查询的值时,数据库通常可以更快、更高效地进行匹配。

这完全有道理。我从来没有这样想过。我将研究一个单独的解决方案,它将为我指明正确的方向。非常感谢。mysqli_fetch_all()似乎不再有效。还有其他类似的函数可以将所有信息存储到一个数组中吗?我自己使用PDO,但看起来您必须设置一些其他东西才能使用fetch_all。您仍然可以通过它循环并手动构建阵列。我在回答中添加了一个例子,我还发现如果我在父while循环内但在嵌套循环外进行新的SQL查询,它将正确运行。我假设这是因为它是一个全新的fetch_数组,用于一个新的查询,并且可以正常工作。这适用于我现在正在做的事情,因为每次运行时都会查询的数据量不是很大。是的,新的sql查询当然会重新获取行并重新填充查询池。我在回答中也提到了这一点,但由于数据库上的负载,所以不要建议这样做。