Поделиться через


PDOStatement::getColumnMeta

Скачать драйвер PHP

Извлекает метаданные для столбца.

Синтаксис

  
array PDOStatement::getColumnMeta ( $column );  

Параметры

$conn: отсчитываемый от нуля номер столбца (целое число), метаданные которого требуется извлечь.

Возвращаемое значение

Ассоциативный массив (ключ и значение), содержащий метаданные для столбца. Описание полей в массиве см. в разделе "Примечания".

Remarks

В следующей таблице перечислены поля в массиве, возвращенном 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 была добавлена в версии 2.0 Драйверы Microsoft SQL Server для PHP.

Пример

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

См. также:

Класс PDOStatement

PDO