我已经阅读了关于php.net上的功能,但仍然没有回答我的问题。我知道C的初学者数量,我刚开始使用php。通常在C中,如果你要做一个while循环,那么需要有一些条件来将循环推进到不再有效的程度:
while (x >= 10)
{
printf("...";
printf("x \n";
x++;
}
然而,在我用于pm消息系统的php脚本中,我有一个像这样的while循环:
while($row2 = mysql_fetch_array($query))
接下来是:
{
echo "<table border=1>";
echo "<tr><td>";
echo "Message #: ";
echo $row['id'];
echo "</td></tr>";
echo "<tr><td>";
echo "To: ";
echo $row['to'];
echo "</td></tr>";
echo "<tr><td>";
echo "From: ";
echo $row['from'];
echo " ";
echo "</td></tr>";
echo "<tr><td>";
echo "Message: ";
echo $row['message'];
echo "</td></tr>";
echo "</br>";
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<table border="0">
<tr><td colspan=2></td></tr>
<tr><td></td><td>
<input type="hidden" name="id" maxlength="32" value = "<?php echo $row['id']; ?>">
</td></tr>
<tr><td colspan="2" align="right">
<input type="submit" name="delete" value="Delete PM # <?php echo $row['id']; ?>">
</td>
<td colspan="2" align="right">
<input type="submit" name="reply" value="Reply to <?php echo $row['from']; ?>">
</td></tr>
</table>
<?php } ?>
这究竟是如何工作的,从C背景看起来几乎就像这样会留在同一个地方,每次我们通过相同的“$ query”打印出相同的“数组获取”'行'循环....
我有没有办法写这篇文章,让我对正在发生的事情有更好的逻辑理解?喜欢说:
$i=0;
while ($row = ($i+mysql_fetch_array($query)) {
...
...
$i++;}
我知道这可能不起作用,但这个功能如何增加?是否有一种方法可以将其写入代码中可见的某种增量?
谢谢
答案 0 :(得分:11)
每次拨打mysql_fetch_array
时,它都会从您的查询中提取下一行。 while
循环保持返回true,而mysql_fetch_array
仍有一些东西要分配给变量$row2
。一旦它没有行,它就没有任何东西可以提供变量,并返回false。
ETA:关于你提到的最后一位,你可以在循环的每次迭代中有一个变量增量,就像在你的例子中一样,但这并不是完全必要的。您还可以通过在$var = mysql_num_rows($data)
循环之前执行while
之类的操作来查看已返回的行数。
答案 1 :(得分:3)
也许以下这个函数可以给你一些关于“循环工作时mysql_fetch_array如何工作?”的一些描述。
class test {
public $plus = -1;
public $data = array();
public $return = array();
function fetcharray(){
$this->plus++;
for($i = 0; $i < sizeof($this->data[$this->plus]); $i++){
$this->return[$i] = $this->data[$this->plus][$i];
}
if(sizeof($this->data[$this->plus]) < sizeof($this->data[($this->plus - 1)])){
for($i = sizeof($this->data[$this->plus]); $i < sizeof($this->data[($this->plus - 1)]); $i++){
$this->return[$i] = "";
}
}
return ($this->data[$this->plus]) ? $this->return : false;
}
}
$test = new test();
$test->data = array(
array("data00","data01","data02","data03","data04","data05"),
array("data10","data11","data12","data13","data04","data15"),
array("data20","data21","data22","data23","data24","data25"),
array("data30","data31","data32","data33","data34","data35"),
array("data40","data41","data42","data43","data44","data45")
);
while($array = $test->fetcharray()){
echo $array[0]." = ".$array[1]." = ".$array[2]." = ".$array[3]." = ".$array[4]." = ".$array[5]."<br />\n";
}
答案 2 :(得分:2)
你可以认为mysql_fetch_array()
类似于文件读取函数,它将返回每次返回一个新行,并在它到达结束时返回EOF。而不是EOF,mysql_fetch_array()
返回FALSE(0)。
在布尔表达式中,PHP将任何非0值计算为TRUE,因此下面的简单语法循环执行,每次将行分配给$ row变量,直到我们到达数据集的末尾:
while($row = mysql_fetch_array($query)) {
// Process row
...
}
PHP IDE实际上会抱怨条件中的赋值,这就是你应该编写相同代码以避免通知的方式:
// Get first row, or false if there were no rows
$row = mysql_fetch_array($query);
while ($row) {
// Process row
...
// Get next row
$row = mysql_fetch_array($query);
}
也许这种结构看起来更熟悉。
答案 3 :(得分:1)
mysql_fetch_array()是一个函数,如果你想从结果执行的查询中获取一行,你必须调用它,所以你可以描述它“mysql_fetch_array - 将结果行作为关联数组,一个数值数组,或两者都是“
方案是这样的:它返回一个与获取的行对应的数组,并将内部数据指针向前移动。 更多澄清:
$result = mysql_query("SELECT id, name FROM mytable");
$row = mysql_fetch_array($result, MYSQL_NUM);
1)$ result的类型是什么? 2)mysql_fetch_array使用什么类型工作?
我来回答一下, 1)$ result是来自mysql_query()的结果变量,此函数返回类型为 mysql result 的结果,此类型只能通过调用7个函数来创建:
mysql_db_query(), mysql_list_dbs(), mysql_list_fields(), mysql_list_processes(), mysql_list_tables(), mysql_query(), mysql_unbuffered_query()
可以由mysql_fetch_array() and mysql_db_name() and others
2)该功能的描述是:
array mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )
见mysql_fetch_array Doc