PDOStatement::getColumnMeta

下载 PHP 驱动程序

检索列的元数据。

语法

  
array PDOStatement::getColumnMeta ( $column );  

参数

$conn:(整数)要检索其元数据的列的从零开始的数。

返回值

包含列的元数据的关联阵列(键和值)。 有关数组中的字段的说明,请参阅“备注”部分。

注解

下表介绍 getColumnMeta 返回的数组中的字段。

名称 VALUES
native_type 指定列的 PHP 类型。 始终为字符串。
driver:decl_type 指定用于表示数据库中的列值的 SQL 类型。 如果结果集中的列是函数的结果,则 PDOStatement::getColumnMeta 不会返回此值。
flags 指定为此列设置的标志。 始终为 0。
name 指定数据库中的列的名称。
指定包含数据库中的列的表格名称。 始终为空白。
len 指定列长度。
精准率 指定此列的数值精度。
pdo_type 指定此列的类型,由 PDO::PARAM_* 常量表示。 Always PDO::PARAM_STR (2)。

已在 Microsoft Drivers for PHP for SQL Server的版本 2.0 中添加了对 PDO 的支持。

示例

<?php  
$database = "AdventureWorks";  
$server = "(local)";  
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");  
  
$stmt = $conn->query("select * from Person.ContactType");  
$metadata = $stmt->getColumnMeta(2);  
var_dump($metadata);  
  
print $metadata['sqlsrv:decl_type'] . "\n";  
print $metadata['native_type'] . "\n";  
print $metadata['name'];  
?>  

敏感度数据分类元数据

从版本 5.8.0 开始,用户可以使用新的语句属性 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION 通过 PDOStatement::getColumnMeta(需要 Microsoft ODBC Driver 17.4.2 或更高版本)来访问 Microsoft SQL Server 2019 中的敏感度数据分类元数据

请注意,默认情况下 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION 属性为 false,但当设置为 true 时,将使用敏感度数据分类元数据(如果存在)填充上述数组字段 flags

以患者表为例:

CREATE TABLE Patients 
      [PatientId] int identity,
      [SSN] char(11),
      [FirstName] nvarchar(50),
      [LastName] nvarchar(50),
      [BirthDate] date)

我们可以将 SSN 和 BirthDate 列分类,如下所示:

ADD SENSITIVITY CLASSIFICATION TO [Patients].SSN WITH (LABEL = 'Highly Confidential - secure privacy', INFORMATION_TYPE = 'Credentials')
ADD SENSITIVITY CLASSIFICATION TO [Patients].BirthDate WITH (LABEL = 'Confidential Personal Data', INFORMATION_TYPE = 'Birthdays')

若要访问元数据,请在将 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION 设置为 true 后使用 PDOStatement::getColumnMeta,如以下代码片段所示:

$options = array(PDO::SQLSRV_ATTR_DATA_CLASSIFICATION => true);
$tableName = 'Patients';
$tsql = "SELECT * FROM $tableName";
$stmt = $conn->prepare($tsql, $options);
$stmt->execute();
$numCol = $stmt->columnCount();

for ($i = 0; $i < $numCol; $i++) {
    $metadata = $stmt->getColumnMeta($i);
    $jstr = json_encode($metadata);
    echo $jstr . PHP_EOL;
}

所有列的元数据输出如下:

{"flags":{"Data Classification":[]},"sqlsrv:decl_type":"int identity","native_type":"string","table":"","pdo_type":2,"name":"PatientId","len":10,"precision":0}
{"flags":{"Data Classification":[{"Label":{"name":"Highly Confidential - secure privacy","id":""},"Information Type":{"name":"Credentials","id":""}}]},"sqlsrv:decl_type":"char","native_type":"string","table":"","pdo_type":2,"name":"SSN","len":11,"precision":0}
{"flags":{"Data Classification":[]},"sqlsrv:decl_type":"nvarchar","native_type":"string","table":"","pdo_type":2,"name":"FirstName","len":50,"precision":0}
{"flags":{"Data Classification":[]},"sqlsrv:decl_type":"nvarchar","native_type":"string","table":"","pdo_type":2,"name":"LastName","len":50,"precision":0}
{"flags":{"Data Classification":[{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""}}]},"sqlsrv:decl_type":"date","native_type":"string","table":"","pdo_type":2,"name":"BirthDate","len":10,"precision":0}

如果我们通过将 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION 设置为 false(默认情况)来修改上述代码片段,flags 字段将始终为 0,如下所示:

{"flags":0,"sqlsrv:decl_type":"int identity","native_type":"string","table":"","pdo_type":2,"name":"PatientId","len":10,"precision":0}
{"flags":0,"sqlsrv:decl_type":"char","native_type":"string","table":"","pdo_type":2,"name":"SSN","len":11,"precision":0}
{"flags":0,"sqlsrv:decl_type":"nvarchar","native_type":"string","table":"","pdo_type":2,"name":"FirstName","len":50,"precision":0}
{"flags":0,"sqlsrv:decl_type":"nvarchar","native_type":"string","table":"","pdo_type":2,"name":"LastName","len":50,"precision":0}
{"flags":0,"sqlsrv:decl_type":"date","native_type":"string","table":"","pdo_type":2,"name":"BirthDate","len":10,"precision":0}

使用一组预定义值的敏感度级别

从 5.9.0 开始,PHP 驱动程序在使用 ODBC 驱动程序 17.4.2 或更高版本时添加了分类级别检索。 使用 ADD SENSITIVITY CLASSIFICATION 对任何数据列进行分类时,用户可以定义级别。

例如,如果用户分别将 NONELOW 分配给 BirthDate 和 SSN,则 JSON 表示形式如下所示:

{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":0},"rank":0}
{"0":{"Label":{"name":"Highly Confidential - secure privacy","id":""},"Information Type":{"name":"Credentials","id":""},"rank":10},"rank":10}

敏感度分类中所示,级别的数值为:

0 for NONE
10 for LOW
20 for MEDIUM
30 for HIGH
40 for CRITICAL

因此,如果用户在对 BirthDate 列进行分类时定义了 RANK=CRITICAL 而不是 RANK=NONE,则分类元数据将为:

array(1) {
  ["Data Classification"]=>
  array(2) {
    [0]=>
    array(3) {
      ["Label"]=>
      array(2) {
        ["name"]=>
        string(26) "Confidential Personal Data"
        ["id"]=>
        string(0) ""
      }
      ["Information Type"]=>
      array(2) {
        ["name"]=>
        string(9) "Birthdays"
        ["id"]=>
        string(0) ""
      }
      ["rank"]=>
      int(40)
    }
    ["rank"]=>
    int(40)
  }
}

更新后的 JSON 表示形式如下所示:

{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":40},"rank":40}

另请参阅

PDOStatement 类

PDO