JeuWeb - Crée ton jeu par navigateur
[Résolu][PDO] Connaître le SQL d'une requête préparée - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][PDO] Connaître le SQL d'une requête préparée (/showthread.php?tid=4493)



[Résolu][PDO] Connaître le SQL d'une requête préparée - Ter Rowan - 20-12-2009

hello

en train de finaliser mon "parser" simili bbcode (cf un post un peu plus bas) je développe ma première interface mysql via PDO

et j'ai quelques difficultés sur une requête préparée

en effet PDO me retourne un message d'erreur
Citation :SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc = 'Le', isArticle = '1' WHERE id_ref = '1' AND langue = 'F

mais voilà, y a qu'un morceau de la requête et j'aimerai bien voir la requête totale

je ne sais pas trop où chercher le résultat de la requête (errorInfo ne me donne pas le détail complet)

savez vous quelle méthode utilisée pour connaitre la requête globale, que je puisse trouver l'erreur ?

pour info
la requête préparée est :
Code PHP :
<?php 
$this
->_listeRequetesPreparees['update'] ="UPDATE txt_ref SET label = :label, desc = :desc, isArticle = :isArticle WHERE id_ref = :id_ref AND langue = :langue";



RE: [PDO] connaitre le "sql" d'une requête préparée - Kihmé - 20-12-2009

en sql desc peut être utiliser comme caractère d'un order by, donc donner le nom desc à un champs n'est pas une bonne idée, peut être que ça pertube la requête. En tout cas moi j'évite toujours d'utiliser des caractères sql comme nom de tables ou de champs...


RE: [PDO] connaitre le "sql" d'une requête préparée - Ter Rowan - 20-12-2009

han ! ben merci beaucoup c'était bien cela (pour le bug) Smile

par contre la question initiale reste entière pour la suite

Comment voir la requête générée ? (si c'est possible)


RE: [PDO] connaitre le "sql" d'une requête préparée - Kihmé - 21-12-2009

tu peux te l'afficher avec un echo, mais je vois pas trop ce que tu veux en faite?


RE: [PDO] connaitre le "sql" d'une requête préparée - christouphe - 21-12-2009

en cherchant j'ai pas trouvé, je ne pense pas que ce soit possible car, si je me réfère à d'autre type de langage où les requêtes sont préparées (oracle notament), les variables sont remplacées au moment de la validation donc de l'instruction execute()


RE: [PDO] connaitre le "sql" d'une requête préparée - Anthor - 21-12-2009

Tu passe ta requête dans prepare ou dans execute directement ?

Code PHP :
<?php 
$sql
= 'requete';

if(
$return = $pdo->prepare($sql) )
{
// Afficher la requête
echo $return->queryString
}

Ça ne fonctionne que si la requête a pu être préparée, sinon $return vaut false.


RE: [PDO] connaitre le "sql" d'une requête préparée - Ter Rowan - 21-12-2009

je ne l'ai pas sous la main mais c'est dans le cas de requetes préparées type

exemple du net
Code PHP :
<?php 
/* Exécute une requête préparée en passant un tableau de valeurs */
$sql = 'SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':couleur' => 'rouge'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':couleur' => 'jaune'));
$yellow = $sth->fetchAll();

ce qui m'intéresserait là c est de lire
"SELECT nom, couleur, calories FROM fruit WHERE calories < 150 AND couleur = 'rouge'"
puis
"SELECT nom, couleur, calories FROM fruit WHERE calories < 175 AND couleur = 'jaune'"

voyez ce que je veux dire ?
l objectif est que si le :couleur induit une erreur je puisse l'interpréter. Mon soucis précédent venait de "desc" mais je pensais au départ que c'était le contenu d'une des chaines en paramètres qui posait problème... et là je ne sais pas comment voir la "requête finale" Smile

exemple si dans :couleur on met " jaune' OR ''=' "


RE: [PDO] connaitre le "sql" d'une requête préparée - Anthor - 21-12-2009

le :couleur ne peux jamais induire d'erreurs de construction, puisque la requête est préparé.
Dans ton exemple, la variable serait échappé, donc ton OR ne ferait parti que d'une chaine quelconque.

Sans étendre la classe de base, et en ajoutant une méthode, PDOStatement ne te retournera pas la requête exécutée.


RE: [PDO] connaitre le "sql" d'une requête préparée - Ter Rowan - 21-12-2009

ok donc en conclusion
si erreur il y a dans une requête préparée, l'erreur vient forcément de la requête ... "de base" (sais pas trop comment l'identifier)

si j'ai une erreur, je cherche uniquement dans... ça quoi :
Code PHP :
<?php 
$sql
= 'SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur';

merci pour vos retours


RE: [Résolu][PDO] connaitre le "sql" d'une requête préparée - Anthor - 21-12-2009

Globalement, tu es censé mettre des ` (AltGr + 7) autour des champs pour éviter le problème que tu as eu ^^
Sinon tu peux utiliser des ORM qui te permettent de construire ta requête sous forme d'objet ou autre.