pb requète sql avec argument contenant caractère ">"ou"<"

Eléphanteau du PHP | 11 Messages

05 nov. 2014, 23:21

Bonjour,
Je viens de m'inscrire ayant un problème PHP -Mysql, que je vous soumets :
- J'ai un site avec une base Mysql, dont les enregistrements contiennent qqfois les caractères ">" ou "<" ;
- je fais une recherche par une page PHP, vers une autre page PHP avec un argument passé dans l'URL ;
ex. page_1.php appelle par lien html : page_2.php?arg=argument<argument2
cet argument provient d'une zône de ma base mysql qui contient : "texte<texte2" ( trouvé par un " select distinct ... ")
- voici une partie du script de page_2.php
la requète est censée retourner tous les enregistrements, dont la zône en question contient la valeur '"texte<texte2" ;

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=dbase', 'root', '', $pdo_options);
$reponse = $bdd->query('SELECT * from `table` WHERE zone='"texte<texte2" ORDER BY zone ;'); => ne retourne aucun résultat

- si j'envoie la même requête en copier/coller dans phpmyadmin, SQL, celà fonctionne, retour des enregistrements correct ;
- la même démarche sans que la zône contienne "<" ou ">" fonctionne

j'ai bien essayé de coder l'argument par htmlspecialchars(), qui envoie l'argument avec le caractère "<" transformé en "<" :
texte<texte2
mais çà ne marche pas

quelqu'un aurait'il dèjà vu ce problème ?
merci d'avance

ViPHP
ViPHP | 928 Messages

05 nov. 2014, 23:53

Quelle erreur s'affiche exactement ?

Eléphanteau du PHP | 11 Messages

06 nov. 2014, 09:12

Quelle erreur s'affiche exactement ?
Bonjour,
Il n'y a pas d'erreur, la page contenant le sql renvoie le messagebox que j'ai prévu au cas où il n'y ait pas d'enregistrement.
Alors qu'ils existent bien, et que la même requête envoyée par la console SQL de phpmyadmin, les trouve.

flor25

ynx
Mammouth du PHP | 586 Messages

06 nov. 2014, 10:28

Salut,

La fonction htmlspecialchars doit être utilisée pour échapper les caractères spéciaux d'un document html, pas d'une requête sql.
Puisque tu utilises PDO, tu devrais utiliser une requête préparée ou la méthode quote() de PDO pour échapper les caractères réservés en sql.

La requête de ton premier message n'est pas correcte, il y a un guillemet simple en trop juste après zone=
'SELECT * from `table` WHERE zone='"texte<texte2" ORDER BY zone ;'

Un début de solution :
$reponse = $bdd->query('SELECT * from `table` WHERE zone=' . $bdd->quote($_GET['arg']) . ' ORDER BY zone ;');
Bonne journée

Eléphanteau du PHP | 11 Messages

06 nov. 2014, 10:35

Salut,
La fonction htmlspecialchars doit être utilisée pour échapper les caractères spéciaux d'un document html, pas d'une requête sql.
Puisque tu utilises PDO, tu devrais utiliser une requête préparée ou la méthode quote() de PDO pour échapper les caractères réservés en sql.
La requête de ton premier message n'est pas correcte, il y a un guillemet simple en trop juste après zone=
'SELECT * from `table` WHERE zone='"texte<texte2" ORDER BY zone ;'
Un début de solution :
$reponse = $bdd->query('SELECT * from `table` WHERE zone=' . $bdd->quote($_GET['arg']) . ' ORDER BY zone ;');
Bonne journée
Salut et merci pour ta réponse, :)

j'essaye ta solution dès que possible, (because boulot ...), et je poste ensuite le résultat.
(ps. Ma requête dans mon script est bonne, il s'agit juste d'un pb de copier/coller dans le post )
bonne journée

Eléphanteau du PHP | 11 Messages

08 nov. 2014, 00:00

Salut,
La fonction htmlspecialchars doit être utilisée pour échapper les caractères spéciaux d'un document html, pas d'une requête sql.
Puisque tu utilises PDO, tu devrais utiliser une requête préparée ou la méthode quote() de PDO pour échapper les caractères réservés en sql.
La requête de ton premier message n'est pas correcte, il y a un guillemet simple en trop juste après zone=
'SELECT * from `table` WHERE zone='"texte<texte2" ORDER BY zone ;'
Un début de solution :
$reponse = $bdd->query('SELECT * from `table` WHERE zone=' . $bdd->quote($_GET['arg']) . ' ORDER BY zone ;');
Bonne journée
Salut,
je viens d'essayer la requête en la modifiant comme ci-dessus.
il n'y a pas de changement, pas d'erreur, mais elle ne retourne pas non plus d'enregistrements.
flor25

Eléphanteau du PHP | 11 Messages

08 nov. 2014, 10:31

Salut,
La fonction htmlspecialchars doit être utilisée pour échapper les caractères spéciaux d'un document html, pas d'une requête sql.
Puisque tu utilises PDO, tu devrais utiliser une requête préparée ou la méthode quote() de PDO pour échapper les caractères réservés en sql.
La requête de ton premier message n'est pas correcte, il y a un guillemet simple en trop juste après zone=
'SELECT * from `table` WHERE zone='"texte<texte2" ORDER BY zone ;'
Un début de solution :
$reponse = $bdd->query('SELECT * from `table` WHERE zone=' . $bdd->quote($_GET['arg']) . ' ORDER BY zone ;');
Bonne journée
Salut,
je viens d'essayer la requête en la modifiant comme ci-dessus.
il n'y a pas de changement, pas d'erreur, mais elle ne retourne pas non plus d'enregistrements.
flor25
Bonjour,
Il semble que j'aie un vrai problème avec les caractères ">" et "<" dans ma base Mysql ???.
En effet j'ai trouvé une partie de solution en échappant en dur les caractères par "\" :
- en forçant la requête en dur avec la valeur "texte\<texte2", elle renvoie bien les enregistrements ;
- par contre PHP refuse de transformer ">" et "<" en "\>" et "\<" ;
- j'ai essayé :
strtr() : ne renvoie rien ,
str_replace() : ne remplace pas ;
preg_quote () : censé échapper les caractères : \ + * ? [ ^ ] $ ( ) { } = ! < > | : - par "\" ne remplace pas ">"
et si je fais un preg_quote () sur l'argument contenant le caractère "*",
il est bien transformé en "\*" et la requête fonctionne sur les enregistrements concernés ;

merci à ceux me me liront

Flor25
PHP 5.3
Mysql 5.1.36