PHP Conference Japan 2024

mysql_fetch_array

(PHP 4, PHP 5)

mysql_fetch_array将结果行作为关联数组、数字数组或两者都获取

警告

此扩展在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中移除。应改用 MySQLiPDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方法包括

描述

mysql_fetch_array(资源 $result, 整数 $result_type = MYSQL_BOTH): 数组

返回一个与获取的行对应的数组,并将内部数据指针向前移动。

参数

result

正在评估的结果 资源。此结果来自对 mysql_query() 的调用。

result_type

要获取的数组的类型。它是一个常量,可以取以下值:MYSQL_ASSOCMYSQL_NUMMYSQL_BOTH

返回值

返回一个与获取的行对应的字符串数组,如果不再有行则返回 false。返回数组的类型取决于 result_type 的定义方式。通过使用 MYSQL_BOTH(默认),您将获得一个同时具有关联索引和数字索引的数组。使用 MYSQL_ASSOC,您只会获得关联索引(与 mysql_fetch_assoc() 的工作方式相同),使用 MYSQL_NUM,您只会获得数字索引(与 mysql_fetch_row() 的工作方式相同)。

如果结果中的两个或多个列具有相同的字段名,则最后一个列将优先。要访问相同名称的其他列,必须使用该列的数字索引或为该列创建别名。对于带别名的列,不能使用原始列名访问其内容。

示例

示例 #1 带有别名重复字段名的查询

SELECT table1.field AS foo, table2.field AS bar FROM table1, table2

示例 #2 使用 MYSQL_NUMmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"无法连接: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

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

mysql_free_result($result);
?>

示例 #3 使用 MYSQL_ASSOCmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"无法连接: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

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

mysql_free_result($result);
?>

示例 #4 使用 MYSQL_BOTHmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"无法连接: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while (
$row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf ("ID: %s Name: %s", $row[0], $row["name"]);
}

mysql_free_result($result);
?>

备注

注意性能

需要注意的重要一点是,使用 mysql_fetch_array() 的速度并不比使用 mysql_fetch_row() 慢多少,而它提供了显著的附加价值。

注意此函数返回的字段名称区分大小写

注意此函数将 NULL 字段设置为 PHP null 值。

参见

添加注释

用户贡献的注释 12 条注释

robjohnson at black-hole dot com
22年前
在一个包含38567行的表上进行基准测试

mysql_fetch_array
MYSQL_BOTH: 6.01940000057 秒
MYSQL_NUM: 3.22173595428 秒
MYSQL_ASSOC: 3.92950594425 秒

mysql_fetch_row: 2.35096800327 秒
mysql_fetch_assoc: 2.92349803448 秒

如您所见,获取数组或哈希比获取两者都要高效两倍。使用fetch_row而不是传递fetch_array MYSQL_NUM,或者使用fetch_assoc而不是fetch_array MYSQL_ASSOC,速度甚至更快。除非您确实需要两者,否则不要获取BOTH,而且大多数时候您都不需要。
KingIsulgard
16年前
我找到了一种方法,可以将select查询的所有结果在一行中放入数组。

// 读取记录
$result = mysql_query("SELECT * FROM table;") or die(mysql_error());

// 将它们放入数组
for($i = 0; $array[$i] = mysql_fetch_assoc($result); $i++) ;

// 删除最后一个空元素
array_pop($array);

您需要删除最后一个元素,因为这个元素始终为空。

通过这种方式,您可以轻松地将整个表读取到数组中并保留表列的键。非常方便。
puzbie at facebookanswers dot co dot uk
13年前
<?php
while($r[]=mysql_fetch_array($sql));
?>

是的,这将生成一个包含最终mysql_fetch_array的false的虚拟数组元素。您应该截断数组,或者(在我看来更明智的做法)在将其添加到数组之前检查mysql_fetch_array的结果是否不为false。
info at o08 dot com
15年前
与mysql_fetch_array相反

<?php
function mysql_insert_array ($my_table, $my_array) {
$keys = array_keys($my_array);
$values = array_values($my_array);
$sql = 'INSERT INTO ' . $my_table . '(' . implode(',', $keys) . ') VALUES ("' . implode('","', $values) . '")';
return(
mysql_query($sql));
}
#http://www.weberdev.com/get_example-4493.html
?>
final at skilled dot ch
13年前
在生成动态查询并随后必须确定结果集是否包含特定字段时,我遇到了MySQL NULL值的问题。

第一反应是使用isset()和is_null(),但这些函数的行为可能与您预期不符。

