(^)
SDO_DAS_Relational::executePreparedQuery — Exécute une requête SQL passée comme requête préparée, avec une liste de valeurs à substituer pour les paramètres fictifs, et retourne les résultats comme un graphique de données normalisé.
$database_handle
,
PDOStatement
$prepared_statement
,
array
$value_list
[,
array
$column_specifier
] ) : SDODataObjectCette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.
Exécute une requête donnée sur une base de données relationnelle, en utilisant la ressource de base de données PDO fourni. Elle diffère de la fonction simple executeQuery() puisqu'elle prend des requêtes préparées et une liste de valeurs. Ceci est l'appel approprié lorsque vous voulez utiliser une requête qui doit être appelée un certain nombre de fois avec des arguments différents et il y a donc un avantage de performance à être préparée une seule fois. Elle est utile aussi pour les requêtes SQL qui contiennent des valeurs qui varient prises d'une source qui ne peut pas être totalement sûre. Dans ce dernier cas, il est peu sécuritaire de construire une requête SQL en concaténant simplement les parties de la requête ensemble, puisque les valeurs peuvent convenir des morceau de SQL. Pour se protéger de ceci, d'une prétendue attaque par injection SQL, il est plus sécuritaire de préparer la requête SQL avec des paramètres fictifs (aussi connu sous le nom de marqueurs, noté '?') et fournir une liste de valeurs qui devra être substituée dans un argument séparé. Autrement, cette fonction est la même que executeQuery() puisqu'elle utilise le modèle qui était bâti à partir des métadonnées pour interpréter le jeu de résultats et retourner un graphique de données.
Construit en utilisant l'extension PDO. Une ligne typique pour construire un descripteur de base de données PDO devrait ressembler à ceci :
$dbh = new PDO("mysql:dbname=COMPANYDB;host=localhost",DATABASE_USER,DATABASE_PASSWORD);
Une requête SQL préparée qui sera exécutée sur la base de données. Il aura été préparé par la méthode prepare() de PDO.
Un tableau de valeurs à être substituées dans la requête SQL à la place
des paramètres fictifs. Dans le cas qu'il n'y a pas de paramètres
fictifs ou de marqueurs dans la requête SQL, alors cet argument peut
être spécifié comme NULL
ou en tant qu'un tableau vide.
Le DAS Relationnel doit examiner le jeu de résultats et pour chaque colonne, provenant de quelle table et quelle colonne de la table il vient. Dans certaines circonstances, il peut trouver les informations pour lui-même, mais la plupart du temps il ne le peut pas. Dans ces cas, une colonne spécifique est requise, qui est un tableau qui identifie les colonnes. Chaque entrée dans le tableau est simplement une chaîne de caractères dans la forme table-name.column_name.
Le spécificateur de colonne est requis lorsqu'il y a des noms de colonnes similaires dans les métadonnées de base de données. Par exemple, dans une base de données utilisée dans ces exemples, toutes les tables ont une colonne id et une colonne nom. Lorsque DAS Relationnel récupère le jeu de résultats à partir de PDO, il peut le faire avec l'attribut PDO_FETCH_ASSOC, ce qui permettra aux colonnes dans les jeux de résultats d'être marquées avec un nom de colonne, mais on ne pourra pas distinguer les entrées similaires. Alors cela fonctionnera seulement lorsqu'il y aura aucune entrée similaire possible dans les jeux de résultats.
Pour résumer, spécifier un tableau de spécificateurs de colonne lorsqu'il y a une incertitude à propos des colonnes qui pourraient venir de quelle table. Il faut l'omettre seulement lorsque chaque nom des colonnes dans les métadonnées de base de données est unique.
Tous les exemples dans la section d'Exemples utilisent un spécificateur de colonne. Il y a un exemple dans le dossier Scenarios de l'installation qui ne fait pas : il ne fonctionne seulement avec la table employe et parce qu'il travaille seulement avec une seule table, il ne peut y avoir des noms de colonnes similaires.
Retourne un graphique de données. Spécifiquement, elle retourne un objet racine d'un type spécial. Sous cet objet de racine se trouveront les données du jeu de résultat. L'objet de racine aura une propriété de valeurs multiples contenue avec le même nom que le type racine d'application spécifié dans le constructeur, et la propriété continuera un ou plusieurs objets de donnés du type de racine de l'application.
Dans le cas que la requête aucune donnée, l'objet spécial de racine pour le type de racine de l'application sera vide.
SDO_DAS_Relational::executePreparedQuery() peut jeter une exception SDO_DAS_Relational_Exception si elle n'est pas capable de construire le graphique de données correctement. Cela peut arriver pour un certains nombres de raisons : par exemple, si elle trouve qu'elle n'a pas de clés primaire dans le jeu de résultats pour tous les objets. Le DAS Relationnel attrape toutes les exceptions de PDO et obtient des informations de diagnostique de PDO qui inclut un SDO_DAS_Relational_Exception qui sera alors jeté.
Exemple #1 Récupération d'un objet de données en utilisant executePreparedQuery()
Dans cet exemple, un simple objet de données est récupéré de la base de données - ou possiblement plus d'un s'il y a plus d'une compagnie appelée 'Acme'. Pour chaque compagnie retournée, les propriétés nom et id sont affichées.
D'autres exemples d'utilisation de executePreparedQuery() peuvent être trouvés dans le code d'exemple fourni dans sdo/DAS/Relational/Scenarios.
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/**************************************************************
* Construit le DAS avec les métadonnées
***************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'company',$SDO_reference_metadata);
/**************************************************************
* Récupère une connexion à la base de données
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
/**************************************************************
* Effectue une requête pour obtenir un objet compagnie - il pourrait y en
* avoir plus s'ils existaient
* Utilise une requête préparée avec des paramètres fictifs.
***************************************************************/
$name = 'Acme';
$pdo_stmt = $dbh->prepare('select name, id from company where name=?');
$root = $das->executePreparedQuery(
$dbh,
$pdo_stmt,
array($name),
array('company.name', 'company.id'));
/**************************************************************
* Affiche le nom et son id
***************************************************************/
foreach ($root['company'] as $company) {
echo "Company obtained from the database has name = " .
$company['name'] . " and id " . $company['id'] . "\n";
}
?>