前言
在上一篇文章深入剖析PHP面向对象编程的核心原理后,我们继续探索PHP在Web开发中的实际应用。本篇聚焦于表单处理与数据验证的关键技术,以及MySQL数据库的高效操作。通过详细的代码示例,您将学习如何实现安全的用户输入交互、严谨的数据验证规则,以及数据库的连接、CRUD操作和预处理语句的应用。这些技能是构建可靠Web应用的基石,帮助您提升开发效率和系统安全性,为后续高级主题打下坚实基础。
目录
1、表单处理和数据验证
HTML表单与PHP交互
<?php
// 表单处理示例
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取表单数据
$username = $_POST['username'] ?? '';
$email = $_POST['email'] ?? '';
$age = $_POST['age'] ?? 0;
// 数据验证
$errors = [];
if (empty($username)) {
$errors[] = "用户名不能为空";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "邮箱格式不正确";
}
if ($age < 18 || $age > 100) {
$errors[] = "年龄必须在18-100之间";
}
if (empty($errors)) {
// 处理数据
echo "注册成功!";
} else {
foreach ($errors as $error) {
echo "<p style='color:red;'>$error</p>";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form method="POST" action="">
<div>
<label>用户名:</label>
<input type="text" name="username" required>
</div>
<div>
<label>邮箱:</label>
<input type="email" name="email" required>
</div>
<div>
<label>年龄:</label>
<input type="number" name="age" min="18" max="100">
</div>
<div>
<input type="submit" value="注册">
</div>
</form>
</body>
</html>
安全处理用户输入
<?php
function sanitizeInput($data) {
$data = trim($data); // 去除首尾空格
$data = stripslashes($data); // 去除反斜杠
$data = htmlspecialchars($data); // 转换特殊字符
return $data;
}
// 处理表单数据
if ($_POST) {
$name = sanitizeInput($_POST['name']);
$comment = sanitizeInput($_POST['comment']);
// htmlspecialchars 转换的字符:
// & -> &
// " -> "
// ' -> '
// < -> <
// > -> >
}
// 验证和过滤函数
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$int = filter_var($_POST['number'], FILTER_VALIDATE_INT);
$url = filter_var($_POST['url'], FILTER_VALIDATE_URL);
// 超全局变量
echo $_SERVER['REQUEST_METHOD']; // 请求方法
echo $_SERVER['HTTP_HOST']; // 主机名
echo $_REQUEST['data']; // GET + POST + COOKIE 数据
?>
2、MySQL数据库操作
数据库连接
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_db";
// MySQLi 面向对象方式
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 设置字符集
$conn->set_charset("utf8");
echo "连接成功";
?>
数据库和表操作
<?php
// 创建数据库
$sql = "CREATE DATABASE IF NOT EXISTS my_database";
if ($conn->query($sql) === TRUE) {
echo "数据库创建成功";
} else {
echo "Error: " . $conn->error;
}
// 选择数据库
$conn->select_db("my_database");
// 创建数据表
$sql = "CREATE TABLE IF NOT EXISTS users (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
age INT(3) UNSIGNED,
status TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
if ($conn->query($sql) === TRUE) {
echo "表创建成功";
} else {
echo "Error: " . $conn->error;
}
?>
数据操作(CRUD)
<?php
// INSERT - 插入数据
$username = "张三";
$email = "zhangsan@email.com";
$password = password_hash("123456", PASSWORD_DEFAULT);
$sql = "INSERT INTO users (username, email, password, age)
VALUES ('$username', '$email', '$password', 25)";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功,ID: " . $conn->insert_id;
} else {
echo "Error: " . $conn->error;
}
// SELECT - 查询数据
$sql = "SELECT id, username, email, age FROM users WHERE status = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table border='1'>";
echo "<tr><th>ID</th><th>用户名</th><th>邮箱</th><th>年龄</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . $row["id"] . "</td>";
echo "<td>" . $row["username"] . "</td>";
echo "<td>" . $row["email"] . "</td>";
echo "<td>" . $row["age"] . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "0 结果";
}
// UPDATE - 更新数据
$sql = "UPDATE users SET age = 26 WHERE username = '张三'";
if ($conn->query($sql) === TRUE) {
echo "记录更新成功,影响行数: " . $conn->affected_rows;
} else {
echo "Error: " . $conn->error;
}
// DELETE - 删除数据
$sql = "DELETE FROM users WHERE id = 1";
if ($conn->query($sql) === TRUE) {
echo "记录删除成功";
} else {
echo "Error: " . $conn->error;
}
// 释放结果集内存
$result->free_result();
// 关闭连接
$conn->close();
?>
3、预处理语句和PDO
MySQLi 预处理语句
<?php
// 预处理语句防止SQL注入
$conn = new mysqli("localhost", "root", "password", "test_db");
// 准备语句
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
// 绑定参数 (s = string, i = integer, d = double, b = blob)
$stmt->bind_param("sss", $username, $email, $password);
// 执行插入
$username = "李四";
$email = "lisi@email.com";
$password = password_hash("654321", PASSWORD_DEFAULT);
$stmt->execute();
echo "新记录插入成功";
// 查询预处理
$stmt = $conn->prepare("SELECT id, username, email FROM users WHERE age > ?");
$stmt->bind_param("i", $min_age);
$min_age = 18;
$stmt->execute();
// 获取结果
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['username'] . " - " . $row['email'] . "\n";
}
$stmt->close();
?>
PDO 数据对象
<?php
try {
// PDO 连接
$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8";
$pdo = new PDO($dsn, "root", "password");
// 设置错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理插入
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");
$stmt->execute([
':username' => '王五',
':email' => 'wangwu@email.com',
':password' => password_hash('789012', PASSWORD_DEFAULT)
]);
echo "插入成功,ID: " . $pdo->lastInsertId();
// 查询数据
$stmt = $pdo->prepare("SELECT * FROM users WHERE age > :age");
$stmt->execute([':age' => 20]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo $user['username'] . "\n";
}
// 事务处理
$pdo->beginTransaction();
try {
$pdo->exec("UPDATE users SET age = age + 1");
$pdo->exec("INSERT INTO logs (action) VALUES ('批量更新年龄')");
$pdo->commit();
echo "事务提交成功";
} catch (Exception $e) {
$pdo->rollback();
echo "事务回滚: " . $e->getMessage();
}
} catch(PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
?>
PDO vs MySQLi 对比
特性 | PDO | MySQLi |
---|---|---|
数据库支持 | 多种数据库 | 仅MySQL |
接口 | 面向对象 | 面向对象+过程化 |
预处理语句 | 支持 | 支持 |
性能 | 略慢 | 稍快 |
功能丰富度 | 更丰富 | MySQL特定功能更多 |
4、总结
本文全面介绍了PHP面向对象编程和数据库操作的核心知识:
数据库操作要点:
-
连接管理:MySQLi和PDO两种方式
-
CRUD操作:增删改查的标准实现
-
预处理语句:防止SQL注入的最佳实践
-
事务处理:保证数据一致性
-
错误处理:异常处理和错误信息
最佳实践建议:
-
优先使用PDO,具有更好的可移植性
-
始终使用预处理语句处理用户输入
-
合理设计类的结构,遵循单一职责原则
-
使用命名空间组织代码
-
重视安全性,验证和过滤所有用户输入
掌握这些知识后,你就能够构建强大、安全、可维护的PHP应用程序。在下一篇文章中,我们将探讨PHP的高级特性,如命名空间、异常处理、文件操作等主题。