PHP PDOStatement::columnCount
最后修改于 2025 年 4 月 19 日
PDOStatement::columnCount 方法返回 PDOStatement 对象所表示的结果集中的列数。这对于动态结果处理非常有用。
基本定义
PDOStatement::columnCount 返回一个整数,表示结果集中的列数。它在执行 SELECT 查询后工作。
语法:public PDOStatement::columnCount(): int。该方法不接受任何参数,并返回列数,如果没有结果集则返回零。
基本的 columnCount 示例
这展示了 columnCount 与 SELECT 查询的最简单用法。
<?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。
<?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。
<?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 的行为。
<?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 来处理未知的结果集。
<?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 不受获取模式的影响。
<?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 行为。
<?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,因为它们不产生结果集。始终检查该值。
最佳实践
- 使用前检查:在处理之前验证 columnCount > 0。
- 与 getColumnMeta 结合使用:获取详细的列信息。
- 与动态查询一起使用:当结果结构未知时。
- 错误处理:始终将代码包装在 try-catch 块中。
- 性能:调用 columnCount 没有明显的开销。
来源
PHP PDOStatement::columnCount 文档
本教程通过实际示例介绍了 PDOStatement::columnCount 方法,展示了其在不同数据库场景下的用法。
作者
列出 所有 PHP PDO 函数。