登录
首页 >  文章 >  php教程

PHP操作数据库的实用方法解析

时间:2026-05-09 18:48:59 210浏览 收藏

本文深入剖析了PHP查询数据库数据的关键实践与常见陷阱,强调真正决定查询成败的并非SQL语句本身,而是扩展选择(mysqli与PDO的特性差异)、参数传递方式、SQL注入防护(强制预处理)、字符集统一(utf8mb4全程一致)、错误排查流程(连接/查询/结果三重校验)以及大数据量下的内存优化策略(流式fetch替代fetch_all)。文章直击开发者常踩的“查不到数据却无报错”痛点,用具体代码示例和底层机制解释为何拼接SQL、忽略字符集、滥用缓存结果集等操作会悄然导致空结果、乱码甚至安全漏洞,为构建稳定、安全、高性能的数据库交互提供可立即落地的实战指南。

PHP如何查询数据库数据_PHP查询数据语句【Select】

PHP 查询数据库数据,核心不是写 SELECT 语句本身,而是用对扩展、传对参数、防好注入——否则哪怕 SQL 写得再标准,也可能查不到数据、报错、甚至被拖库。

mysqli 还是 PDO?选哪个更稳妥

两者都能执行 SELECT,但行为差异直接影响结果可靠性:

  • mysqli 更轻量,适合只用 MySQL 的项目;但默认开启“缓存结果集”,mysqli_query() 返回的是资源(resource),不显式 mysqli_free_result() 可能内存泄漏
  • PDO 支持预处理和多种数据库,PDO::prepare() + PDOStatement::execute() 是防 SQL 注入的标配;注意它默认不抛异常,要手动设 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  • 如果查询含中文或特殊字符,PDO 必须在 DSN 中加 ;charset=utf8mb4mysqli 则需调用 mysqli_set_charset($conn, 'utf8mb4'),漏掉就可能返回空数组或乱码

SELECT 查不到数据?先检查这三件事

常见现象:SQL 在 phpMyAdmin 里能跑,PHP 里 mysqli_fetch_assoc() 却返回 null 或空数组。

  • 确认连接成功:mysqli_connect()new PDO() 后立刻检查是否为 false / 是否捕获到异常,别跳过这步
  • 确认查询没报错:用 mysqli_error($conn)$pdo->errorInfo() 看真实错误,比如字段名拼错、表不存在、权限不足都会静默失败
  • 确认结果集非空:不要直接对 mysqli_query() 返回值调 fetch,先用 mysqli_num_rows()$stmt->rowCount() 判断是否有行,再取数据

WHERE 条件带变量?必须用预处理,别拼字符串

手拼 "SELECT * FROM user WHERE id = " . $_GET['id'] 是高危操作,整数也防不住绕过(如传 1 OR 1=1)。

  • PDO 示例:
    $stmt = $pdo->prepare("SELECT * FROM user WHERE status = ? AND created_at > ?");
    $stmt->execute(['active', '2024-01-01']);
    $rows = $stmt->fetchAll();
  • mysqli 示例:
    $stmt = mysqli_prepare($conn, "SELECT * FROM user WHERE name LIKE ?");
    $search = "%{$keyword}%";
    mysqli_stmt_bind_param($stmt, "s", $search);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
  • 注意:LIKE 中的通配符(%_)必须放在 PHP 变量里拼好,不能写进 SQL 模板,否则预处理会把 % 当字面量处理

查大量数据时,fetch_all() 和循环 fetch() 性能差很多

一次性 fetch_all(MYSQLI_ASSOC) 看似方便,但万级记录会吃光内存;而逐行 fetch_assoc() 虽慢点,却可控。

  • 导出报表、后台批量处理等场景,优先用 while ($row = $result->fetch_assoc()) { ... } 流式读取
  • 如果真要用 fetch_all(),记得限制条数:SELECT * FROM log ORDER BY id DESC LIMIT 1000,别裸查全表
  • PDOfetch() 默认是 PDO::FETCH_BOTH,既返回数字键又返回字段名键,占双倍内存;明确指定 PDO::FETCH_ASSOC

最常被忽略的一点:查询前没确认字符集是否一致,尤其当数据库用 utf8mb4 而 PHP 连接用 latin1 时,WHERE name = '张三' 会永远匹配不上——这个坑不会报错,只会让你对着空数组发呆十分钟。

终于介绍完啦!小伙伴们,这篇关于《PHP操作数据库的实用方法解析》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>