ZetCode

PHP PDOStatement::columnCount

最后修改于 2025 年 4 月 19 日

PDOStatement::columnCount 方法返回 PDOStatement 对象所表示的结果集中的列数。这对于动态结果处理非常有用。

基本定义

PDOStatement::columnCount 返回一个整数,表示结果集中的列数。它在执行 SELECT 查询后工作。

语法:public PDOStatement::columnCount(): int。该方法不接受任何参数,并返回列数,如果没有结果集则返回零。

基本的 columnCount 示例

这展示了 columnCount 与 SELECT 查询的最简单用法。

basic_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');
    $columnCount = $stmt->columnCount();
    
    echo "The result set contains {$columnCount} columns";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这连接到数据库并执行 SELECT 查询。columnCount 返回 3,因为我们选择了 id、name 和 email 列。始终使用 try-catch 检查错误。

带预处理语句的 columnCount

这演示了带预处理语句的 columnCount。

prepared_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->prepare('SELECT * FROM products WHERE price > ?');
    $stmt->execute([50]);
    
    echo "Product result set has {$stmt->columnCount()} columns";
    
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这使用了带参数的预处理语句。columnCount 在 execute() 后工作。SELECT * 表示它返回表中的所有列。实际计数取决于表结构。

带 JOIN 查询的 columnCount

这展示了带连接多个表的查询的 columnCount。

join_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);
    
    $sql = 'SELECT u.name, o.order_date, o.total 
            FROM users u 
            JOIN orders o ON u.id = o.user_id';
    
    $stmt = $pdo->query($sql);
    echo "Joined result has {$stmt->columnCount()} columns";
    
    // Display column names
    for ($i = 0; $i < $stmt->columnCount(); $i++) {
        $meta = $stmt->getColumnMeta($i);
        echo "Column {$i}: {$meta['name']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这个 JOIN 查询从两个表中返回 3 列。我们使用 columnCount 获取总列数,然后使用 getColumnMeta 显示每列的名称。这有助于处理未知的结果结构。

带空结果的 columnCount

这演示了未返回行时 columnCount 的行为。

empty_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, title FROM articles WHERE id = 999');
    
    if ($stmt->rowCount() === 0) {
        echo "No rows found, but column count is: {$stmt->columnCount()}";
    } else {
        while ($row = $stmt->fetch()) {
            print_r($row);
        }
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

即使没有行匹配查询(rowCount 为 0),columnCount 仍然返回结果集中将有的列数。在这里,它为 id 和 title 列返回 2。

动态结果处理

这展示了如何使用 columnCount 来处理未知的结果集。

dynamic_processing.php
<?php

declare(strict_types=1);

function processResult(PDOStatement $stmt): void {
    $columnCount = $stmt->columnCount();
    
    echo "Processing {$columnCount} columns:\n";
    
    while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
        for ($i = 0; $i < $columnCount; $i++) {
            echo "Column {$i}: {$row[$i]} | ";
        }
        echo "\n";
    }
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT * FROM products LIMIT 3');
    processResult($stmt);
    
    $stmt = $pdo->query('SELECT id, name FROM users LIMIT 2');
    processResult($stmt);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

processResult 函数通过使用 columnCount 来确定要处理的列数,从而处理任何查询。FETCH_NUM 返回与列位置匹配的索引数组。这种方法处理不同的结果结构。

带不同获取模式的 columnCount

这表明 columnCount 不受获取模式的影响。

fetch_mode_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, created_at FROM users');
    
    echo "Initial column count: {$stmt->columnCount()}\n";
    
    // Change fetch mode - doesn't affect columnCount
    $stmt->setFetchMode(PDO::FETCH_OBJ);
    echo "After FETCH_OBJ: {$stmt->columnCount()}\n";
    
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    echo "After FETCH_ASSOC: {$stmt->columnCount()}\n";
    
    $stmt->setFetchMode(PDO::FETCH_NUM);
    echo "After FETCH_NUM: {$stmt->columnCount()}\n";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

使用 setFetchMode 更改获取模式不会影响 columnCount。该方法始终返回结果集中的实际列数,而不管您选择如何获取数据。

带不同查询类型的 columnCount

这显示了带非 SELECT 查询的 columnCount 行为。

non_select_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);
    
    // SELECT query
    $stmt = $pdo->query('SELECT * FROM users LIMIT 1');
    echo "SELECT column count: {$stmt->columnCount()}\n";
    
    // INSERT query
    $stmt = $pdo->query('INSERT INTO users (name) VALUES ("Test")');
    echo "INSERT column count: {$stmt->columnCount()}\n";
    
    // UPDATE query
    $stmt = $pdo->query('UPDATE users SET name = "Test2" WHERE id = 1');
    echo "UPDATE column count: {$stmt->columnCount()}\n";
    
    // SHOW query
    $stmt = $pdo->query('SHOW TABLES');
    echo "SHOW column count: {$stmt->columnCount()}\n";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

columnCount 返回结果集中的列数。对于 SELECT 和 SHOW 查询,这将是正数。对于 INSERT、UPDATE、DELETE,它返回 0,因为它们不产生结果集。始终检查该值。

最佳实践

来源

PHP PDOStatement::columnCount 文档

本教程通过实际示例介绍了 PDOStatement::columnCount 方法,展示了其在不同数据库场景下的用法。

作者

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

列出 所有 PHP PDO 函数