当前位置: 首页 > 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.dtcms.com/a/312975.html

相关文章:

  • 深入解析C++函数重载:从原理到实践
  • 2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
  • MySQL梳理三:查询与优化
  • python新功能match case|:=|typing
  • Hertzbeat如何配置redis?保存在redis的数据是可读数据
  • 【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
  • Android设备认证体系深度解析:GMS/CTS/GTS/VTS/STS核心差异与认证逻辑
  • ELECTRICAL靶机复现练习笔记
  • Leetcode:1.两数之和
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • ubuntu24.04安装selenium、edge、msedgedriver
  • 05.Redis 图形工具RDM
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第四天(DOM编程和AJAX异步交互)
  • k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC
  • 使用ACK Serverless容器化部署大语言模型FastChat
  • 如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
  • 【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序
  • [AI8051U入门第十五步]W5500实现DHCP自动获取IP
  • SpringBoot+Vue高校实验室预约管理系统 附带详细运行指导视频
  • Matlab算法编程示例4:数值解法求解常微分方程的代码实例
  • Python类与对象指南
  • java贪吃蛇小程序
  • 个人项目介绍:STM32F407核心多层电路板
  • Java试题-选择题(8)
  • 25 渗透测试培训课程第一部分 - 信息收集 内容概要
  • 江协科技STM32 14-1 WDG看门狗
  • Flask ORM 模型(轻松版)
  • 08.Redis 持久化
  • UniApp 实现顶部固定导航栏 Tab 及滚动变色效果
  • Python篇--- Python 的加载、缓存、覆盖机制