【问题标题】:mysql_fetch_array while loop. How does it work?mysql_fetch_array while 循环。它是如何工作的?
【发布时间】:2012-05-17 05:00:09
【问题描述】:

我已经阅读了关于 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 背景来看,它似乎几乎会停留在同一个位置,每次我们经过循环......

有没有什么方法可以让我对发生的事情有更好的逻辑理解?就像说:

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

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

谢谢

【问题讨论】:

  • 我会阅读PHP documentation 以获得更好的理解。该函数基本上是在处理查询结果的资源句柄。如果没有更多结果要返回,则该函数将返回 FALSE,因此 while 循环的计算结果为 FALSE。
  • 请停止使用古老的mysql_* 函数编写新代码。它们不再被维护,社区已经开始deprecation process。相反,您应该了解准备好的语句并使用PDOMySQLi。如果你想学习,here is a quite good PDO-related tutorial.

标签: php mysql increment


【解决方案1】:

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

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

【讨论】:

  • 好吧,我可以将mysql_fetch_array函数的每次迭代保存在一个对象,以便按字母顺序浏览和排列页面上的消息,以便将来自同一个人的消息组合在一起?如果是这样,是否有一种更简单的方法可以做到这一点,而不必将 $row 变量保存为对象,或者这实际上会使我的代码更清晰,更容易理解发生了什么?像这样的对象会减慢我的页面速度吗?谢谢
  • 绝对可以存储它们;您的代码只是回显每一行的点点滴滴,但您可以轻松地将整行(或其中的一部分)分配给对象和/或数组。就个人而言,在对事物进行分组时,我总是在飞行中完成。我在 SQL 查询中对项目进行排序,设置一个空变量(例如 $group),然后在输出之前进行检查: if ($row2['name']!=$group) { $group = $row2 ['姓名']; // 这里有更多代码 }
【解决方案2】:

也许下面这个函数可以给你一些关于“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";
}

【讨论】:

    【解决方案3】:

    您可以将mysql_fetch_array() 视为类似于文件读取函数,它每次都会返回一个新行,并在它到达末尾时返回 EOF。不过,mysql_fetch_array() 不是 EOF,而是返回 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);
    }
    

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

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2012-06-02
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多