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é.
Cette fonction est
EXPERIMENTALE. Cela signifie que le comportement de
cette fonction, son nom et concrètement, TOUT ce qui est documenté ici peut
changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez
cette fonction à vos risques et périls.
Exécute une requête donnée sur une base de données relationnelle, en
utilisant le descripteur 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éta-données pour interpréter le jeu de résultats et
retourner un graphique de données.
Liste de paramètres
PDO_database_handle
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=COMPAGNIEYDB;host=localhost",DATABASE_USER,DATABASE_PASSWORD);
prepared_statement
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.
value_list
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.
column_specifier
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éta-donné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éta-donné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 que il
travaille seulement avec une seule table, il ne peut y avoir des noms de
colonnes similaires.
Valeurs de retour
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 constructur, 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.
Erreurs / Exceptions
SDO_DAS_Relational::executeQuery() 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_Relationnal_Exception qui sera alors jeté.
Exemples
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.
/************************************************************** * Construit le DAS avec les méta-données ***************************************************************/ $das = new SDO_DAS_Relational ($database_metadata,'compagnie',$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. ***************************************************************/ $nom = 'Acme'; $pdo_stmt = $dbh->prepare('select nom, id from compagnie where nom=?'); $root = $das->executePreparedQuery( $dbh, $pdo_stmt, array($nom), array('compagnie.nom', 'compagnie.id'));
/************************************************************** * Affiche le nom et son id ***************************************************************/ foreach ($root['compagnie'] as $compagnie) { echo "Compagnie obtenue de la base de données a le nom de = " . $compagnie['nom'] . " et son id est " . $compagnie['id'] . "\n"; } ?>