ZetCode

PHP PDOStatement::execute 方法

最后修改于 2025 年 4 月 19 日

PDOStatement::execute 方法在 PHP 中执行预处理语句。它是使用 PDO 进行安全数据库操作的关键部分。

基本定义

PDOStatement::execute 使用绑定的参数运行预处理语句。成功时返回 true,失败时返回 false。

语法: PDOStatement::execute(array $input_parameters = null): bool。参数可以作为数组传递,也可以单独绑定。

基本执行示例

这展示了 PDOStatement::execute 与位置参数的最简单用法。

pdo_execute_basic.php
<?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 的命名参数。

pdo_execute_named.php
<?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 执行

这展示了在执行前显式绑定参数。

pdo_execute_bindparam.php
<?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 执行

这演示了将值直接绑定到参数。

pdo_execute_bindvalue.php
<?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 不同,值在绑定时固定。适用于常量值。

执行多行

这展示了使用不同的参数集执行相同的语句。

pdo_execute_multiple.php
<?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();
}

相同的预处理语句会执行多次,使用不同的参数数组。这对于批量插入很有效。

执行输出参数

这演示了使用存储过程的输出参数。

pdo_execute_output.php
<?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 来执行原子操作。

pdo_execute_transaction.php
<?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 调用都必须成功,否则事务将被回滚。确保数据一致性。

最佳实践

来源

PHP PDOStatement::execute 文档

本教程介绍了 PDOStatement::execute 方法,并通过实际示例展示了不同的用法场景和最佳实践。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP PDO 函数