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的高级特性,如命名空间、异常处理、文件操作等主题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值