sprintf ()

sprintf () - PHP - Programmation

Marsh Posté le 29-10-2005 à 15:48:48    

bonjour,  
 
Dû  à un souci de conversion entre utf8 et latin1, j'utilise la fonction
sprintf() dans mes requetes mysql.  
 
Tout se passe bien, sauf celle-ci :
 

Code :
  1. $requete = sprintf("SELECT * FROM Actes, Bibliographie
  2. WHERE id = idBiblio
  3. AND MotsClef LIKE '%s'
  4. AND (Resume LIKE '%s' AND Resume LIKE '%s')
  5. AND Nom_Auteur LIKE '%s'
  6. AND Auteur LIKE '%s'
  7. AND nompropre LIKE '%s'
  8. AND localite LIKE '%s'
  9. AND Contrat LIKE '%s'
  10. AND annee BETWEEN %d AND %d ORDER BY annee",
  11. mysql_real_escape_string($motcle),
  12. mysql_real_escape_string($resume),
  13. mysql_real_escape_string($resume),
  14. mysql_real_escape_string($nom_auteur),
  15. mysql_real_escape_string($auteur),
  16. mysql_real_escape_string($nompropre),
  17. mysql_real_escape_string($localite),
  18. mysql_real_escape_string($contrat),
  19. $anmin,
  20. $anmax);


 
Sans message d'erreur, il ne me retourne aucun résultat, alors que sans la fonciton mysql_real_escape_sting (), le résultat est bon.  
 
Merci de vos pistes de réflection sur le sujet !
 
Thiebo


Message édité par thiebo12375 le 29-10-2005 à 16:00:32
Reply

Marsh Posté le 29-10-2005 à 15:48:48   

Reply

Marsh Posté le 29-10-2005 à 16:08:43    

tes signle quotes dans la requête sont superflus, mysql_real_escape_truc le fait si neccessaire ;)

Reply

Marsh Posté le 29-10-2005 à 17:46:33    

shakpana a écrit :

tes signle quotes dans la requête sont superflus, mysql_real_escape_truc le fait si neccessaire ;)


 
merci d'avoir répondu, mais....
 
tu en es certain parce que si je les enlève et que je fais echo $requete ;  
j'ai ceci comme requete :  
 
SELECT * FROM Actes, Bibliographie WHERE id = idBiblio AND MotsClef LIKE AND (Resume LIKE AND Resume LIKE ) AND Nom_Auteur LIKE AND Auteur LIKE AND nompropre LIKE AND localite LIKE AND Contrat LIKE AND annee BETWEEN 1000 AND 1350 ORDER BY annee
 
ce qui n'est pas bon parce qu'il manque... les single quotes.  
 
avec ceci comme code :
 

Code :
  1. $motcle = $_POST['motcle'];
  2. $anmin = $_POST['anmin'];
  3. $anmax = $_POST['anmax'];
  4. $nom_auteur = $_POST['nom_auteur'];
  5. $localite = $_POST['localite'];
  6. $nompropre = $_POST['nompropre'];
  7. $resume = $_POST['resume'];
  8. $ares = $_POST['ares'];
  9. $auteur = $_POST['auteur'];
  10. $contrat = $_POST['contrat'];
  11. $requete = sprintf("SELECT * FROM Actes, Bibliographie
  12. WHERE id = idBiblio
  13. AND MotsClef LIKE '%s'
  14. AND (Resume LIKE '%s' AND Resume LIKE '%s')
  15. AND Nom_Auteur LIKE '%s'
  16. AND Auteur LIKE '%s'
  17. AND nompropre LIKE '%s'
  18. AND localite LIKE '%s'
  19. AND Contrat LIKE '%s'
  20. AND annee BETWEEN %d AND %d ORDER BY annee",
  21. mysql_real_escape_string($motcle),
  22. mysql_real_escape_string($resume),
  23. mysql_real_escape_string($resume),
  24. mysql_real_escape_string($nom_auteur),
  25. mysql_real_escape_string($auteur),
  26. mysql_real_escape_string($nompropre),
  27. mysql_real_escape_string($localite),
  28. mysql_real_escape_string($contrat),
  29. $anmin,
  30. $anmax);
  31. echo $requete;


 
j'ai ceci comme requete :
 
SELECT * FROM Actes, Bibliographie WHERE id = idBiblio AND MotsClef LIKE '' AND (Resume LIKE '' AND Resume LIKE '') AND Nom_Auteur LIKE '' AND Auteur LIKE '' AND nompropre LIKE '' AND localite LIKE '' AND Contrat LIKE '' AND annee BETWEEN 1000 AND 1350 ORDER BY annee
 
Ce qui est exacte, sauf que.... cela ne retourne AUCUN resultat (alors que les tables sont pleines).  
 
