MySQL和PHP行数组

3

好的,我有一种与MySQL有关的固有恐惧感。

这是我的表格:

+----+-----------------+------+
| id | name            | age  |
+----+-----------------+------+
|  1 | Timmy Mellowman |   23 |
|  2 | Jeff Johnson    |   18 |
+----+-----------------+------+

这是我的PHP代码不包括连接到数据库的部分
$raw = mysql_query("SELECT * FROM example") or die(mysql_error()); 
$row = mysql_fetch_array($raw);
echo "\n\n";
print_r($row);

所以这是我的输出:
Array
(
    [0] => 1
    [id] => 1
    [1] => Timmy Mellowman
    [name] => Timmy Mellowman
    [2] => 23
    [age] => 23
)

为什么会输出这个结果?名字被重复了?为什么名字同时被设置为[1]和[name]?
另外,有没有更好的方法使用PHP和MySQL?

1
注意!PHP的下一个主要版本将废弃mysql_函数族。由于您似乎正在学习如何使用PHP,现在是转换到PDOmysqli的好时机。 - Charles
这是定义行为; 严格来说,这是 PHP 的“特性”,而不是 MySQL。MySQL 只返回一个值的副本; PHP 使用两种索引样式填充数组:按数字位置和按名称。您可以使用传递给 mysql_fetch_array 函数的附加参数指定要使用哪些索引(名称、数字或两者)。当您不指定时,默认值为 BOTH。 - spencer7593
2个回答

5
根据PHP文档中的mysql_fetch_array说明: 返回与提取的行相对应的字符串数组,如果没有更多行则返回FALSE。返回的数组类型取决于如何定义result_type。使用MYSQL_BOTH(默认),您将获得具有关联和数字索引的数组。使用MYSQL_ASSOC,您只会获得关联索引(与mysql_fetch_assoc()一样),使用MYSQL_NUM,您只会获得数字索引(与mysql_fetch_row()一样)。 因此,在您的代码行$ row = mysql_fetch_array($ raw);中,$ row接收一个具有关联和数字索引的数组,因为这是默认值。如果您只想要关联索引,请使用$ row = mysql_fetch_array($ raw,MYSQL_ASSOC);(或mysql_fetch_assoc());如果您只想要数字索引,请使用$ row = mysql_fetch_array($ raw,MYSQL_NUM);(或mysql_fetch_row())。要检索所有行,请使用以下内容:
while ($row = mysql_fetch_array($raw)) {
    echo "<p>" . $row['id'] . " - " . $row['name'] . " - " . $row['age'] . "</p>\n";  
}

谢谢,你的回答很好,我现在明白你的意思了 - 但它只显示第一个人的数据?难道不应该使用SELECT * FROM example返回所有行吗? - Matthew 'mandatory' Bryant
1
它确实可以,但你只检索了第一条记录。你需要循环来检索所有记录。请参见我的答案中链接的示例#2。 - j08691
你能具体一点吗?我还有点困惑,为什么需要循环以及如何实现循环?我见过使用while语句来实现循环的方法,但我只是在不断地重复相同的命令,并且它会自动向下移动一行? - Matthew 'mandatory' Bryant
如果您查看http://php.net/manual/en/function.mysql-fetch-array.php的示例#2,您将看到while循环示例以及它所做的是逐行检索查询中的每一行,就像您所推测的那样。 - j08691
哦,好的,是的,我没有看链接部分(在您的第二个示例答案中查找)- 谢谢! - Matthew 'mandatory' Bryant

2
如果未指定返回类型,则默认为mysql_fetch_array($raw,MYSQL_BOTH),它会返回上面所示的关联和数字索引。
对于数字索引,请使用:
$row = mysql_fetch_array($raw, MYSQL_NUM)

对于关联索引,请使用

$row = mysql_fetch_array($result, MYSQL_ASSOC)

访问所有行时,请使用 while 循环。

while ($row = mysql_fetch_array($row, MYSQL_NUM)) {
    printf("ID: %s  Name: %s Age:%s", $row[0], $row[1],$row[2]);  
}

如果您正在使用关联索引

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    printf("ID: %s  Name: %s Age:%s", $row["id"], $row["name"],$row["age"]);
}

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