ZetCode

PHP PDO::query 方法

最后修改于 2025 年 4 月 19 日

PDO::query 方法执行一条 SQL 语句,并以 PDOStatement 对象的形式返回结果集。它最适合不需要参数的 SELECT 语句。

基本定义

PDO::query 在单次函数调用中执行一条 SQL 语句。它以 PDOStatement 对象的形式返回结果集。此方法适用于一次性查询。

语法:public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false。$query 参数包含要执行的 SQL。$fetchMode 可选地设置获取模式。

基本 SELECT 查询

此示例演示了使用 PDO::query 的简单 SELECT 查询。

pdo_query_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->query('SELECT id, name, email FROM users');
    
    foreach ($stmt as $row) {
        echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会执行一个 SELECT 查询并遍历结果。query 方法返回一个 PDOStatement 对象。我们可以直接使用 foreach 遍历它。

带获取模式的查询

这展示了如何在 query 方法中直接指定获取模式。

pdo_query_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->query('SELECT id, name FROM users', PDO::FETCH_ASSOC);
    
    while ($row = $stmt->fetch()) {
        echo "ID: {$row['id']}, Name: {$row['name']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

在这里,我们将 PDO::FETCH_ASSOC 指定为获取模式。这使得 fetch 方法将结果作为关联数组返回。该模式适用于所有后续的获取。

带对象获取模式的查询

这演示了如何使用 PDO::query 将结果作为对象获取。

pdo_query_object.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->query('SELECT id, name FROM users', PDO::FETCH_OBJ);
    
    while ($user = $stmt->fetch()) {
        echo "ID: {$user->id}, Name: {$user->name}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

使用 PDO::FETCH_OBJ 可使 fetch 返回 stdClass 对象。我们使用对象运算符(->)访问属性。这对于面向对象的代码很有用。

带获取全部的查询

此示例展示了如何使用 fetchAll 一次性检索所有结果。

pdo_query_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->query('SELECT id, name, email FROM users');
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($users as $user) {
        echo "ID: {$user['id']}, Name: {$user['name']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

fetchAll 将所有行一次性检索到一个数组中。这对于小型结果集很方便。对于大型数据集,请考虑逐行获取。

带列数的查询

这演示了如何从查询结果中获取列信息。

pdo_query_column_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->query('SELECT id, name, email FROM users');
    
    echo "Column count: " . $stmt->columnCount() . "\n";
    
    for ($i = 0; $i < $stmt->columnCount(); $i++) {
        $meta = $stmt->getColumnMeta($i);
        echo "Column {$i}: {$meta['name']} ({$meta['native_type']})\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

columnCount 返回结果集中的列数。getColumnMeta 提供每列的元数据。这对于动态处理很有用。

带单行的查询

这展示了如何仅从查询结果中检索一行。

pdo_query_single_row.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->query('SELECT name, email FROM users WHERE id = 1');
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($user) {
        echo "Name: {$user['name']}, Email: {$user['email']}\n";
    } else {
        echo "User not found\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

当您只需要一行时,fetch 只获取那一行。这比 fetchAll 用于单行结果更有效。始终检查结果是否存在。

带行数的查询

这演示了如何获取查询返回的行数。

pdo_query_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->query('SELECT id, name FROM users');
    $rowCount = $stmt->rowCount();
    
    echo "Number of rows: $rowCount\n";
    
    if ($rowCount > 0) {
        foreach ($stmt as $row) {
            echo "ID: {$row['id']}, Name: {$row['name']}\n";
        }
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

rowCount 返回最后一条语句影响的行数。对于 SELECT 语句,它可能无法与所有数据库驱动程序一起使用。请检查您的驱动程序文档。

最佳实践

来源

PHP PDO::query 文档

本教程涵盖了 PDO::query 方法,并提供了实际示例,展示了在 PHP 中执行和处理 SQL 查询的各种方法。

作者

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

列出 所有 PHP PDO 函数