导读:本期聚焦于小伙伴创作的《PHP数据库操作完全指南:从连接到增删改查的SQL执行与安全实践》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP数据库操作完全指南:从连接到增删改查的SQL执行与安全实践》有用,将其分享出去将是对创作者最好的鼓励。

PHP执行SQL查询语句:增删改查操作详解

在Web开发中,PHP与数据库(尤其是MySQL)的交互是核心功能之一。通过PHP执行SQL查询语句,我们可以实现对数据库数据的增、删、改、查(CRUD)操作。本文将详细介绍如何使用PHP连接数据库并执行SQL查询,并通过具体的代码示例演示完整的CRUD流程。

一、连接数据库

在执行任何SQL操作之前,必须首先建立PHP与数据库服务器之间的连接。推荐使用MySQLi(MySQL Improved)或PDO(PHP Data Objects)扩展,因为它们提供了更好的安全性和面向对象的接口。

使用MySQLi扩展连接

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>

使用PDO扩展连接

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置PDO错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功";
} catch(PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}
?>

二、查询(SELECT)数据

查询操作是最常用的数据库操作,用于从表中检索数据。

MySQLi面向过程风格查询

<?php
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    // 输出每行数据
    while($row = mysqli_fetch_assoc($result)) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
    }
} else {
    echo "0 结果";
}
mysqli_free_result($result);
?>

PDO风格查询

<?php
$stmt = $conn->prepare("SELECT id, name, email FROM users");
$stmt->execute();

// 设置结果集为关联数组
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "0 结果";
}
?>

三、插入(INSERT)数据

向数据库表中添加新记录。

重要提示:为了防止SQL注入攻击,请务必使用参数化查询(预处理语句)。

MySQLi预处理语句插入

<?php
// 准备SQL并绑定参数
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // “ss”表示两个字符串参数

// 设置参数并执行
$name = "张三";
$email = "zhangsan@example.com";
$stmt->execute();

echo "新记录插入成功,最后插入的ID是: " . $stmt->insert_id;
$stmt->close();
?>

PDO预处理语句插入

<?php
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $conn->prepare($sql);

// 绑定参数
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);

// 插入第一行
$name = "李四";
$email = "lisi@example.com";
$stmt->execute();

echo "新记录插入成功,最后插入的ID是: " . $conn->lastInsertId();
?>

四、更新(UPDATE)数据

修改数据库中已存在的记录。

MySQLi预处理语句更新

<?php
$stmt = $conn->prepare("UPDATE users SET email=? WHERE name=?");
$stmt->bind_param("ss", $email, $name);

$email = "newemail@example.com";
$name = "张三";
$stmt->execute();

echo "更新了 " . $stmt->affected_rows . " 条记录";
$stmt->close();
?>

PDO预处理语句更新

<?php
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $conn->prepare($sql);

$stmt->bindParam(':email', $email);
$stmt->bindParam(':id', $id);

// 执行更新
$id = 1;
$email = "updated@example.com";
$stmt->execute();

echo "更新了 " . $stmt->rowCount() . " 条记录";
?>

五、删除(DELETE)数据

从数据库表中移除记录。

MySQLi预处理语句删除

<?php
$stmt = $conn->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id); // “i”表示整数参数

$id = 5;
$stmt->execute();

echo "删除了 " . $stmt->affected_rows . " 条记录";
$stmt->close();
?>

PDO预处理语句删除

<?php
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $conn->prepare($sql);

$stmt->bindParam(':id', $id);

$id = 10;
$stmt->execute();

echo "删除了 " . $stmt->rowCount() . " 条记录";
?>

六、完整的CRUD操作示例

以下是一个使用MySQLi面向对象风格,在一个脚本中整合了增删改查所有操作的综合示例。假设我们有一个名为 products 的表,字段为 id(自增主键),nameprice

<?php
// 1. 连接数据库
$conn = new mysqli("localhost", "root", "", "test_db");
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 2. 创建表(如果不存在)
$createTableSQL = "CREATE TABLE IF NOT EXISTS products (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    price DECIMAL(10,2) NOT NULL
)";
if ($conn->query($createTableSQL) === FALSE) {
    echo "创建表错误: " . $conn->error;
}

echo "<h2>产品CRUD操作演示</h2>";

// 3. 插入数据(C - Create)
$insertStmt = $conn->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
$insertStmt->bind_param("sd", $productName, $productPrice); // s:字符串, d:双精度浮点数
$productName = "笔记本电脑";
$productPrice = 5999.99;
$insertStmt->execute();
$lastId = $insertStmt->insert_id;
echo "<p>插入新产品,ID: $lastId</p>";
$insertStmt->close();

// 4. 查询数据(R - Read)
$selectSQL = "SELECT id, name, price FROM products";
$result = $conn->query($selectSQL);
if ($result->num_rows > 0) {
    echo "<h3>产品列表</h3>";
    echo "<ul>";
    while($row = $result->fetch_assoc()) {
        echo "<li>ID: " . $row["id"]. " - 名称: " . $row["name"]. " - 价格: ¥" . $row["price"]. "</li>";
    }
    echo "</ul>";
} else {
    echo "<p>没有找到产品。</p>";
}
$result->free_result();

// 5. 更新数据(U - Update)
$updateStmt = $conn->prepare("UPDATE products SET price = ? WHERE id = ?");
$updateStmt->bind_param("di", $newPrice, $updateId);
$newPrice = 5499.99;
$updateId = $lastId; // 更新我们刚刚插入的产品
$updateStmt->execute();
echo "<p>更新了ID为 $updateId 的产品价格。影响行数: " . $updateStmt->affected_rows . "</p>";
$updateStmt->close();

// 6. 删除数据(D - Delete)
$deleteStmt = $conn->prepare("DELETE FROM products WHERE id = ?");
$deleteStmt->bind_param("i", $deleteId);
// 假设我们要删除另一个ID为1的记录,确保它存在
$deleteId = 1;
$deleteStmt->execute();
echo "<p>尝试删除ID为 $deleteId 的产品。影响行数: " . $deleteStmt->affected_rows . "</p>";
$deleteStmt->close();

// 7. 关闭连接
$conn->close();
?>

七、安全注意事项与最佳实践

  • 始终使用预处理语句:如上文所有示例所示,使用预处理语句(参数化查询)是防止SQL注入攻击的唯一可靠方法。不要直接将用户输入拼接到SQL字符串中。

  • 验证与过滤输入:在执行数据库操作前,应对用户输入的数据进行验证和过滤。

  • 错误处理:在生产环境中,应将数据库错误信息记录到日志文件,而不是直接显示给用户,以避免信息泄露。

  • 关闭连接:脚本执行完毕后,应显式关闭数据库连接($conn->close();$conn = null;),释放资源。

  • 选择正确的API:对于新项目,建议优先使用PDO,因为它支持多种数据库,且接口一致。MySQLi则对MySQL有更深入的原生支持。

结论

通过PHP执行SQL语句实现数据库的增删改查是动态网站开发的基础。掌握MySQLi和PDO两种扩展的使用方法,并始终贯彻使用预处理语句的安全原则,是构建安全、健壮的PHP应用的关键。本文提供的示例代码可以直接修改后用于实际项目,为您快速上手PHP数据库操作提供了清晰的路径。

PHP数据库操作 SQL增删改查 MySQLi PDO 预处理语句

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。