循环时mysql_fetch_array。它是如何工作的?

时间:2012-05-08 17:11:57

标签: php mysql increment

我已经阅读了关于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++;}

我知道这可能不起作用,但这个功能如何增加?是否有一种方法可以将其写入代码中可见的某种增量?

谢谢

4 个答案:

答案 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