PHP面向对象编程与数据库操作完全指南-下
前言
在上一篇文章深入剖析PHP面向对象编程的核心原理后,我们继续探索PHP在Web开发中的实际应用。本篇聚焦于表单处理与数据验证的关键技术,以及MySQL数据库的高效操作。通过详细的代码示例,您将学习如何实现安全的用户输入交互、严谨的数据验证规则,以及数据库的连接、CRUD操作和预处理语句的应用。这些技能是构建可靠Web应用的基石,帮助您提升开发效率和系统安全性,为后续高级主题打下坚实基础。
目录
前言
1、表单处理和数据验证
HTML表单与PHP交互
安全处理用户输入
2、MySQL数据库操作
数据库连接
数据库和表操作
数据操作(CRUD)
3、预处理语句和PDO
MySQLi 预处理语句
PDO 数据对象
PDO vs MySQLi 对比
4、总结
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的高级特性,如命名空间、异常处理、文件操作等主题。