当前位置: 首页 > news >正文

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 转换的字符:// & -> &amp;// " -> &quot;// ' -> &#039;// < -> &lt;// > -> &gt;
}
​
// 验证和过滤函数
$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 对比

特性PDOMySQLi
数据库支持多种数据库仅MySQL
接口面向对象面向对象+过程化
预处理语句支持支持
性能略慢稍快
功能丰富度更丰富MySQL特定功能更多

4、总结

本文全面介绍了PHP面向对象编程和数据库操作的核心知识:

数据库操作要点:

  1. 连接管理:MySQLi和PDO两种方式

  2. CRUD操作:增删改查的标准实现

  3. 预处理语句:防止SQL注入的最佳实践

  4. 事务处理:保证数据一致性

  5. 错误处理:异常处理和错误信息

最佳实践建议:

  • 优先使用PDO,具有更好的可移植性

  • 始终使用预处理语句处理用户输入

  • 合理设计类的结构,遵循单一职责原则

  • 使用命名空间组织代码

  • 重视安全性,验证和过滤所有用户输入

掌握这些知识后,你就能够构建强大、安全、可维护的PHP应用程序。在下一篇文章中,我们将探讨PHP的高级特性,如命名空间、异常处理、文件操作等主题。

http://www.xdnf.cn/news/1234783.html

相关文章:

  • C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现
  • 云轴科技ZStack AI翻译平台建设实践-聚焦中英
  • React中的Hooks
  • JavaEE初阶第十三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十一)
  • 设计模式 - 组合模式:用树形结构处理对象之间的复杂关系
  • uniapp 跨端开发
  • 8.3 滑窗 |栈|阶乘判断
  • 什么是列存储(Columnar Storage)?深度解析其原理与应用场景
  • 【领域热点】【Vue】Vue 与 WebAssembly:前端性能优化的黄金搭档
  • [创业之路-535]:软件需要原型验证、产品需要原型验证、商业模式也需要原型验证
  • 实战解析:编程式事务在实际开发中的典型应用场景
  • Linux系统编程Day4-- Linux常用工具(yum与vim)
  • vulhub-corrosion2靶机
  • 1.8 axios详解
  • Unix 发展史概览
  • ClickHouse Windows迁移方案与测试
  • 一键安装RabbitMQ脚本
  • 电脑声音标志显示红叉的原因
  • 决策树的实际案例
  • Python-初学openCV——图像预处理(六)
  • Linux网络编程 ---五种IO模型
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各类垃圾的分类检测识别(C#代码UI界面版)
  • 基于MBA与BP神经网络分类模型的特征选择方法研究(Python实现)
  • Java学习第一百部分——Kafka
  • (论文速读)探索多模式大型语言模型的视觉缺陷
  • 关于Web前端安全防御之内容安全策略(CSP)
  • 大语言模型涉及的一些概念(持续更新)
  • Azure DevOps 中的代理
  • 知识点汇集(二)-misc
  • 【数据结构】哈希表实现