5

我已经阅读了关于 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”打印出相同的“array fetch”“row”。 ..

有没有办法可以写这个让我对发生的事情有更好的逻辑理解?就像说:

$i=0;
while ($row = ($i+mysql_fetch_array($query)) {
...
...
$i++;}

我知道这可能行不通,但是这个函数如何自我增加?有没有办法在代码中实际显示某种增量的地方编写它?

谢谢

4

4 回答 4

11

每次调用mysql_fetch_array它都会从查询中提取下一行。该while循环一直返回 true 而mysql_fetch_array仍然有一些东西要分配给变量$row2。一旦它超出行数,它就没有任何东西可以提供变量,并且返回 false。

ETA:关于你提到的最后一点,你可以在循环的每次迭代中都有一个变量增量,就像你的例子一样,但这并不是完全必要的。您还可以通过在循环$var = mysql_num_rows($data)之前执行类似操作来查看返回了多少行。while

于 2012-05-08T17:13:37.030 回答
3

也许下面这个函数可以给你一些关于“mysql_fetch_array while loop如何工作的描述?”

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";
}
于 2014-10-27T05:06:28.590 回答
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);
}

也许这个结构看起来更熟悉。

于 2012-05-08T17:21:41.337 回答
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 结果的结果,该类型只能通过调用 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

于 2012-05-08T17:32:51.617 回答