SDO_DAS_Relational::executePreparedQuery

(^)

SDO_DAS_Relational::executePreparedQuery Ejecuta una consulta SQL pasada como una sentencia preparada, con una lista de valores para sustituir los parámetros de sustitución, y devuelve los resultados como un grafo de datos normalizado

Descripción

SDO_DAS_Relational::executePreparedQuery ( PDO $database_handle , PDOStatement $prepared_statement , array $value_list [, array $column_specifier ] ) : SDODataObject
Advertencia

Esta función ha sido declarada EXPERIMENTAL. Su funcionamiento, nombre y la documentación que le acompaña puede cambiar sin previo aviso en futuras versiones de PHP. Utilícela bajo su propia responsabilidad.

Ejecuta una consulta dada en una base de datos relacional, usando el gestor de bases de datos proporcionado. Difiere del método más simle executeQuery() en que toma una sentencia preparada y una lista de valores. Esta es la llamada apropiada a usar cuando la sentencia se ejecuta varias veces con diferentes argumentos, y por lo tanto existe un beneficio de rendimiento a tener en cuenta de preparar la sentencia sólo una vez, o cuando la sentencia SQL contiene varios valores tomados de un origen que en el que no se puede confiar completamente. En este último caso puede no ser seguro construir la sentencia SQL simplemente concatenando las partes de la sentencia, ya que los valores pueden contener piezas de SQL. Para evitar esto, el llamado ataque de inyección SQL, es más seguro preparar la sentencia SQL con parámetros de sustitución (también conocidos como marcadores de parámetros, denotados por '?') y proporcionar una lista de valores a ser sustituidos como un argumento aparte. En principio, esta función es la misma que executeQuery() en el hecho que usa el modelo construye desde los metadatos para interpretar el conjunto de resultados y devolver un grafo de datos.

Parámetros

PDO_database_handle

Construido usando la extensión PDO. Una típica línea para construir un gestor de bases de datos PDO podría parecerse a esta:

$dbh = new PDO("mysql:dbname=COMPANYDB;host=localhost",DATABASE_USER,DATABASE_PASSWORD);

prepared_statement

Una sentencia SQL preparada para ser ejecutada en la base de datos. Habrá sido preparada por el método prepare() de PDO.

value_list

Un array con los valores a ser sustituidos en la sentencia SQL en lugar de los parámetros de sustitución. En el caso de que no existan parámetros de sustitución o marcadores de parámetros en la sentencia SQL, este argumento se puede especificar como NULL o como un array vacío.

column_specifier

El DAS Relacional necesita examinar el conjunto de resultados y, para cada columna, conocer de qué tabla y de qué columna de esa tabla proviene. En algunas circunstancias puede encontrar esta información por sí mismo, pero otras veces no puede. En estos casos se necesita un especificador de columna, el cual es un array que identifica las columnas. Cada entrada del array es siplemente una cadena de la forma nombre-tabla.nombre_columna.

El especificador de columna es necesario cuando existen nombres de comlumnas duplicadas en los metadatos de la base de datos, Por ejemplo, en la base de datos usada en los ejemplos, todas las tablas tienen una columna id y una columna nombre. Cuando el DAS Relacional obtiene el conjunto de resultados desde PDO, puede realizar esto con el atributo PDO_FETCH_ASSOC, el cual causará que las columnas del conjunto de resultados sean etiquetadas con el nombre de columna, pero no distinguirá duplicados. Así que esto solamente funcionará cuando no existan dupicados posibles en el conjunto de resultados.

En resumen, se ha de especificar un array de especificadores de columnas siempre que exista cualquier duda sobre qué columna podría pertenecer qué tabla y solamente omitirlo cuando cada nombre de columna de los metadatos de la base de datos sea único.

Todos los ejemplos de la sección Ejemplos utilizan un especificador de columna. Hay un ejemplo en el directorio Scenarios de la instalación que no lo usa: aquel que trabaja con la tabla empleados solamente, y ya que trabaja con una sola table, no pueden existir nombre de columnas duplicados.

Valores devueltos

Devuelve un grafor de datos. Específicamente, devuelve un objeto raíz de un tipo especial. Bajo esta raíz estarán los datos del conjunto de resultados. El objeto raíz tendrá una propiedad de contención polievaluada con el mismo nombre que el tipo raíz de la aplicación especificado en el constructor, y esa propiedad contendrá uno o más objetos de datos del tipo raíz de la aplicación.

En el caso en que la consulta no devuelve datos, aún se devolverá el objeto raíz de la aplicación, pero la propiedad de contención para el tipo raíz de la aplicación estará vacía.

Errores/Excepciones

SDO_DAS_Relational::executePreparedQuery() puede lanzar una SDO_DAS_Relational_Exception si no puede construir el grafo de datos correctamente. Esto puede suceder por varias razones: por ejemplo, si encuentra que el no tiene claves primarias en el conjunto de resultados para todos los objetos. También captura cualquer excepción de PDO y obtiene información de deiagnóstico de PDO, que incluye una SDO_DAS_Relational_Exception que lanza después.

Ejemplos

Ejemplo #1 Recuperar un objeto de datos usando executePreparedQuery()

En este ejemplo se recupera un único objeto de datos desde la base de datos - o posiblemente más de uno si existe una compañía llamada 'Acme'. Se utiliza echo con las propiedades nombre e id por cada compañía devuelta.

Se pueden encontrar otros ejemplo del uso de executePreparedQuery() en el código de ejemplo proporcionado nen sdo/DAS/Relational/Scenarios.

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
 * Construir el DAS con los metadatos
 ***************************************************************/
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_referencia_SDO);

/**************************************************************
 * Obtener una conexión a la base de datos
 ***************************************************************/
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);

/**************************************************************
 * Emitir una consulta para obtener un objeto compañía - posiblemente más si existen
 * Usar una consulta preparada con un parámetro de sustitución.
 ***************************************************************/
$nombre 'Acme';
$sentencia_pdo $gbd->prepare('select nombre, id from compañía where nombre=?');
$root $das->executePreparedQuery(
    
$gbd
    
$sentencia_pdo,
    array(
$nombre), 
    array(
'compañía.nombre''compañía.id'));

/**************************************************************
 * Usar echo con el nombre y el id
 ***************************************************************/
foreach ($root['compañía'] as $compañía) {
    echo 
"La compañía obtenida de la base de datos tiene como nombre = " 
    
$compañía['nombre'] . " e id " $compañía['id'] . "\n";
}
?>