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

5

我已经在php.net上阅读了有关该函数的信息,但仍未回答我的问题。我知道一些C语言的基础知识,并且刚开始使用php。通常在C语言中,如果要执行while循环,则需要一些条件来推进循环,直到不再有效,如下所示:

while (x >= 10)  
{ 
    printf("..."; 
    printf("x \n"; 
    x++; 
}

然而,在我为私信消息系统使用的 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++;}

我知道这可能行不通,但是这个函数如何自增?是否有一种编写方式可以使其在代码中实际显示出某种增量?

谢谢


我建议你阅读PHP文档,以便更好地理解。该函数基本上是在处理查询结果的资源句柄。如果没有更多的结果需要返回,该函数将返回FALSE,因此while循环将被评估为FALSE。 - Mark
请停止使用古老的 mysql_* 函数编写新代码。它们已不再维护,社区已开始弃用过程。相反,您应该了解有关预处理语句的信息,并使用 PDOMySQLi 中的其中一个。如果您有兴趣学习,这里有一个相当不错的与PDO相关的教程 - Madara's Ghost
4个回答

11

每次调用 mysql_fetch_array 函数,它都会从查询结果中提取下一行。那个 while 循环在 mysql_fetch_array 函数仍有剩余内容可分配给变量 $row2 时返回 true。一旦没有更多的行了,它就无法将任何内容赋给变量,并返回 false。

ETA: 关于你提到的最后一点,你可以像你的示例那样在循环的每次迭代中使变量递增,但这并非完全必要。你也可以通过执行类似于 $var = mysql_num_rows($data) 的代码来查看有多少行被返回,在进入 while 循环之前进行。


好的,假设我可以将 mysql_fetch_array 函数中的每个迭代存储到对象中,以便按字母顺序排列页面上的消息,并按顺序将来自同一人的消息分组,而不是仅一次打印出存储在数据库中的每条消息(如上面代码中所执行的操作)?如果可以这样做,是否有更简单的方法而不必将 $ row 变量保存为对象,或者这样做实际上会使我的代码更清晰易懂?像那样的对象会减慢页面吗?谢谢。 - 1337475
肯定可以存储它们;您的代码只是回显每行的一些部分,但您也可以将整个行(或其中的某些部分)轻松地分配给对象和/或数组。个人而言,在分组时,我总是在运行时完成。我按SQL查询中的项目顺序排序,设置一个空变量(例如 $group),然后在输出之前进行检查:if ($row2['name']!=$group) { $group = $row2['name']; // 更多代码 } - David Millar

3
也许下面的函数可以为您提供关于“mysql_fetch_array while循环如何工作”的简要说明?
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
你可以将mysql_fetch_array()看作类似于文件读取函数,每次返回一行新数据并在结束时返回EOF。但是,mysql_fetch_array()返回FALSE(0)而不是EOF。在布尔表达式中,PHP将任何非0值视为TRUE,因此简单的语法如下循环遍历,每次将行分配给$ row变量,直到我们到达数据集的末尾。
while($row = mysql_fetch_array($query)) {
  // Process row
  ...
}

PHP集成开发环境实际上会对条件中的赋值进行警告,为了避免该通知,您应该按照以下方式编写相同的代码:

// 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);
}

也许这种结构更加熟悉。

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() 和 mysql_db_name() 等

2) 函数的描述是: array mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] ) 请参见mysql_fetch_array Doc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接