ZetCode

PHP PDOStatement::getColumnMeta

最后修改于 2025 年 4 月 19 日

PDOStatement::getColumnMeta 方法用于检索结果集列的元数据。它提供有关列名、类型和其他详细信息的信息。

基本定义

PDOStatement::getColumnMeta 返回一个关联数组,其中包含结果集列的元数据。该方法接受一个从零开始的列索引。

语法: PDOStatement::getColumnMeta(int $column)。成功时返回元数据数组,失败时返回 false。并非所有驱动程序都支持此方法。

基本列元数据

此示例显示如何获取结果集第一列的基本元数据。

basic_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->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)的元数据。输出包括列名、原生类型、标志、表名和其他信息。

获取所有列的元数据

此示例演示如何获取结果集中所有列的元数据。

all_columns_meta.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 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() 循环遍历所有列并获取每列的元数据。它显示每列的名称以及数据库中的原生数据类型。

检查列标志

此示例演示如何检查主键或非空等列标志。

column_flags.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 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 约束。不同的驱动程序可能返回不同的标志。

获取列的表名

此示例演示如何获取结果集列的源表名。

table_name.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 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 不受支持的情况。

unsupported_driver.php
<?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。请务必检查返回值。

使用不同的数据类型

此示例检查不同数据类型如何在列元数据中显示。

data_types.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, 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)。

构建动态结果处理器

此示例展示了如何使用列元数据动态处理结果。

dynamic_processor.php
<?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();
}

此函数使用列元数据来处理结果,而无需提前知道结构。它显示每列的名称、类型和值。

最佳实践

来源

PHP getColumnMeta 文档

本教程介绍了 PDOStatement::getColumnMeta 方法,并通过实际示例展示了如何在 PHP 应用程序中检索和使用列元数据。

作者

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

列出 所有 PHP PDO 函数