当我执行以下操作时:
while($row = mysql_fetch_array(mysql_query($query))){}
它是不定式while循环。但这不是:
$query = mysql_query($query);
while($row = mysql_fetch_array($query)){}
它们之间有什么区别?PHP是如何执行的?
假设您有一个包含以下数据的表student
id name
1 JD
2 Dev
3 Pallavi
现在,如果您的$query = "SELECT * FROM student"
案例:1
while($row = mysql_fetch_array(mysql_query($query))) { ... }
对于第一次迭代,执行将是
- mysql_query($query)
- mysql_fetch_array(get_array_obtined_from_firstrongtep)
- 将当前行分配给$row
在第一步中,您将获得学生表的所有3条记录。然后在第三步中获取记录集,将行分配给$row。
现在,由于您的3条语句处于while循环的条件下,它将始终为TRUE,因为它将在每次迭代循环时执行您的查询,执行所有语句,使其成为无限循环。
案例:2
$query = mysql_query($query);
while($row = mysql_fetch_array($query)){}
在这里,查询被执行ONCE,然后每次光标递增时,将一行分配给$row,直到结果集结束。
因此,当结果集结束时,它停止。
让我们寻找
while($row = mysql_fetch_array(mysql_query($query))){}
在这种情况下,sql查询的执行是在while loop
中进行的,这意味着它本身就是递归的,因此每次$row
获得新数据时,意味着while loop
不会在任何地方结束。
$query = mysql_query($query);
while($row = mysql_fetch_array($query)){}
在这种情况下,您在执行while loop
之前执行query
。现在您在$query
变量中有了一组特定的结果。CCD_ 11有一些限制,比如0或最大记录。因此loop
将在某个时刻停止执行。
WHILE循环的工作原理:
您需要了解while
循环何时停止迭代。while循环如下所示:
while (expression) {
statement
}
在开始时,它将首先计算表达式,如果它返回
TRUE
(或等效于TRUE
),则它将执行{...}
块内的语句,否则,它将不执行任何内容。在完成该部分的执行之后,它将再次对表达式求值。如果它再次返回TRUE
,它将再次执行脚本,否则,它将停止在这里。此循环将持续到表达式返回FALSE
为止。
两个表达式之间的差异:
现在看看你的表情块
mysql_fetch_array(mysql_query($query))
它总是会返回TRUE
,因为它每次都在运行mysql_query,每次都返回结果,并且mysql_fetch_array总是能够获取第一行,这使得循环每次都可以执行语句块。这就是它变成无限循环的原因。
$row = mysql_fetch_array($query)
在这里,您以前(只运行过一次)运行过查询,并且在while表达式中通过结果获取查询。每次调用mysql_fetch_array()
时,都会得到第一排、第二排,依此类推。当您完成提取结果集中的最后一行时,mysql_fetch_array()
将返回FALSE
,这将停止while
循环的迭代。
推荐阅读:
- http://php.net/manual/en/control-structures.while.php
- http://php.net/manual/en/function.mysql-fetch-array.php
- http://php.net/manual/en/function.mysql-query.php
注意:考虑尽快切换到
mysqli_query()
/mysqli_fetch_array()
。PHP 7将不支持旧函数。
在第一个例子中,每次循环进入新的迭代时,PHP都会执行查询,因此光标(每次迭代结果时指向前进行的指针)不会在结果数组中向前移动。您每次都会得到一大堆相同的结果,而且每次都是从头开始,因为查询刚刚执行。
在第二个例子中,查询只执行一次,然后PHP在整个结果数组上迭代,同时光标向前移动,每次迭代都不会重置为零。那可能正是你所需要的。