PHP教程:案例11——员工信息动态展示实战指南

作者:梅琳marlin2025.10.13 17:01浏览量:1

简介:本文通过完整案例讲解如何使用PHP从数据库读取并动态显示员工信息,涵盖数据库连接、SQL查询、结果集处理及前端展示全流程,适合PHP初学者及企业应用开发者参考。

PHP教程—案例11(显示员工信息)

一、案例背景与目标

在企业管理系统中,员工信息展示是基础功能模块。本案例通过PHP实现从MySQL数据库读取员工数据并动态生成HTML表格,重点解决以下问题:

  1. 数据库连接与安全配置
  2. 动态SQL查询实现
  3. 结果集的高效处理
  4. 表格化数据展示技巧
  5. 基础分页功能实现

二、技术准备

2.1 环境要求

  • PHP 7.4+(推荐8.0+)
  • MySQL 5.7+
  • Web服务器(Apache/Nginx)
  • 代码编辑器(VS Code/PHPStorm)

2.2 数据库设计

创建employees表结构:

  1. CREATE TABLE employees (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. name VARCHAR(50) NOT NULL,
  4. department VARCHAR(30),
  5. position VARCHAR(30),
  6. salary DECIMAL(10,2),
  7. hire_date DATE,
  8. email VARCHAR(100) UNIQUE
  9. );

三、核心实现步骤

3.1 数据库连接配置

创建config.php文件:

  1. <?php
  2. $host = 'localhost';
  3. $dbname = 'company_db';
  4. $username = 'root';
  5. $password = '';
  6. try {
  7. $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  8. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  9. } catch(PDOException $e) {
  10. die("数据库连接失败: " . $e->getMessage());
  11. }
  12. ?>

关键点

  • 使用PDO而非mysqli实现数据库抽象
  • 设置异常模式便于错误排查
  • 敏感信息应存储在环境变量中(生产环境)

3.2 数据查询实现

创建employee_model.php

  1. <?php
  2. require_once 'config.php';
  3. class EmployeeModel {
  4. private $pdo;
  5. public function __construct($pdo) {
  6. $this->pdo = $pdo;
  7. }
  8. public function getAllEmployees($offset = 0, $limit = 10) {
  9. $stmt = $this->pdo->prepare("SELECT * FROM employees LIMIT :offset, :limit");
  10. $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
  11. $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
  12. $stmt->execute();
  13. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  14. }
  15. public function getEmployeeCount() {
  16. $stmt = $this->pdo->query("SELECT COUNT(*) FROM employees");
  17. return $stmt->fetchColumn();
  18. }
  19. }
  20. ?>

优化说明

  • 使用预处理语句防止SQL注入
  • 参数化分页查询
  • 单独统计方法支持分页计算

3.3 数据显示逻辑

创建display_employees.php

  1. <?php
  2. require_once 'config.php';
  3. require_once 'employee_model.php';
  4. $model = new EmployeeModel($pdo);
  5. $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
  6. $limit = 10;
  7. $offset = ($page - 1) * $limit;
  8. $employees = $model->getAllEmployees($offset, $limit);
  9. $total = $model->getEmployeeCount();
  10. $totalPages = ceil($total / $limit);
  11. ?>
  12. <!DOCTYPE html>
  13. <html>
  14. <head>
  15. <title>员工信息列表</title>
  16. <style>
  17. table { border-collapse: collapse; width: 100%; }
  18. th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
  19. th { background-color: #f2f2f2; }
  20. .pagination { margin-top: 20px; }
  21. .pagination a { padding: 8px 16px; text-decoration: none; }
  22. </style>
  23. </head>
  24. <body>
  25. <h2>员工信息列表</h2>
  26. <table>
  27. <tr>
  28. <th>ID</th>
  29. <th>姓名</th>
  30. <th>部门</th>
  31. <th>职位</th>
  32. <th>薪资</th>
  33. <th>入职日期</th>
  34. <th>邮箱</th>
  35. </tr>
  36. <?php foreach ($employees as $emp): ?>
  37. <tr>
  38. <td><?= htmlspecialchars($emp['id']) ?></td>
  39. <td><?= htmlspecialchars($emp['name']) ?></td>
  40. <td><?= htmlspecialchars($emp['department']) ?></td>
  41. <td><?= htmlspecialchars($emp['position']) ?></td>
  42. <td><?= number_format($emp['salary'], 2) ?></td>
  43. <td><?= date('Y-m-d', strtotime($emp['hire_date'])) ?></td>
  44. <td><?= htmlspecialchars($emp['email']) ?></td>
  45. </tr>
  46. <?php endforeach; ?>
  47. </table>
  48. <div class="pagination">
  49. <?php for ($i = 1; $i <= $totalPages; $i++): ?>
  50. <a href="?page=<?= $i ?>" <?= $i == $page ? 'style="font-weight:bold;"' : '' ?>>
  51. <?= $i ?>
  52. </a>
  53. <?php endfor; ?>
  54. </div>
  55. </body>
  56. </html>

实现细节

  1. 使用htmlspecialchars()防止XSS攻击
  2. 薪资格式化显示
  3. 日期标准化处理
  4. 简单分页导航实现

四、进阶优化建议

4.1 性能优化

  1. 添加数据库索引:

    1. ALTER TABLE employees ADD INDEX idx_department (department);
    2. ALTER TABLE employees ADD INDEX idx_hire_date (hire_date);
  2. 实现缓存机制:

    1. // 使用文件缓存示例
    2. $cacheFile = 'cache/employees_' . $page . '.cache';
    3. if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 3600) {
    4. $employees = unserialize(file_get_contents($cacheFile));
    5. } else {
    6. $employees = $model->getAllEmployees($offset, $limit);
    7. file_put_contents($cacheFile, serialize($employees));
    8. }

