PHP PDOStatement::execute 方法
最后修改于 2025 年 4 月 19 日
PDOStatement::execute 方法在 PHP 中执行预处理语句。它是使用 PDO 进行安全数据库操作的关键部分。
基本定义
PDOStatement::execute 使用绑定的参数运行预处理语句。成功时返回 true,失败时返回 false。
语法: PDOStatement::execute(array $input_parameters = null): bool。参数可以作为数组传递,也可以单独绑定。
基本执行示例
这展示了 PDOStatement::execute 与位置参数的最简单用法。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO products (name, price) VALUES (?, ?)');
$stmt->execute(['Laptop', 999.99]);
echo "Product inserted successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这准备了一个带有两个位置占位符的 INSERT 语句。execute 方法在与占位符匹配的数组中接收值。
命名参数示例
这演示了使用 PDOStatement::execute 的命名参数。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('UPDATE users SET email = :email WHERE id = :id');
$stmt->execute(['email' => 'new@example.com', 'id' => 42]);
echo "User updated successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
命名参数使 SQL 语句更具可读性。execute 方法接受一个关联数组,其中键与参数名称匹配。
使用 BindParam 执行
这展示了在执行前显式绑定参数。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM orders WHERE total > :min AND status = :status');
$min = 100;
$status = 'completed';
$stmt->bindParam(':min', $min, PDO::PARAM_INT);
$stmt->bindParam(':status', $status, PDO::PARAM_STR);
$stmt->execute();
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($orders);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
bindParam 通过引用将变量绑定到参数。这允许在执行前更改变量值。指定了参数类型。
使用 BindValue 执行
这演示了将值直接绑定到参数。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO logs (message, level, created_at) VALUES (:msg, :lvl, :dt)');
$stmt->bindValue(':msg', 'System started', PDO::PARAM_STR);
$stmt->bindValue(':lvl', 'INFO', PDO::PARAM_STR);
$stmt->bindValue(':dt', date('Y-m-d H:i:s'), PDO::PARAM_STR);
$stmt->execute();
echo "Log entry created";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
bindValue 将特定值绑定到参数。与 bindParam 不同,值在绑定时固定。适用于常量值。
执行多行
这展示了使用不同的参数集执行相同的语句。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO colors (name, hex_code) VALUES (?, ?)');
$colors = [
['Red', '#FF0000'],
['Green', '#00FF00'],
['Blue', '#0000FF']
];
foreach ($colors as $color) {
$stmt->execute($color);
}
echo "Colors inserted successfully";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
相同的预处理语句会执行多次,使用不同的参数数组。这对于批量插入很有效。
执行输出参数
这演示了使用存储过程的输出参数。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('CALL calculate_discount(:price, :discount OUT)');
$price = 100;
$discount = 0;
$stmt->bindParam(':price', $price, PDO::PARAM_INT);
$stmt->bindParam(':discount', $discount, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 10);
$stmt->execute();
echo "Original price: $price, Discount: $discount";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
这调用了一个带有输出参数的存储过程。discount 参数由过程修改,并在执行后检索。
执行事务
这展示了在事务中使用 execute 来执行原子操作。
<?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();
$stmt1 = $pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?');
$stmt1->execute([100, 1]);
$stmt2 = $pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?');
$stmt2->execute([100, 2]);
$pdo->commit();
echo "Funds transferred successfully";
} catch (PDOException $e) {
$pdo->rollBack();
echo "Transfer failed: " . $e->getMessage();
}
这执行了账户之间的资金转账。两个 execute 调用都必须成功,否则事务将被回滚。确保数据一致性。
最佳实践
- 始终使用预处理语句: 防止 SQL 注入。
- 指定参数类型: 使用 bindParam/bindValue 时。
- 重用语句: 准备一次,执行多次。
- 错误处理: 始终捕获 PDOException。
- 关闭游标: 完成后调用 closeCursor()。
来源
本教程介绍了 PDOStatement::execute 方法,并通过实际示例展示了不同的用法场景和最佳实践。
作者
列出 所有 PHP PDO 函数。