Php mysql\u fetch\u数组while循环。它是如何工作的?

Php mysql\u fetch\u数组while循环。它是如何工作的?,php,mysql,increment,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($qu

我已经在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 } ?>
我知道这可能不起作用,但是这个函数是如何自我增值的呢?有没有一种方法可以在代码中看到某种增量的地方编写它


谢谢你

每次你调用
mysql\u fetch\u array
它都会从你的查询中提取下一行。
while
循环继续返回true,而
mysql\u fetch\u数组
仍有一些内容要分配给变量
$row2
。一旦超出行数,它就没有任何东西可以给变量赋值,并且返回false


ETA:关于您提到的最后一位,您可以在循环的每个迭代中使用一个变量增量,就像您的示例中一样,但这并不是完全必要的。您还可以在
while
循环之前执行类似于
$var=mysql\u num\u rows($data)
的操作来查看返回了多少行。

您可以将
mysql\u fetch\u array()
想象为类似于一个文件读取函数,该函数将每次返回一个新行,并在到达末尾时返回EOF。而不是EOF,
mysql\u fetch\u 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);
}
也许这种结构看起来更为熟悉。

mysql\u fetch\u array()是一个函数,如果您想从结果执行的查询中获取一行,则必须调用该函数,因此您可以将其描述为“mysql\u fetch\u array-将结果行作为关联数组、数字数组或两者都获取”

场景是这样的:它返回一个与所获取的行相对应的数组,并将内部数据指针向前移动。 进一步澄清:

$result = mysql_query("SELECT id, name FROM mytable");
$row = mysql_fetch_array($result, MYSQL_NUM);
1) $result的类型是什么? 2) mysql\u fetch\u数组使用什么类型来工作

让我来回答这个问题,, 1) $result是mysql_query()的结果变量,此函数返回类型为mysql result的结果,此类型只能通过调用7个函数创建:

mysql\u db\u query()、mysql\u list\u dbs()、mysql\u list\u fields()、mysql\u list\u processs()、mysql\u list\u tables()、mysql\u unbuffered\u query()

并且可以由多个函数使用,如
mysql\u fetch\u array()和mysql\u db\u name()等

2) 功能描述如下:
array mysql\u fetch\u array(resource$result[,int$result\u type=mysql\u BOTH])

请参见

也许下面的函数可以为您介绍一下“mysql_fetch_array while loop work?”

类测试{
公费$plus=-1;
public$data=array();
public$return=array();
函数fetcharray(){
$this->plus++;
对于($i=0;$idata[$this->plus]);$i++){
$this->return[$i]=$this->data[$this->plus][$i];
}
如果(sizeof($this->data[$this->plus])data[($this->plus-1)]){
对于($i=sizeof($this->data[$this->plus]);$idata[($this->plus-1)];$i++){
$this->return[$i]=“”;
}
}
返回($this->data[$this->plus])?$this->return:false;
}
}
$test=新测试();
$test->data=array(
数组(“data00”、“data01”、“data02”、“data03”、“data04”、“data05”),
数组(“data10”、“data11”、“data12”、“data13”、“data04”、“data15”),
数组(“data20”、“data21”、“data22”、“data23”、“data24”、“data25”),
数组(“data30”、“data31”、“data32”、“data33”、“data34”、“data35”),
数组(“data40”、“data41”、“data42”、“data43”、“data44”、“data45”)
);
而($array=$test->fetcharray()){
echo$array[0]。“=”$array[1]。“=”$array[2]。“=”$array[3]。“=”$array[4]。“=”$array[5]。“
\n”; }
为了更好地理解这一点,我会仔细阅读。该函数主要处理查询结果的资源句柄。如果没有更多的结果可返回,则函数将返回FALSE,因此while循环的计算结果为FALSE。请停止使用古老的
mysql.*
函数编写新代码。它们不再得到维护,社区已开始恢复。相反,您应该学习准备好的语句,并使用或。如果您想学习,.Ok,那么,与其一个接一个地打印存储在数据库中的每条消息(这是在我上面的代码中完成的),我可以将
mysql\u fetch\u array
函数的每次迭代都保存在一个对象中,以便按照字母顺序在页面上遍历和排列消息,将来自同一个人的消息分组在一起?如果是这样的话,是否有一种更简单的方法可以做到这一点,而不必将$row变量保存为对象,或者这会使我的代码更干净,更容易理解发生了什么?这样的对象会降低我的页面速度吗?谢谢,绝对可以储存它们;您的代码只是回显每行的位和段,但您也可以轻松地将整行(或只是其中的一部分)分配给对象和/或数组。就我个人而言,在对事情进行分组时,我总是在进行中。我对SQL查询中的项目进行排序,设置一个空变量(例如,
$group
),然后在执行输出之前进行检查:if($row2['name']!=$group){$group=$row2['name'];//此处有更多代码}
$result = mysql_query("SELECT id, name FROM mytable");
$row = mysql_fetch_array($result, MYSQL_NUM);
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";
}