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(自增主键),name,price。
<?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数据库操作提供了清晰的路径。