mysql_fetch_array和php中的while循环

时间:2013-06-10 11:39:43

标签: php mysql

我正在尝试从数据库中获取数据并将其打印在页面上。我用下一个选择:

$tableIndex=mysql_query('SELECT table_index FROM table_names');

当我使用while循环打印时,没关系。 代码:

while($row = mysql_fetch_array($tableIndex) ){
        echo $row[0].'<br>';}

结果:

1st

2nd

3rd

但是没有while循环,它只给出了数组的第一个元素。

代码:

$row = mysql_fetch_array($tableIndex);
    echo $row[0].'<br>';
    echo $row[1].'<br>';
    echo $row[2].'<br>';

结果:

1st

_

_

(其中“_”是空格)

有人可以谴责为什么这么奇怪吗?

2 个答案:

答案 0 :(得分:14)

你从根本上误解了这些事情的运作方式。

mysql_fetch_array中的“数组”不是所有记录的数组,而是当前记录中的数据数组。

在你的情况下,你只是获取一个字段,所以数组只包含一个元素(即$row[0]),但原理是相同的 - 它是单个记录的数组你刚看完。

任何时候只有当前记录的数据在数组中。这就是while循环的用途;它可以追溯每个记录的任何负载。

如果要创建包含所有数据的数组,则需要执行以下操作:

$fullData = array()
while($row = mysql_fetch_array($tableIndex) ){
    $fullData[] = $row[0];
}

这会将您正在阅读的所有数据放入一个大数组中,这正是您所期望的。现在你可以在问题中做你想做的事了:

echo $fullData[0].'<br>';
echo $fullData[1].'<br>';
echo $fullData[2].'<br>';

希望有所帮助。

值得指出的是,mysql_xxx()系列函数已被删除并被视为过时。如果您只是学习PHP(似乎就是这种情况),我强烈建议您停止学习这些功能,并学习PDO库。它更现代,并且具有mysql功能无法提供的许多功能。此外,PHP的未来版本将完全删除mysql函数,因此您必须在某个时刻进行切换 - 现在可能也是如此,当您还在学习时。

另外(为了保持与问题相关),PDO库具有的功能实际上可以在单个函数中执行您正在寻找的内容:PDO::fetchAll()。使用此方法意味着您可以在一行中将所有数据提取到单个大数组中,而无需执行while循环。代码看起来有点像这样:

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();
$result = $sth->fetchAll();

(例子来自PDO::fetchAll的PHP手册)

答案 1 :(得分:2)

每次循环循环时,都会再次执行此代码:

$row = mysql_fetch_array($tableIndex);

所以每次$ row获取新值。没有循环的等价物将是:

$row = mysql_fetch_array($tableIndex);
echo $row[0].'<br>';
$row = mysql_fetch_array($tableIndex);
echo $row[0].'<br>';
$row = mysql_fetch_array($tableIndex);
echo $row[0].'<br>';