PDOStatement::getColumnMeta
Извлекает метаданные для столбца.
Синтаксис
array PDOStatement::getColumnMeta ( $column );
Параметры
$conn: отсчитываемый от нуля номер столбца (целое число), метаданные которого требуется извлечь.
Возвращаемое значение
Ассоциативный массив (ключ и значение), содержащий метаданные для столбца. Описание полей в массиве см. в разделе "Примечания".
Замечания
В следующей таблице перечислены поля в массиве, возвращенном getColumnMeta.
ИМЯ | ЗНАЧЕНИЯ |
---|---|
native_type | Указывает тип PHP для столбца. Всегда строка. |
driver:decl_type | Указывает тип SQL, используемый для представления значения столбца в базе данных. Если столбец в результирующем наборе является результатом функции, это значение не возвращается PDOStatement::getColumnMeta. |
flags | Указывает флаги, установленные для этого столбца. Всегда равно 0. |
name | Указывает имя столбца в базе данных. |
table | Указывает имя таблицы, содержащей столбец в базе данных. Всегда пусто. |
len | Указывает длину столбца. |
точность | Указывает числовую точность этого столбца. |
pdo_type | Указывает тип этого столбца, представленный константами PDO::PARAM_*. Всегда PDO::PARAM_STR (2). |
Добавлена поддержка PDO версии 2.0 драйверов Майкрософт для PHP для SQL Server.
Пример
<?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
, который позволяет получать метаданные классификации данных о конфиденциальности из Microsoft SQL Server 2019 с помощью PDOStatement::getColumnMeta
. Для этого требуется драйвер 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 в драйверах PHP появилась возможность извлечения ранга классификации при использовании ODBC Driver 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
Таким образом, если вместо RANK=NONE
пользователь задает RANK=CRITICAL
при классификации столбца BirthDate, метаданные классификации будут следующими:
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}