我最终使用了array_key_exists,因为它唯一可以告诉我键是否存在。

<?php
$row
= mysql_fetch_assoc(mysql_query("SELECT null as a"));
var_dump($row); //array(1) { ["a"]=> NULL }
var_dump(isset($row['a'])); //false
var_dump(isset($row['b'])); //false
var_dump(is_null($row['a'])); //true
var_dump(is_null($row['b'])); //true + 抛出未定义索引通知
var_dump(array_key_exists('a', $row)); // true
var_dump(array_key_exists('b', $row)); // false
?>
john at skem9 dot com
18年前
我的主要目的是将获取的数组显示到表格中,将结果并排显示而不是彼此在下,以下是我想出的方法。

只需将$display数字更改为您想要的列数,不要更改$cols数字,否则可能会遇到一些问题。

<?php
$display
= 4;
$cols = 0;
echo
"<table>";
while(
$fetched = mysql_fetch_array($result)){
if(
$cols == 0){
echo
"<tr>\n";
}
// 将您希望在每个单元格中显示的内容放在此处
echo "<td>".$fetched['id']."<br />".$fetched['name']."</td>\n";
$cols++;
if(
$cols == $display){
echo
"</tr>\n";
$cols = 0;
}
}
// 添加了以下内容,以便它可以显示正确的html
if($cols != $display && $cols != 0){
$neededtds = $display - $cols;
for(
$i=0;$i<$neededtds;$i++){
echo
"<td></td>\n";
}
echo
"</tr></table>";
} else {
echo
"</table>";
}
?>

希望这能节省你们一些搜索时间。

任何改进建议都欢迎!
kunky at mail dot berlios dot de
19年前
当使用以下查询时,这非常有用

`SHOW TABLE STATUS`

不同版本的MySQL对此的响应不同。

因此,最好使用mysql_fetch_array(),因为mysql_fetch_row()给出的数字引用会产生非常不同的结果。
匿名
13年前
如果我使用

<?php
while($r[]=mysql_fetch_array($sql));
?>

那么在数组$r中,条目数量比数据库返回的行数多一个。
barbieri at NOSPAMzero dot it
22年前
以下是一个解决NULL值问题的建议

// 获取关联数组,并设置NULL值
$record = mysql_fetch_array($queryID,MYSQL_ASSOC);

// 设置数字索引
if(is_array($record))
{
$i = 0;
foreach($record as $element)
$record[$i++] = $element;
}

这样,您可以像往常一样访问$result数组,并设置NULL字段。
joelwan at gmail dot com
19年前
尝试使用Php对象生成器:http://www.phpobjectgenerator.com

它有点类似于上面评论中建议的Daogen,但更简单易用。

Php对象生成器为您PHP对象生成PHP类。它还提供数据库类,因此您可以专注于项目中更重要的方面。希望这有帮助。
tim at wiltshirewebs dot com
19年前
以下是用仅4行代码将记录复制或克隆到同一表中的快速方法



// 首先,获取最大的 ID 号,以便我们可以计算重复项的新 ID 号
// 其次,获取原始实体
// 第三,将重复记录的 ID 加 1,使其大于最大值
// 最后插入新记录 - 瞧!- 4 行代码搞定!

$id_max = mysql_result(mysql_query("SELECT MAX(id) FROM table_name"),0,0) or die("Could not execute query");
$entity = mysql_fetch_array(mysql_query("SELECT * FROM table." WHERE id='$id_original'),MYSQL_ASSOC) or die("Could not select original record"); // MYSQL_ASSOC 强制使用纯关联数组并阻止双键重复,至关重要的是,它会提取键,以便在第 4 行中使用它们
$entity["id"]=$id_max+1;
mysql_query("INSERT INTO it_pages (".implode(", ",array_keys($Entity)).") VALUES ('".implode("', '",array_values($Entity))."')");

在解决这个问题上真的遇到了很多困难 - 也许有更简单的方法?感谢其他发帖者提供的灵感。祝你好运 - Tim
some at gamepoint dot net
22年前
我从未遇到过空字段如此多的麻烦,但据我了解,只有在使用关联数组时,extract() 才能按预期工作,而这正是前面注释中使用的 mysql_fetch_assoc() 的情况。

但是,mysql_fetch_array() 将同时返回带有数字键和关联键的字段值,数字键是 extract() 不能很好处理的键。
可以通过调用 mysql_fetch_array($result,MYSQL_ASSOC) 来防止这种情况,它将返回与 mysql_fetch_assoc() 相同的结果,并且对 extract() 友好。
To Top