PHP MySQL 读取数据(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 Web 开发领域,PHP 与 MySQL 的组合是构建动态网站的经典技术栈之一。PHP MySQL 读取数据作为这一技术栈的核心操作,是开发者必须掌握的基础技能。无论是展示用户信息、查询商品库存,还是分析业务数据,读取数据库中的信息始终是开发过程中不可或缺的环节。

本文将从零开始,系统性地讲解如何通过 PHP 与 MySQL 实现数据的高效读取。内容涵盖环境搭建、基础查询、优化技巧及安全防护,适合编程初学者逐步上手,也能为中级开发者提供进阶思路。


环境准备:搭建 PHP + MySQL 开发环境

在开始之前,需确保本地或服务器环境中已安装以下组件:

  • MySQL 数据库:用于存储数据(版本建议 5.6+)。
  • PHP 解释器:处理服务器端逻辑(版本建议 7.4+)。
  • Web 服务器:如 Apache 或 Nginx,用于托管 PHP 文件。

快速验证环境

可通过一个简单的 PHP 文件验证环境是否正常:

<?php  
phpinfo();  
?>  

将此代码保存为 test.php,通过浏览器访问 http://localhost/test.php,若显示 PHP 配置信息,则环境配置成功。


基础操作:PHP 连接 MySQL 数据库

1. 连接数据库

PHP 通过 mysqliPDO 扩展连接 MySQL。以 mysqli 为例,代码如下:

// 连接数据库  
$servername = "localhost";  
$username = "root";  
$password = "";  
$dbname = "my_database";  

$conn = new mysqli($servername, $username, $password, $dbname);  

// 检查连接  
if ($conn->connect_error) {  
    die("Connection failed: " . $conn->connect_error);  
}  
echo "Connected successfully";  

比喻:这就像打开图书馆的门,只有门禁验证通过后,才能进入内部查找书籍。

2. 执行 SQL 查询

连接成功后,即可通过 query() 方法执行 SQL 语句:

// 查询所有学生信息  
$sql = "SELECT * FROM students";  
$result = $conn->query($sql);  

if ($result->num_rows > 0) {  
    // 输出数据  
    while($row = $result->fetch_assoc()) {  
        echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";  
    }  
} else {  
    echo "0 results";  
}  

关键点

  • fetch_assoc() 将结果集转换为关联数组,便于通过字段名访问数据。
  • num_rows 可判断是否有数据返回。

进阶技巧:优化与安全防护

1. 预处理语句防止 SQL 注入

直接拼接 SQL 语句可能导致安全风险(如 SQL 注入攻击)。使用预处理语句可有效防御此类攻击:

// 预处理查询:根据学号查询学生信息  
$stmt = $conn->prepare("SELECT * FROM students WHERE id = ?");  
$stmt->bind_param("i", $student_id);  // "i" 表示参数类型为整数  

$student_id = 1;  
$stmt->execute();  
$result = $stmt->get_result();  

// 处理结果  
while ($row = $result->fetch_assoc()) {  
    echo "Name: " . $row["name"];  
}  

比喻:预处理语句如同安检门,将用户输入与 SQL 代码严格分离,防止恶意代码混入。

2. 使用索引加速查询

若频繁查询某个字段(如 name),可为其添加索引:

ALTER TABLE students ADD INDEX idx_name (name);  

原理:索引如同书籍的目录,允许数据库快速定位目标数据,而非遍历所有记录。

3. 分页查询提升用户体验

当数据量较大时,分页查询可避免一次性加载过多数据:

$page = isset($_GET['page']) ? $_GET['page'] : 1;  
$limit = 10;  
$start = ($page - 1) * $limit;  

$sql = "SELECT * FROM students LIMIT $start, $limit";  
// 执行查询并输出结果  

常见错误与解决方案

1. 连接失败错误

错误提示Connection refusedAccess denied
解决方法

  • 检查 MySQL 服务是否运行。
  • 确认数据库用户名、密码及主机地址是否正确。

2. 查询结果为空

可能原因

  • 表名或字段名拼写错误(区分大小写)。
  • 数据库中无符合条件的记录。

3. 警告:mysqli::query() expects parameter 1 to be string

解决方法

  • 确保 SQL 语句使用双引号或单引号包裹。
  • 检查 SQL 语法是否正确(如缺少分号)。

实战案例:构建学生信息查询系统

1. 数据库表结构设计

创建 students 表:

CREATE TABLE students (  
    id INT(11) AUTO_INCREMENT PRIMARY KEY,  
    name VARCHAR(50) NOT NULL,  
    age INT(3),  
    grade VARCHAR(10)  
);  

2. PHP 前端页面

<!DOCTYPE html>  
<html>  
<head>  
    <title>学生信息查询</title>  
</head>  
<body>  
    <h1>学生列表</h1>  
    <table border="1">  
        <tr>  
            <th>ID</th>  
            <th>姓名</th>  
            <th>年龄</th>  
            <th>年级</th>  
        </tr>  
        <?php  
        // 连接数据库并查询  
        $sql = "SELECT * FROM students";  
        $result = $conn->query($sql);  

        if ($result->num_rows > 0) {  
            while($row = $result->fetch_assoc()) {  
        ?>  
        <tr>  
            <td><?php echo $row["id"]; ?></td>  
            <td><?php echo $row["name"]; ?></td>  
            <td><?php echo $row["age"]; ?></td>  
            <td><?php echo $row["grade"]; ?></td>  
        </tr>  
        <?php  
            }  
        } else {  
            echo "<tr><td colspan='4'>暂无数据</td></tr>";  
        }  
        ?>  
    </table>  
</body>  
</html>  

3. 功能扩展:按年级过滤查询

// 在表单中添加年级筛选  
<form method="GET">  
    <select name="grade_filter">  
        <option value="">全部</option>  
        <option value="高一">高一</option>  
        <option value="高二">高二</option>  
        <option value="高三">高三</option>  
    </select>  
    <input type="submit" value="筛选">  
</form>  

// 动态构建 SQL 语句  
$grade_filter = $_GET['grade_filter'] ?? '';  
$sql = "SELECT * FROM students";  

if (!empty($grade_filter)) {  
    $sql .= " WHERE grade = '" . $conn->real_escape_string($grade_filter) . "'";  
}  

总结与展望

通过本文,我们系统学习了 PHP MySQL 读取数据 的核心流程:从环境搭建到基础查询,再到优化与安全防护。关键要点包括:

  1. 连接与查询:使用 mysqliPDO 进行数据库交互。
  2. 安全实践:预处理语句防御 SQL 注入,索引提升查询速度。
  3. 错误处理:通过 try-catch 或条件判断捕获异常。

对于进阶开发者,可进一步探索以下方向:

  • 使用 ORM 框架(如 Doctrine)简化数据库操作。
  • 结合 PHP 的 PDO 扩展实现事务管理。
  • 通过 JOIN 查询实现多表关联操作。

掌握这些技能后,读者将能够独立完成复杂的数据交互场景开发。实践是检验知识的最佳方式,建议读者通过实际项目巩固所学内容,逐步成长为全栈开发领域的专家。

最新发布