PHP PDO::exec 方法
最后修改于 2025 年 4 月 19 日
PDO::exec 方法执行 SQL 语句并返回受影响的行数。它适用于 INSERT、UPDATE、DELETE 以及不返回结果集的其他语句。
基本定义
PDO::exec 在单个函数调用中执行 SQL 语句。它返回受该语句影响的行数。对于 SELECT 语句,请改用 PDO::query。
语法:public PDO::exec(string $statement): int|false。该方法在失败时返回 false。始终检查返回值。
PDO::exec 基本用法
这展示了 PDO::exec 创建表的。最简单的用法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('sqlite:mydatabase.db');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$count = $pdo->exec("CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
)");
echo "Table created successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会创建一个新的 SQLite 数据库表。对于 CREATE TABLE 语句,exec 方法返回 0,因为没有行受到影响。始终使用 try-catch 进行错误处理。
使用 PDO::exec 插入数据
这演示了使用 PDO::exec 向表中插入数据。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$count = $pdo->exec("INSERT INTO users (name, email)
VALUES ('John Doe', 'john@example.com'),
('Jane Smith', 'jane@example.com')");
echo "Inserted $count rows";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会将两行插入 users 表。exec 方法返回受影响的行数(在本例中为 2)。请注意,此方法在使用用户输入时容易受到 SQL 注入攻击。
使用 PDO::exec 更新数据
这显示了如何使用 PDO::exec 更新记录。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$count = $pdo->exec("UPDATE users SET email = 'newjohn@example.com'
WHERE name = 'John Doe'");
if ($count > 0) {
echo "Updated $count rows";
} else {
echo "No rows updated";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会更新名为“John Doe”的用户的电子邮件地址。该方法返回更新的行数。始终检查行是否实际已修改。
使用 PDO::exec 删除数据
这演示了如何从表中删除记录。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$count = $pdo->exec("DELETE FROM users WHERE email LIKE '%example.com'");
echo "Deleted $count rows";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会删除所有电子邮件地址为 example.com 的用户。LIKE 操作符匹配模式。该方法返回删除的行数。请谨慎使用 DELETE 语句。
在事务中使用 PDO::exec
这显示了 PDO::exec 在事务中用于原子操作。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
$pdo->commit();
echo "Transaction completed successfully";
} catch (PDOException $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
这会原子地执行账户之间的资金转账。两个更新同时成功或失败。始终在 catch 块中使用 rollBack 来维护数据一致性。
PDO::exec 与 DDL 语句
这演示了使用 PDO::exec 进行数据库模式修改。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("ALTER TABLE users ADD COLUMN age INT");
$pdo->exec("CREATE INDEX idx_email ON users(email)");
echo "Database schema modified successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这会向 users 表添加一个新列并创建一个索引。DDL 语句(CREATE、ALTER、DROP)通常返回 0 行受影响。这些操作通常不是事务性的。
PDO::exec 的安全注意事项
这重点介绍了将 PDO::exec 与用户输入一起使用时的安全风险。
<?php
declare(strict_types=1);
// UNSAFE EXAMPLE - DO NOT USE IN PRODUCTION
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$name = $_GET['name']; // User input - potential SQL injection!
$count = $pdo->exec("DELETE FROM users WHERE name = '$name'");
echo "Deleted $count rows";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
// SAFE ALTERNATIVE USING PREPARED STATEMENTS
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("DELETE FROM users WHERE name = ?");
$stmt->execute([$_GET['name']]);
echo "Deleted " . $stmt->rowCount() . " rows";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
第一个示例容易受到 SQL 注入攻击。切勿将用户输入直接插入 SQL。始终对用户提供的数据使用带绑定参数的预处理语句。
最佳实践
- 避免用户输入:切勿直接将用户输入用于 PDO::exec。
- 错误处理:始终使用 try-catch 块。
- 检查返回值:验证受影响的行数。
- 事务:用于多个相关操作。
- 预处理语句:数据修改首选。
来源
本教程涵盖了 PDO::exec 方法,并通过实际示例展示了其在不同数据库操作中的用法。
作者
列出 所有 PHP PDO 函数。