PHP如何显示数据库表格内容:从连接到展示的完整指南
在Web开发中,将数据库中的表格内容动态展示到页面上是一项核心技能,PHP作为最流行的服务器端脚本语言之一,凭借其与MySQL等数据库的深度集成能力,能轻松实现数据查询与展示,本文将详细介绍如何使用PHP连接数据库、查询数据,并通过多种方式将表格内容安全、高效地显示在网页上。
准备工作:环境与数据库表结构
在开始编写PHP代码前,需确保本地开发环境已配置好PHP + MySQL(或MariaDB)+ Web服务器(如Apache/Nginx),若未配置,可使用集成环境包(如XAMPP、WampServer)快速搭建。
假设我们有一个名为test_db
的数据库,其中包含一张users
表,结构如下:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, `age` int(3) DEFAULT NULL, `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入测试数据 INSERT INTO `users` (`name`, `email`, `age`) VALUES ('张三', 'zhangsan@example.com', 25), ('李四', 'lisi@example.com', 30), ('王五', 'wangwu@example.com', 28);
核心步骤:连接数据库并查询数据
连接MySQL数据库
PHP提供了多种扩展连接MySQL数据库,推荐使用PDO(PHP Data Objects),它支持多种数据库(MySQL、PostgreSQL等),且具有预处理语句功能,能有效防止SQL注入。
<?php $host = 'localhost'; // 数据库主机地址 $dbname = 'test_db'; // 数据库名 $username = 'root'; // 数据库用户名 $password = ''; // 数据库密码(XAMPP默认为空) try { // 创建PDO实例,连接数据库 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); // 设置PDO错误模式为异常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { // 连接失败时输出错误信息(生产环境中应记录日志,而非直接显示错误) die("数据库连接失败: " . $e->getMessage()); } ?>
查询表格数据
使用PDO的query()
方法执行SQL查询,并通过fetchAll()
获取结果集(关联数组形式,便于字段名访问)。
<?php // 查询users表的所有数据 $sql = "SELECT id, name, email, age FROM users ORDER BY id ASC"; $stmt = $pdo->query($sql); // 获取所有结果(PDO::FETCH_ASSOC表示返回关联数组) $users = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>
显示数据:基础表格展示
获取数据后,可通过HTML表格标签将内容展示在页面上,以下是一个完整的示例(display_table.php
):
<?php require_once 'db_connection.php'; // 引入数据库连接文件(包含上述连接代码) // 查询数据 $sql = "SELECT id, name, email, age FROM users"; $stmt = $pdo->query($sql); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">用户列表</title> <style> table { width: 80%; margin: 20px auto; border-collapse: collapse; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } tr:nth-child(even) { background-color: #f9f9f9; } </style> </head> <body> <h1 style="text-align: center;">用户信息表</h1> <table> <thead> <tr> <th>ID</th> <th>姓名</th> <th>邮箱</th> <th>年龄</th> </tr> </thead> <tbody> <?php if (!empty($users)): ?> <?php foreach ($users as $user): ?> <tr> <td><?= htmlspecialchars($user['id']) ?></td> <td><?= htmlspecialchars($user['name']) ?></td> <td><?= htmlspecialchars($user['email']) ?></td> <td><?= htmlspecialchars($user['age']) ?></td> </tr> <?php endforeach; ?> <?php else: ?> <tr> <td colspan="4" style="text-align: center;">暂无数据</td> </tr> <?php endif; ?> </tbody> </table> </body> </html>
关键点说明:
htmlspecialchars()
函数:将特殊字符(如<
、>
、&
)转换为HTML实体,防止XSS(跨站脚本攻击)攻击。- 空数据判断:通过
if (!empty($users))
判断查询结果是否为空,避免foreach
循环报错。 - CSS样式:简单的表格样式提升可读性(可根据需求调整)。
优化与扩展:分页、搜索与安全增强
分页显示(处理大量数据)
当表格数据量较大时,一次性加载所有数据会导致页面卡顿,需通过分页(Pagination)优化,以下是核心实现:
<?php require_once 'db_connection.php'; // 分页参数 $page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1; // 当前页码,最小为1 perPage = 10; // 每页显示条数 offset = ($page - 1) * $perPage; // 计算偏移量 // 查询总记录数(用于计算总页数) $totalStmt = $pdo->query("SELECT COUNT(*) FROM users"); $totalRecords = $totalStmt->fetchColumn(); $totalPages = ceil($totalRecords / $perPage); // 查询当前页数据 $sql = "SELECT id, name, email, age FROM users LIMIT :limit OFFSET :offset"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':limit', $perPage, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">分页用户列表</title> <style> table { width: 80%; margin: 20px auto; border-collapse: collapse; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .pagination { text-align: center; margin: 20px; } .pagination a, .pagination span { display: inline-block; padding: 5px 10px; margin: 0 2px; border: 1px solid #ddd; text-decoration: none; } .pagination .current { background-color: #f2f2f2; font-weight: bold; } </style> </head> <body> <h1 style="text-align: center;">用户信息表(分页)</h1> <table> <thead> <tr> <th>ID</th> <th>姓名</th> <th>邮箱</th> <th>年龄</th> </tr> </thead> <tbody> <?php foreach ($users as $user): ?> <tr> <td><?= htmlspecialchars($user['id']) ?></td> <td><?= htmlspecialchars($user['name']) ?></td> <td><?= htmlspecialchars($user['email']) ?></td> <td><?= htmlspecialchars($user['age']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <!-- 分页导航 --> <div class="pagination"> <?php if ($page > 1): ?> <a href="?page=1">首页</a> <a href="?page=<?= $page - 1 ?>">上一页</a> <?php endif; ?> <?php for ($i = 1; $i <= $totalPages; $i++): ?> <?php if ($i == $page): ?> <span class="current"><?= $i ?></span> <?php else: ?> <a href="?page=<?= $i ?>"><?= $i ?></a> <?php endif; ?> <?php endfor; ?> <?php if ($page < $totalPages): ?>
还没有评论,来说两句吧...