PHP PDOStatement::getColumnMeta
最后修改于 2025 年 4 月 19 日
PDOStatement::getColumnMeta 方法用于检索结果集列的元数据。它提供有关列名、类型和其他详细信息的信息。
基本定义
PDOStatement::getColumnMeta 返回一个关联数组,其中包含结果集列的元数据。该方法接受一个从零开始的列索引。
语法: PDOStatement::getColumnMeta(int $column)
。成功时返回元数据数组,失败时返回 false。并非所有驱动程序都支持此方法。
基本列元数据
此示例显示如何获取结果集第一列的基本元数据。
<?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 LIMIT 1'); $meta = $stmt->getColumnMeta(0); echo "Column 0 Metadata:\n"; print_r($meta); } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这会检索结果集第一列(索引为 0)的元数据。输出包括列名、原生类型、标志、表名和其他信息。
获取所有列的元数据
此示例演示如何获取结果集中所有列的元数据。
<?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 LIMIT 1'); $columnCount = $stmt->columnCount(); for ($i = 0; $i < $columnCount; $i++) { $meta = $stmt->getColumnMeta($i); echo "Column $i: {$meta['name']} ({$meta['native_type']})\n"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
此代码使用 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 FROM users LIMIT 1'); $meta = $stmt->getColumnMeta(0); if (in_array('primary_key', $meta['flags'])) { echo "Column {$meta['name']} is a primary key\n"; } if (in_array('not_null', $meta['flags'])) { echo "Column {$meta['name']} cannot be null\n"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
此代码检查列元数据中的 flags 数组,以确定该列是否为主键或具有 NOT NULL 约束。不同的驱动程序可能返回不同的标志。
获取列的表名
此示例演示如何获取结果集列的源表名。
<?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 u.id, u.name, p.title FROM users u JOIN posts p ON u.id = p.user_id'); $meta = $stmt->getColumnMeta(2); if (isset($meta['table'])) { echo "Column {$meta['name']} comes from table {$meta['table']}\n"; } else { echo "Table information not available\n"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这会获取 JOIN 查询结果中第三列的表名。请注意,并非所有数据库驱动程序都可能在元数据中提供表信息。
处理不支持的驱动程序
此示例显示了如何处理 getColumnMeta 不受支持的情况。
<?php declare(strict_types=1); try { $pdo = new PDO('sqlite::memory:'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)'); $stmt = $pdo->query('SELECT * FROM test'); $meta = $stmt->getColumnMeta(0); if ($meta === false) { echo "getColumnMeta not supported by SQLite driver\n"; } else { print_r($meta); } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
此代码测试 SQLite 驱动程序是否支持 getColumnMeta。对于不受支持的驱动程序,该方法返回 false。请务必检查返回值。
使用不同的数据类型
此示例检查不同数据类型如何在列元数据中显示。
<?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, salary, created_at FROM users LIMIT 1'); for ($i = 0; $i < $stmt->columnCount(); $i++) { $meta = $stmt->getColumnMeta($i); echo "{$meta['name']}: {$meta['native_type']} (len: {$meta['len']})\n"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
此代码显示每列的原生类型和长度。不同的数据库系统可能以不同的方式报告类型(例如,INT vs INTEGER)。
构建动态结果处理器
此示例展示了如何使用列元数据动态处理结果。
<?php declare(strict_types=1); function processResults(PDOStatement $stmt): void { $columnCount = $stmt->columnCount(); $columns = []; // Get metadata for all columns for ($i = 0; $i < $columnCount; $i++) { $columns[$i] = $stmt->getColumnMeta($i); } // Process each row while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { foreach ($row as $col => $value) { $index = array_search($col, array_column($columns, 'name')); $type = $columns[$index]['native_type']; echo "{$col} ({$type}): " . htmlspecialchars($value) . "\n"; } 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 id, name, email FROM users LIMIT 5'); processResults($stmt); } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
此函数使用列元数据来处理结果,而无需提前知道结构。它显示每列的名称、类型和值。
最佳实践
- 检查支持:验证驱动程序是否支持 getColumnMeta。
- 错误处理: 始终检查 false 返回值。
- 列索引:请记住它们是从零开始的。
- 性能:如果元数据被重复使用,请缓存它。
- 驱动程序差异:注意实现的变化。
来源
本教程介绍了 PDOStatement::getColumnMeta 方法,并通过实际示例展示了如何在 PHP 应用程序中检索和使用列元数据。
作者
列出 所有 PHP PDO 函数。