d'ailleurs dans la documentation, c'est bien marqué avec les single quotes :
 
http://fr2.php.net/manual/fr/funct [...] string.php
 

Reply

Marsh Posté le 29-10-2005 à 18:45:58    

ok, je suis mais complètement à la mass, je suis désolé, en fait j'utilise une interface à mysql_real_truc qui me met automatiquement les quotes genre :  

Code :
  1. if (!is_numeric($value)) {
  2. $value = "'" . mysql_real_escape_string($value) . "'";
  3. }


et j'ai tellement l'habitude, que je suis allez trop vite
je merites au moins 3 claques ... excuses-moi, platement ...
 
sinon ton erreur ne viendrais pas de la requête LIKE '' ?
plutôt LIKE '%' ou '%searchword%'

Message cité 2 fois
Message édité par shakpana le 29-10-2005 à 18:48:01
Reply

Marsh Posté le 29-10-2005 à 18:57:51    

shakpana a écrit :

ok, je suis mais complètement à la mass, je suis désolé, en fait j'utilise une interface à mysql_real_truc qui me met automatiquement les quotes genre :  

Code :
  1. if (!is_numeric($value)) {
  2. $value = "'" . mysql_real_escape_string($value) . "'";
  3. }


et j'ai tellement l'habitude, que je suis allez trop vite
je merites au moins 3 claques ... excuses-moi, platement ...
 
sinon ton erreur ne viendrais pas de la requête LIKE '' ?
plutôt LIKE '%' ou '%searchword%'


 
 
Oui, c'est exactement ça mon problème. Reste à trouver comment mettre la fonction d'ajout du single quote dans mysql_real_escape_string... Je pense que je finirai par trouver.  
 
Juste pour que je ne travaille pas pour rien : on est bien d'accord que cette fonction résoudra mon problème d'encodage de mon script en utf8 et la connection mysql qui est en latin1 ?

Reply

Marsh Posté le 29-10-2005 à 19:06:52    

shakpana a écrit :

ok, je suis mais complètement à la mass, je suis désolé, en fait j'utilise une interface à mysql_real_truc qui me met automatiquement les quotes genre :  

Code :
  1. if (!is_numeric($value)) {
  2. $value = "'" . mysql_real_escape_string($value) . "'";
  3. }


et j'ai tellement l'habitude, que je suis allez trop vite


 
Ca vient de quote_smart filé dans la doc de mysql_real_escape_string ? Pour moi (et pas que pour moi d'ailleurs, c'est dit dans les commentaires il me semble), ce test ne sert à rien et est surtout dangereux : mysql_real_escape_string n'est pas suffisant en soi pour protéger des injections SQL, il faut aussi que la valeur soit entourée de quotes simples. Bref, inutile et faille de sécurité. Vaut mieux les rajouter dans tous les cas.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 29-10-2005 à 19:10:58    

thiebo12375 a écrit :

Oui, c'est exactement ça mon problème. Reste à trouver comment mettre la fonction d'ajout du single quote dans mysql_real_escape_string... Je pense que je finirai par trouver.


Perso, voilà, à peu près, à quoi ressemble mon interface à mysql_real_truc
 

Code :
  1. function my_real_escape($value) {
  2.   // Stripslashes
  3.   if (get_magic_quotes_gpc()) {
  4.     $value = stripslashes($value);
  5.   }
  6.   // Quotes
  7.   if (!is_numeric($value)) {
  8.     $value = "'" . mysql_real_escape_string($value) . "'";
  9.   }
  10.   return $value;
  11. }


thiebo12375 a écrit :

Juste pour que je ne travaille pas pour rien : on est bien d'accord que cette fonction résoudra mon problème d'encodage de mon script en utf8 et la connection mysql qui est en latin1 ?


ça je ne sais pas, il me semble que oui d'après d'autres posts ici-même, mais j'ai directement contourner le pb en passant tout en UTF8, si tu es sur du mysql 4+, pourquoi pas un SET NAMES, avec eventuellement un CONVERT USING ?

Reply

Marsh Posté le 29-10-2005 à 19:11:53    

Merci pour vos réponses. J'ai réussi à faire fonctionner en faisant :
 
$motcle = "'%".mysql_real_escape_string($_POST['motcle'])."%'";
 
ce qui ne répond pas à mon problème. Mes scripts sont en utf8 et la connection à mysql en latin1. Comment je dois convertir ? J'utilise utf8_encode() pour afficher correctement les données que je suis allé chercher dans mysql et ça marche. Mais quid si le visiteur du site fait une recherche ? La recherche est entrée en utf8 et la connection à mysql en latin1, donc si la recherche comporte un ê (par exemple), mysql ne trouvera aucun résultat !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed