ZetCode

PHP PDOStatementInterface

最后修改于 2025 年 4 月 19 日

PHP 中的 PDOStatementInterface 代表预处理语句及其结果。它提供了执行查询和获取数据的方法。

基本定义

PDOStatementInterface 是一个定义预处理语句方法的接口。它由 PDOStatement 类实现。

主要方法包括 executefetchfetchAllbindParambindValue。这些方法负责查询执行和结果处理。

PDOStatement 的基本用法

此示例展示了 PDOStatement 的基本预处理语句用法。

pdo_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('SELECT * FROM users WHERE id = ?');
    $stmt->execute([1]);
    
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    print_r($user);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会创建一个预处理语句,用一个参数执行它,并获取结果。fetch 方法将数据作为关联数组返回。

绑定参数

这演示了使用 PDOStatement 进行显式参数绑定。

pdo_bind.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 (:name, :price)');
    
    $name = 'Laptop';
    $price = 999.99;
    
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->bindParam(':price', $price, PDO::PARAM_STR);
    
    $stmt->execute();
    echo "Product inserted successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码使用 bindParam 将变量显式绑定到参数。第三个参数指定数据类型。值按引用绑定。

获取多行

这展示了如何使用 PDOStatement 获取多行。

pdo_fetch_all.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 products WHERE price > ?');
    $stmt->execute([500]);
    
    $products = $stmt->fetchAll(PDO::FETCH_OBJ);
    
    foreach ($products as $product) {
        echo "{$product->name}: {$product->price}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将匹配条件的所有行作为对象获取。fetchAll 一次检索完整的记录集。FETCH_OBJ 返回 stdClass 对象。

列绑定

这演示了将结果列绑定到 PHP 变量。

pdo_bind_column.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 name, email FROM users WHERE id = ?');
    $stmt->execute([1]);
    
    $stmt->bindColumn('name', $name);
    $stmt->bindColumn('email', $email);
    
    if ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "Name: $name, Email: $email";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将结果列绑定到变量。当使用 FETCH_BOUND 调用 fetch 时,变量会自动填充。列名必须与查询匹配。

行计数

这展示了如何获取语句影响的行数。

pdo_row_count.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 products SET price = price * 1.1 WHERE category = ?');
    $stmt->execute(['Electronics']);
    
    $count = $stmt->rowCount();
    echo "Updated $count products";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

rowCount 返回最后一条语句影响的行数。对于 SELECT 语句,行为可能因数据库驱动程序而异。

获取列元数据

这演示了从结果集中检索列信息。

pdo_metadata.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 products LIMIT 1');
    $stmt->execute();
    
    $meta = $stmt->getColumnMeta(0);
    print_r($meta);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

getColumnMeta 返回一个包含结果列信息的数组。这些信息包括名称、类型、表和其他特定于驱动程序的详细信息。

设置获取模式

这展示了如何为语句设置默认获取模式。

pdo_fetch_mode.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 users');
    $stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
    $stmt->execute();
    
    $users = $stmt->fetchAll();
    foreach ($users as $user) {
        echo $user->getName();
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

setFetchMode 配置结果的获取方式。此示例获取 User 类实例。类必须在使用前定义。

最佳实践

来源

PHP PDOStatement 文档

本教程介绍了 PDOStatementInterface,并通过实际示例展示了不同场景下的数据库操作。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP PDO 函数