Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
938 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Update, double quotes et simples quotes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Update, double quotes et simples quotes

n°2252094
Trajet
Posté le 02-03-2015 à 16:40:32  profilanswer
 

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:

mood
Publicité
Posté le 02-03-2015 à 16:40:32  profilanswer
 

n°2252096
ragondin
Un pote ragondin c'est cool
Posté le 02-03-2015 à 16:54:18  profilanswer
 

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 : http://www.iso-country-code.com
n°2252157
Trajet
Posté le 03-03-2015 à 08:45:05  profilanswer
 

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

n°2252180
hinomura
Posté le 03-03-2015 à 11:18:00  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Update, double quotes et simples quotes

 

Sujets relatifs
[Réglé] [SQL] Update après un select[Curl] problème d'interprétation des quotes
Mysql exclure double critèreSite à double colonne avec une à largeur fixe et une autre ajustable
Envois d'un double tableau à une fonction[Débutant C++] Classes simples
Background doubleSQL et les Update multi lignes
Probleme UPDATE dans PHPzone de recherche s'affiche en double
Plus de sujets relatifs à : Update, double quotes et simples quotes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR