简介:本文通过完整案例讲解如何使用PHP从数据库读取并动态显示员工信息,涵盖数据库连接、SQL查询、结果集处理及前端展示全流程,适合PHP初学者及企业应用开发者参考。
在企业管理系统中,员工信息展示是基础功能模块。本案例通过PHP实现从MySQL数据库读取员工数据并动态生成HTML表格,重点解决以下问题:
创建employees表结构:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,department VARCHAR(30),position VARCHAR(30),salary DECIMAL(10,2),hire_date DATE,email VARCHAR(100) UNIQUE);
创建config.php文件:
<?php$host = 'localhost';$dbname = 'company_db';$username = 'root';$password = '';try {$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch(PDOException $e) {die("数据库连接失败: " . $e->getMessage());}?>
关键点:
创建employee_model.php:
<?phprequire_once 'config.php';class EmployeeModel {private $pdo;public function __construct($pdo) {$this->pdo = $pdo;}public function getAllEmployees($offset = 0, $limit = 10) {$stmt = $this->pdo->prepare("SELECT * FROM employees LIMIT :offset, :limit");$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);$stmt->execute();return $stmt->fetchAll(PDO::FETCH_ASSOC);}public function getEmployeeCount() {$stmt = $this->pdo->query("SELECT COUNT(*) FROM employees");return $stmt->fetchColumn();}}?>
优化说明:
创建display_employees.php:
<?phprequire_once 'config.php';require_once 'employee_model.php';$model = new EmployeeModel($pdo);$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;$limit = 10;$offset = ($page - 1) * $limit;$employees = $model->getAllEmployees($offset, $limit);$total = $model->getEmployeeCount();$totalPages = ceil($total / $limit);?><!DOCTYPE html><html><head><title>员工信息列表</title><style>table { border-collapse: collapse; width: 100%; }th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }th { background-color: #f2f2f2; }.pagination { margin-top: 20px; }.pagination a { padding: 8px 16px; text-decoration: none; }</style></head><body><h2>员工信息列表</h2><table><tr><th>ID</th><th>姓名</th><th>部门</th><th>职位</th><th>薪资</th><th>入职日期</th><th>邮箱</th></tr><?php foreach ($employees as $emp): ?><tr><td><?= htmlspecialchars($emp['id']) ?></td><td><?= htmlspecialchars($emp['name']) ?></td><td><?= htmlspecialchars($emp['department']) ?></td><td><?= htmlspecialchars($emp['position']) ?></td><td><?= number_format($emp['salary'], 2) ?></td><td><?= date('Y-m-d', strtotime($emp['hire_date'])) ?></td><td><?= htmlspecialchars($emp['email']) ?></td></tr><?php endforeach; ?></table><div class="pagination"><?php for ($i = 1; $i <= $totalPages; $i++): ?><a href="?page=<?= $i ?>" <?= $i == $page ? 'style="font-weight:bold;"' : '' ?>><?= $i ?></a><?php endfor; ?></div></body></html>
实现细节:
htmlspecialchars()防止XSS攻击添加数据库索引:
ALTER TABLE employees ADD INDEX idx_department (department);ALTER TABLE employees ADD INDEX idx_hire_date (hire_date);
实现缓存机制:
// 使用文件缓存示例$cacheFile = 'cache/employees_' . $page . '.cache';if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 3600) {$employees = unserialize(file_get_contents($cacheFile));} else {$employees = $model->getAllEmployees($offset, $limit);file_put_contents($cacheFile, serialize($employees));}
输入验证:
function validatePageNumber($page) {return filter_var($page, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1],'default' => 1]);}
权限控制:
session_start();if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {header('HTTP/1.1 403 Forbidden');die('无权访问');}
搜索功能实现:
// 在EmployeeModel中添加public function searchEmployees($keyword, $offset = 0, $limit = 10) {$stmt = $this->pdo->prepare("SELECT * FROM employeesWHERE name LIKE :keyword OR department LIKE :keywordLIMIT :offset, :limit");$searchTerm = '%' . $keyword . '%';$stmt->bindParam(':keyword', $searchTerm);// ...绑定offset和limit$stmt->execute();return $stmt->fetchAll();}
排序功能实现:
// 修改查询方法public function getAllEmployees($sortField = 'id', $sortOrder = 'ASC', $offset = 0, $limit = 10) {$validFields = ['id', 'name', 'department', 'salary', 'hire_date'];$validOrders = ['ASC', 'DESC'];if (!in_array($sortField, $validFields)) $sortField = 'id';if (!in_array($sortOrder, $validOrders)) $sortOrder = 'ASC';$stmt = $this->pdo->prepare("SELECT * FROM employeesORDER BY $sortField $sortOrderLIMIT :offset, :limit");// ...绑定参数}
在数据库连接后添加:
$pdo->exec("SET NAMES 'utf8mb4'");
确保URL编码正确:
<a href="?page=<?= urlencode($i) ?>">
if (empty($employees)) {echo '<p>暂无员工数据</p>';}
生产环境配置:
display_errors = Off备份策略:
# 每日数据库备份示例0 3 * * * /usr/bin/mysqldump -u root -p密码 company_db > /backups/company_db_$(date +\%Y\%m\%d).sql
本案例完整展示了PHP从数据库获取数据到前端展示的全流程,关键技术点包括:
实际应用中,可根据需求扩展搜索、排序、导出等功能,建议结合前端框架(如Bootstrap)提升用户体验,使用Composer管理依赖库,最终形成可复用的员工管理模块。