当前位置:首页 > 问答 > 正文

php怎么从数据库里拿字段值,简单说说几种常用方法和思路

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,改进的),它支持面向对象和面向过程两种写法,这里用面向对象的写法举例,因为它更直观。

php怎么从数据库里拿字段值,简单说说几种常用方法和思路

思路和之前类似,但更安全、更现代,创建一个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(推荐的主流方式)

php怎么从数据库里拿字段值,简单说说几种常用方法和思路

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() 就默认返回关联数组,不用每次都指定。

总结一下思路:

  1. 连接数据库:这是第一步,拿到进入数据库的“钥匙”。
  2. 构建并执行查询:写出正确的SQL语句,并发送给数据库。强烈建议使用PDO或MySQLi的预处理语句来保证安全。
  3. 处理结果集:这是核心环节,根据你的需要选择获取方式:
    • 想要灵活,既用索引又用字段名?考虑 fetch_array (MySQLi) 或 FETCH_BOTH (PDO)。
    • 只想用字段名,代码清晰?用 fetch_assoc (MySQLi) 或 FETCH_ASSOC (PDO)。
    • 喜欢面向对象的点号语法?用 fetch_object (MySQLi) 或 FETCH_OBJ (PDO)。
    • 结果集很小,想一次性全拿出来?用 fetchAll (PDO)。
    • 只查询一个值?用 fetchColumn (PDO)。

对于新项目,无脑选择PDO是最好的,它功能强大、安全、可移植,是PHP操作数据库的标准姿势,而了解老的方法,主要是为了在必要时能读懂和维护遗留代码。