共用方式為


PDOStatement::getColumnMeta

下載 PHP 驅動程式

擷取資料行的中繼資料。

語法

  
array PDOStatement::getColumnMeta ( $column );  

參數

$conn:(整數) 您要擷取其中繼資料的資料行號碼 (以零起始)。

傳回值

包含資料行中繼資料的關聯陣列 (索引鍵和值)。 如需陣列中欄位的描述,請參閱<備註>一節。

備註

下表將描述 getColumnMeta 所傳回陣列中的欄位。

名稱 VALUES
native_type 指定資料行的 PHP 類型。 一定是字串。
driver:decl_type 指定用來表示資料庫中的資料行值的 SQL 類型。 如果結果集內的資料行是函數的結果,則此值不是由 PDOStatement::getColumnMeta 傳回。
flags 指定為此資料行設定的旗標。 一律是 0。
NAME 指定資料庫中資料行的名稱。
table 指定包含資料庫中資料行的資料表名稱。 永遠為空白。
len 指定資料行長度。
精確度 指定此資料行的數值有效位數。
pdo_type 指定此資料行的類型 (以 PDO::PARAM_* 常數表示)。 一律是 PDO::PARAM_STR (2)。

PDO 支援已新增至 Microsoft Drivers for PHP for SQL Server 2.0 版。

範例

<?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