PDOStatement::getColumnMeta
Recupera los metadatos de una columna.
Sintaxis
array PDOStatement::getColumnMeta ( $column );
Parámetros
$conn: (entero) número basado en cero de la columna cuyos metadatos se van a recuperar.
Valor devuelto
Una matriz asociativa (clave y valor) que contiene los metadatos de la columna. Consulte la sección Comentarios para obtener una descripción de los campos de la matriz.
Observaciones
En la tabla siguiente se describen los campos de la matriz que devuelve getColumnMeta.
NOMBRE | VALUES |
---|---|
native_type | Especifica el tipo PHP de la columna. Siempre es una cadena. |
driver:decl_type | Especifica el tipo SQL que se utiliza para representar el valor de columna en la base de datos. Si la columna del conjunto de resultados es el resultado de una función, PDOStatement::getColumnMeta no devuelve este valor. |
flags | Especifica las marcas establecidas para esta columna. Siempre es 0. |
name | Especifica el nombre de la columna de la base de datos. |
mesa | Especifica el nombre de la tabla que contiene la columna de la base de datos. Siempre en blanco. |
len | Especifica la longitud de columnas. |
Precisión | Especifica la precisión numérica de esta columna. |
pdo_type | Especifica el tipo de esta columna tal y como representan las constantes de PDO::PARAM_*. Siempre es PDO::PARAM_STR (2). |
En la versión 2.0 de los Controladores de Microsoft para PHP para SQL Server, se agregó compatibilidad con PDO.
Ejemplo
<?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'];
?>
Metadatos de clasificación de datos confidenciales
A partir de la versión 5.8.0, hay un nuevo atributo de instrucción PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
disponible para que los usuarios tengan acceso a los metadatos de clasificación de datos confidenciales en Microsoft SQL Server 2019 con PDOStatement::getColumnMeta
, que requiere Microsoft ODBC Driver 17.4.2 o superior.
Tenga en cuenta que el atributo PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
es false
de forma predeterminada, pero cuando se establece en true
, el campo de matriz mencionado, flags
, se rellenará con los metadatos de clasificación de datos confidenciales, si existen.
Tome como ejemplo una tabla Patients (Pacientes):
CREATE TABLE Patients
[PatientId] int identity,
[SSN] char(11),
[FirstName] nvarchar(50),
[LastName] nvarchar(50),
[BirthDate] date)
Podemos clasificar las columnas SSN y BirthDate como se muestra a continuación:
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')
Para acceder a los metadatos, use PDOStatement::getColumnMeta
después de establecer PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
en true, tal como se muestra en el fragmento de código siguiente:
$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;
}
La salida de los metadatos de todas las columnas es:
{"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}
Si modificamos el fragmento de código anterior estableciendo PDO::SQLSRV_ATTR_DATA_CLASSIFICATION
en false
(caso predeterminado), el campo flags
siempre será 0
como antes, como se indica a continuación:
{"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}
Rango de confidencialidad con un conjunto predefinido de valores
A partir de la versión 5.9.0, los controladores de PHP incluyen la recuperación de rangos de clasificación al usar el controlador ODBC 17.4.2 o versiones posteriores. El usuario puede definir un rango al usar la instrucción ADD SENSITIVITY CLASSIFICATION para clasificar cualquier columna de datos.
Por ejemplo, si el usuario asigna NONE
y LOW
a BirthDate y SSN respectivamente, la representación JSON se muestra de la siguiente manera:
{"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}
Tal y como se muestra en la clasificación de confidencialidad, los valores numéricos de los rangos son:
0 for NONE
10 for LOW
20 for MEDIUM
30 for HIGH
40 for CRITICAL
Por lo tanto, si en lugar de RANK=NONE
, el usuario define RANK=CRITICAL
al clasificar la columna BirthDate, los metadatos de clasificación serán los siguientes:
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)
}
}
A continuación se muestra la representación JSON actualizada:
{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":40},"rank":40}