MySQL_fetch_row和MySQL_fetch_array到底有什么区别用法上有啥不同啊
- 问答
- 2025-12-30 20:43:38
- 2
要搞清楚mysql_fetch_row和mysql_fetch_array的区别,我们得先明白一个前提:这两个函数都属于PHP中比较古老的、用于连接MySQL数据库的扩展,即“MySQL扩展”,这个扩展在PHP 5.5.0版本后就被弃用了,并在PHP 7.0.0中被完全移除,现在新写的项目绝对不应该再使用它们,而是应该使用MySQLi或PDO,理解它们的区别对于维护老项目或者理解数据库操作的发展历程仍然很有帮助。
最核心的区别在于它们返回数据的组织形式,也就是它们把从数据库里取出来的一行数据,给你包装成了什么“样子”。
mysql_fetch_row:简单直接的“数字索引数组”
你可以把mysql_fetch_row想象成一个非常耿直的工具,它的工作方式非常单一:当你执行了一条SELECT查询,并获得了结果集资源后,你用mysql_fetch_row去取一行数据,它会返回一个数组,这个数组的键名(索引)是从0开始的纯数字。
举个例子,假设我们有一张用户表users,有id, username, email三个字段,查询SELECT id, username, email FROM users后,使用mysql_fetch_row取出一行数据,得到的结果大概是这样的:
Array
(
[0] => 1 // 对应`id`字段的值
[1] => '张三' // 对应`username`字段的值
[2] => 'zhangsan@example.com' // 对应`email`字段的值
)
用法特点:
- 访问数据:你只能通过数字索引来访问数据,比如
$row[0]得到id,$row[1]得到用户名,这种方式非常不直观,因为你必须清楚地记得你查询语句中字段的顺序,如果哪天你改了查询语句,增加了或者调整了字段的顺序,那么所有使用数字索引的代码可能都要跟着改,否则就会出错,维护起来很麻烦。 - 优点:因为结构简单,没有任何额外的处理(比如创建关联索引),所以理论上它的速度是三者中最快的,但在实际应用中,这种微小的性能差异通常可以忽略不计。
- 缺点:代码可读性和可维护性差,看到
$row[1],别人或者过段时间的你自己,很难一眼看出这到底代表哪个字段。
根据PHP官方手册对mysql_fetch_row函数的描述,其核心就是返回一个数字索引数组。
mysql_fetch_array:灵活多变的“双料数组”
mysql_fetch_array则像一个更贴心、功能更多的工具,它比mysql_fetch_row多了一个“模式”参数,这个参数决定了它返回数组的形式,正是这个参数,带来了根本性的不同。
它的函数签名是:mysql_fetch_array(resource $result [, int $result_type = MYSQL_BOTH])
这里的关键是第二个参数$result_type,它有三个可选值:
-
MYSQL_ASSOC:返回一个关联数组,数组的键名是数据库里的字段名。
- 同样上面的查询,使用
mysql_fetch_array($result, MYSQL_ASSOC)会得到:Array ( [id] => 1 [username] => '张三' [email] => 'zhangsan@example.com' ) - 用法:这时你可以用
$row['username']来获取用户名,非常直观,代码可读性极高,你完全不需要关心字段在查询结果中的顺序。
- 同样上面的查询,使用
-
MYSQL_NUM:这个模式的效果和mysql_fetch_row一模一样,返回一个纯数字索引数组。
- 使用
mysql_fetch_array($result, MYSQL_NUM)的结果和最开始mysql_fetch_row的例子完全相同。
- 使用
-
MYSQL_BOTH:这是默认值,如果你不传第二个参数,函数就会使用这个模式,它返回的数组“两者兼有”,既包含数字索引,也包含关联索引。
- 使用
mysql_fetch_array($result)或mysql_fetch_array($result, MYSQL_BOTH)会得到:Array ( [0] => 1 [id] => 1 [1] => '张三' [username] => '张三' [2] => 'zhangsan@example.com' [email] => 'zhangsan@example.com' ) - 用法:这意味着你可以用
$row[0],也可以用$row['id']来获取ID值,非常灵活,但缺点是数组体积变大了一倍,因为每个值都存储了两遍,虽然这点内存消耗通常不是问题,但理论上不如单一索引的数组高效。
- 使用
根据PHP官方手册对mysql_fetch_array函数的说明,其核心特性就是通过result_type参数支持返回不同类型的数组。
总结对比与用法上的核心不同
| 特性 | mysql_fetch_row | mysql_fetch_array |
|---|---|---|
| 返回数组类型 | 仅数字索引数组 | 可通过参数选择:数字索引(MYSQL_NUM) / 关联索引(MYSQL_ASSOC) / 两者都有(MYSQL_BOTH,默认) |
| 访问数据方式 | 只能靠下标,如$row[0] |
根据模式而定:关联模式用字段名$row['name'],数字模式用下标$row[0],混合模式两种都可以。 |
| 代码可读性 | 差,必须记住字段顺序,代码难以理解和维护。 | 强(尤其使用MYSQL_ASSOC时),字段名即键名,一目了然。 |
| 灵活性 | 低,功能单一。 | 高,一个函数提供了三种数据获取方式。 |
| 性能 | 理论上最快(结构最简单)。 | 理论上稍慢,尤其是默认的MYSQL_BOTH模式,因为构建的数组更复杂,但实际差异微乎其微。 |
用法上的建议(针对还在使用老代码的情况):
在当时,最常见的、也是被推荐的用法是:
- 优先使用
mysql_fetch_array($result, MYSQL_ASSOC),这样既能获得最好的代码可读性,又避免了MYSQL_BOTH模式带来的不必要的内存开销,通过字段名来访问数据,使得代码更健壮,即使查询语句的字段顺序改变了,代码也无需改动。 - 除非你非常确定需要极致的性能(这在Web应用中很少见),并且能接受低可读性,才考虑使用
mysql_fetch_row或mysql_fetch_array的MYSQL_NUM模式。 - 尽量避免使用默认的
MYSQL_BOTH模式,除非你有非常特殊的理由需要同时使用两种索引方式。
最后再次强调,无论是mysql_fetch_row还是mysql_fetch_array,它们都属于已废弃的MySQL扩展,在现代PHP开发中,你应该转而学习并使用MySQLi或PDO扩展,它们提供了更安全(支持预处理语句)、功能更强大的数据库操作方法,在MySQLi中,有mysqli_fetch_row,mysqli_fetch_assoc(对应MYSQL_ASSOC)和mysqli_fetch_array,概念上是相似的,但底层更先进和安全。

本文由瞿欣合于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/71478.html