4.2 安全增强

  1. 输入验证:

    1. function validatePageNumber($page) {
    2. return filter_var($page, FILTER_VALIDATE_INT, [
    3. 'options' => ['min_range' => 1],
    4. 'default' => 1
    5. ]);
    6. }
  2. 权限控制:

    1. session_start();
    2. if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
    3. header('HTTP/1.1 403 Forbidden');
    4. die('无权访问');
    5. }

4.3 功能扩展

  1. 搜索功能实现:

    1. // 在EmployeeModel中添加
    2. public function searchEmployees($keyword, $offset = 0, $limit = 10) {
    3. $stmt = $this->pdo->prepare("
    4. SELECT * FROM employees
    5. WHERE name LIKE :keyword OR department LIKE :keyword
    6. LIMIT :offset, :limit
    7. ");
    8. $searchTerm = '%' . $keyword . '%';
    9. $stmt->bindParam(':keyword', $searchTerm);
    10. // ...绑定offset和limit
    11. $stmt->execute();
    12. return $stmt->fetchAll();
    13. }
  2. 排序功能实现:

    1. // 修改查询方法
    2. public function getAllEmployees($sortField = 'id', $sortOrder = 'ASC', $offset = 0, $limit = 10) {
    3. $validFields = ['id', 'name', 'department', 'salary', 'hire_date'];
    4. $validOrders = ['ASC', 'DESC'];
    5. if (!in_array($sortField, $validFields)) $sortField = 'id';
    6. if (!in_array($sortOrder, $validOrders)) $sortOrder = 'ASC';
    7. $stmt = $this->pdo->prepare("
    8. SELECT * FROM employees
    9. ORDER BY $sortField $sortOrder
    10. LIMIT :offset, :limit
    11. ");
    12. // ...绑定参数
    13. }

五、常见问题解决方案

5.1 中文乱码问题

在数据库连接后添加:

  1. $pdo->exec("SET NAMES 'utf8mb4'");

5.2 分页链接失效

确保URL编码正确:

  1. <a href="?page=<?= urlencode($i) ?>">

5.3 空结果集处理

  1. if (empty($employees)) {
  2. echo '<p>暂无员工数据</p>';
  3. }

六、部署建议

  1. 生产环境配置:

    • 禁用错误显示:display_errors = Off
    • 启用OPcache加速
    • 配置适当的内存限制
  2. 备份策略:

    1. # 每日数据库备份示例
    2. 0 3 * * * /usr/bin/mysqldump -u root -p密码 company_db > /backups/company_db_$(date +\%Y\%m\%d).sql

七、总结

本案例完整展示了PHP从数据库获取数据到前端展示的全流程,关键技术点包括:

  1. PDO数据库操作
  2. 预处理语句防注入
  3. 分页算法实现
  4. XSS防护措施
  5. 基础安全控制

实际应用中,可根据需求扩展搜索、排序、导出等功能,建议结合前端框架(如Bootstrap)提升用户体验,使用Composer管理依赖库,最终形成可复用的员工管理模块。