Update, double quotes et simples quotes

Update, double quotes et simples quotes - PHP - Programmation

Marsh Posté le 02-03-2015 à 16:40:32    

Bonjour,
 
Aujourd'hui, en réalisant l'update de tables SQL, je me suis retrouvé confronté à un problème de syntaxe concernant l'update d'une seule colonne dans une table puis de plusieurs colonnes dans cette même table.
Dans les requêtes suivantes, le champ date est de type DATE, le champ commentaire est de type VARCHAR.
 
La première requête, utilisant des guillemets simples, fonctionne sans problèmes :
$result = $this->query('UPDATE nomTable SET date = '. $date .' WHERE id = '.$id.'');
 
Cette deuxième requête, utilisant elle aussi des guillemets simples, ne réalise pas l'update, il échoue :
$result = $this->query('UPDATE nomTable SET commentaire = '. $commentaire .', date = '. $date .' WHERE id = '. $id .'');
 
Après avoir cherché un certain temps, j'ai fini par utiliser des doubles quotes pour réaliser la concaténation, ce qui a résolu mon problème.
$result = $this->query('UPDATE nomTable SET commentaire = "'. $commentaire .'", date = "'. $date .'" WHERE id = '. $id .'');
 
Las questions que je me pose à présent sont :
Pourquoi la première requête fonctionne alors que la deuxième échoue ? Je devrais logiquement rencontrer les mêmes problèmes de syntaxe pour le champ date non ? Tout en sachant que, si je met des guillemets doubles au champ commentaire et que je laisse des guillemets simples pour le champ date dans la troisième requête, l'update de la date se fera alors à la valeur 0000-00-00.
Devrais-je réaliser la concaténation de ma première requête avec des guillemets doubles et, si oui, pourquoi ?
 
Voilà, c'est tout, d'avance merci à vous. :jap:

Reply

Marsh Posté le 02-03-2015 à 16:40:32   

Reply

Marsh Posté le 02-03-2015 à 16:54:18    

Parce que la 1ere requete ne fait qu'insérer des valeurs INT (entier) ou date. Dans ce cas pas de soucis.
Dans la 2eme, tu cherches à insérer du texte donc ca pose problème.
Pense à ajouter un addslashes devant $commentaire => addslashes($commentaire) au cas ou la chaine contient des guillemets doubles.
Ou mieux : htmlentities($commentaire, ENT_QUOTES) pour encoder les guillemets en html.
 
BOn courage


---------------
Pays et country_code traduits : https://www.iso-country-code.com
Reply

Marsh Posté le 03-03-2015 à 08:45:05    

Merci pour le conseil mais j'avais déjà appliqué ces traitements aux variables concernées (je n'aime pas utiliser des fonctions de PHP dans mes requêtes SQL, je trouve qu'elles perdent ensuite en lisibilité).
Donc en résumé, il faut utiliser des doubles quotes chaque fois que l'on insère des champs textes dans une requête. J'imagine qu'une bonne pratique est d'y avoir systématiquement recours, peu importe le type de donnée rentrée, de manière à ne plus jamais être confronté à ce problème. :o

Reply

Marsh Posté le 03-03-2015 à 11:18:00    

Non, il ne faut pas utiliser des doubles quotes non plus.
 
Tu veux faire planter ta requête ?
 
Insère le commentaire suivant:
 

Code :
  1. Attention aux "bonnes pratiques"


 
Voilà comment tu peux faire plus proprement
 

Code :
  1. $query = "UPDATE nomTable
  2.   SET commentaire = ".$this->quote( $commentaires ).",
  3.   date = ".$this->quote( $date )."
  4.   WHERE id = ".$this->quote( $id );
  5. $result = $this->query( $query );
  6. // ou mieux
  7. $query = "UPDATE nomTable
  8.   SET commentaire = :commentaire ,
  9.   date = :date
  10.   WHERE id = :id ";
  11. $result = $connexion->prepare( $query );
  12. $result->bindValue('commentaire', $commentaire , PDO::PARAM_STR );
  13. $result->bindValue('date'  , $date   , PDO::PARAM_STR );
  14. $result->bindValue('id'   , $id   , PDO::PARAM_INT );
  15. $result->execute();


 
Avec les valeurs de tests suivantes:

Code :
  1. $commentaire = 'attention aux "bonnes pratiques" , c\'est important';
  2. $date   = date('Y-m-d');
  3. $id    = 15;


 
la première méthode donnera
 

Code :
  1. UPDATE nomTable SET commentaire = 'attention aux \"bonnes pratiques\"', date = '2015-03-03' WHERE id = '15'


 
Tout est donc bien échappé et pas de risques d'injection SQL ou de plantage de ta requête pour un simple ou double guillemet
 
La seconde fera la même chose mais en mieux.

Reply

Sujets relatifs:

Leave a Replay

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