PDOStatement::getColumnMeta
擷取資料行的中繼資料。
語法
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 來分類任何資料行時定義排名。
例如,如果使用者分別指派和 NONE
至 LOW
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}