php怎么从数据库里拿字段值,简单说说几种常用方法和思路
- 问答
- 2025-12-31 01:32:03
- 2
PHP从数据库里拿数据,最核心的步骤就像去图书馆找书:先确定要找什么书(连接数据库并准备查询语句),然后去书架拿(执行查询),最后把书拿到手里看(获取结果),下面主要说说把“书拿到手里看”这个环节的几种常见方式,这里我们主要以MySQL数据库为例,因为它是PHP中最常见的搭档。
第一种方法:使用 mysql_fetch_array 及相关函数(古老但需了解)
这个方法属于比较老的PHP版本(PHP 5.5.0之后已被废弃),但现在一些非常老旧的系统可能还在用,所以了解一下有好处,它的思路很直接。
你需要用 mysql_connect 连接数据库,用 mysql_query 执行一条SQL查询语句,SELECT * FROM users,这个查询会返回一个“结果集”,就像图书馆管理员给你指出的一整排书架。
要一本一本地从书架上拿书,就是用循环来遍历这个结果集。
mysql_fetch_array(): 这是最常用的,它会把当前这一行数据取出来,并以两种方式同时给你:既可以通过数字索引($row[0])来访问字段值,也可以通过字段名($row['username'])来访问,你可以选择用哪一种。mysql_fetch_assoc(): 这个函数只返回关联数组,也就是只能用字段名(如$row['username'])来访问,如果你想代码更清晰,明确知道字段名是什么,用这个比较好。mysql_fetch_row(): 这个函数只返回索引数组,也就是只能用数字(如$row[0])来访问,当你不关心字段名,只关心顺序时可以用。
这种方法的缺点是安全性差,容易受到SQL注入攻击,而且PHP已经不再维护这些函数,所以新项目绝对不要用,只是为了理解或维护老代码时才需要知道。
第二种方法:使用MySQLi扩展(改进版)
为了解决老方法的问题,PHP提供了MySQLi扩展(i代表improved,改进的),它支持面向对象和面向过程两种写法,这里用面向对象的写法举例,因为它更直观。

思路和之前类似,但更安全、更现代,创建一个MySQLi对象来连接数据库:$conn = new mysqli($servername, $username, $password, $dbname)。
执行查询,这里有个重要的进步,可以使用“预处理语句”,这是防止SQL注入的利器,步骤是:先准备一个带问号占位符的SQL语句(如 SELECT * FROM users WHERE id = ?),然后把变量绑定到占位符上,最后再执行,这样就彻底把代码指令和用户输入的数据分开了,非常安全。
执行查询后,你会得到一个结果集对象,获取数据的方式也很灵活:
fetch_assoc(): 最常用的,返回一个关联数组。while ($row = $result->fetch_assoc()) { echo $row['username']; }。fetch_array(): 和老的函数一样,可以返回关联数组、索引数组或两者都有。fetch_object(): 这是一个很有特色的方法,它不返回数组,而是返回一个对象,你可以像访问对象属性一样访问字段值,$row->username,对于习惯面向对象编程的人来说,这种写法很自然。
MySQLi是一个折中的选择,既提供了现代的特性,又只针对MySQL数据库,如果你的项目只使用MySQL,它是一个不错的选择。
第三种方法:使用PDO(推荐的主流方式)

PDO(PHP Data Objects)是PHP官方推荐的数据访问抽象层,它的最大优势是“抽象”,意味着你写一套代码,只要换一下数据库驱动,就可以连接MySQL、PostgreSQL、SQLite等多种数据库,可移植性非常好,这是目前最主流和推荐的方法。
思路和MySQLi面向对象的方式很像,先创建PDO实例来连接数据库:$pdo = new PDO($dsn, $username, $password),这里的DSN(数据源名称)字符串指明了你要连接的数据库类型和服务器地址、数据库名。
PDO也强力支持预处理语句,安全性很高,执行查询后,获取结果集的方法非常丰富:
fetch(PDO::FETCH_ASSOC): 返回关联数组,和MySQLi的fetch_assoc()一样。fetch(PDO::FETCH_OBJ): 返回一个匿名对象,可以通过$row->username访问。fetchAll(PDO::FETCH_ASSOC): 这是一个很实用的方法,它不像前面那样一行一行地取,而是一次性把结果集中的所有行都取出来,放到一个大的二维数组里,如果你的查询结果数据量不是特别大,用这个可以简化代码,直接用foreach循环遍历这个数组就行了,不需要while循环。fetchColumn(): 当你只查询一个字段的值时(SELECT COUNT(*) FROM users),用这个方法可以直接拿到那个单一的值,非常方便。
PDO还允许你设置默认的获取模式,$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC),这样之后每次调用 fetch() 就默认返回关联数组,不用每次都指定。
总结一下思路:
- 连接数据库:这是第一步,拿到进入数据库的“钥匙”。
- 构建并执行查询:写出正确的SQL语句,并发送给数据库。强烈建议使用PDO或MySQLi的预处理语句来保证安全。
- 处理结果集:这是核心环节,根据你的需要选择获取方式:
- 想要灵活,既用索引又用字段名?考虑
fetch_array(MySQLi) 或FETCH_BOTH(PDO)。 - 只想用字段名,代码清晰?用
fetch_assoc(MySQLi) 或FETCH_ASSOC(PDO)。 - 喜欢面向对象的点号语法?用
fetch_object(MySQLi) 或FETCH_OBJ(PDO)。 - 结果集很小,想一次性全拿出来?用
fetchAll(PDO)。 - 只查询一个值?用
fetchColumn(PDO)。
- 想要灵活,既用索引又用字段名?考虑
对于新项目,无脑选择PDO是最好的,它功能强大、安全、可移植,是PHP操作数据库的标准姿势,而了解老的方法,主要是为了在必要时能读懂和维护遗留代码。
本文由度秀梅于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/71597.html
