PDOStatement::getColumnMeta
列のメタデータを取得します。
構文
array PDOStatement::getColumnMeta ( $column );
パラメーター
$conn: (整数) メタデータを取得する列を示す 0 から始まる番号。
戻り値
列のメタデータを格納している連想配列 (キーと値)。 配列内のフィールドの詳細については「解説」セクションを参照してください。
解説
次の表では、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 SQL Server 用 Drivers for PHPのバージョン 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 以降では、Microsoft SQL Server 2019 上で PDOStatement::getColumnMeta
を使用して、ユーザーが秘密度データ分類のメタデータにアクセスするために、新しいステートメント属性 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
を利用できます。Microsoft ODBC Driver 17.4.2 以降が必要になります。
属性 PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
は既定で false
になっていますが、true
に設定されると、秘密度データ分類のメタデータがある場合には、前述の配列フィールド flags
にはそのデータが入力されます。
たとえば、次のように Patients テーブルを取得します。
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 以降、ODBC ドライバー 17.4.2 以上の使用時、PHP ドライバーによって分類順位の取得が追加されました。 ユーザーは 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
したがって、RANK=NONE
ではなく、ユーザーが列 BirthDate の分類時に RANK=CRITICAL
を定義する場合、分類メタデータは次のようになります。
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}