ZetCode

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 创建表的。最简单的用法。

pdo_exec_create.php
<?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 向表中插入数据。

pdo_exec_insert.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);
    
    $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 更新记录。

pdo_exec_update.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);
    
    $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 删除数据

这演示了如何从表中删除记录。

pdo_exec_delete.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);
    
    $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 在事务中用于原子操作。

pdo_exec_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();
    
    $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 进行数据库模式修改。

pdo_exec_ddl.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->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 与用户输入一起使用时的安全风险。

pdo_exec_security.php
<?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。始终对用户提供的数据使用带绑定参数的预处理语句。

最佳实践

来源

PHP PDO::exec 文档

本教程涵盖了 PDO::exec 方法,并通过实际示例展示了其在不同数据库操作中的用法。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 PHP PDO 函数