IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Apostrophes et php5.6


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut Apostrophes et php5.6
    Bonjour,

    Je reprends le fil bien que ce ne soit plus tout à fait la même chose.
    J'ai donc migré tant bien que mal en php 5.6.
    Immédiatement j'ai été confronté à l'affichage erroné des caractères accentués (remplacés par �) et j'ai forcé le charset avec l'entête suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php header('Content-Type: text/html; charset=ISO-8859-1'); 
    ini_set( 'default_charset', 'ISO-8859-1' ); ?>
    J'ajoute que ma bdd est en utf-8.

    Et dès lors, les � ont disparu mais je me suis aperçu que les lignes de la bdd qui contenaient des apostrophes ne sont pas lues correctement et provoquent une erreur de syntaxe sql!
    Un peu génant si l'on considère que cela concerne 200 ou 300 lignes.

    Que puis-je faire ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    et provoquent une erreur de syntaxe sql
    Ca m'ettonerait que les données provenant d'une requête provoquent rétroactivement une erreur sur la requête.

    Quelle erreur obtiens-tu ? Comment construis-tu la requête qui est en erreur ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Oui, c'est curieux, les lignes contenant les apostrophes s'affichent bien à l'issue d'une requête SELECT, mais elles doivent passer en variables comme composantes d'une liste constituant une commande (vpc)
    Et à l'affichage de cette commande, l'erreur suivante s'affiche:
    "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 'Heaven Scent'', '160-200', '0')' at line 1

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas répondu à
    Comment construis-tu la requête qui est en erreur ?
    La bonne façon c'est d'utiliser une requête préparée PDO.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Merci de ton aide.

    En fait, il y a 4 requêtes en jeu et le message d'erreur obtenu n'est pas typiquement une erreur SQL et elle bloque la page, de sorte que le code source n'indique rien d'autre que cette erreur vue à l'écran.
    Toutes les requêtes sont sur le même modèle, mysql.
    En voici une:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $colname_rsListe = "1";
    if (isset($_GET['commandeID'])) {
      $colname_rsListe = $_GET['commandeID'];
    }
    mysql_select_db($database_essai, $essai);
    $query_rsListe = sprintf("SELECT * FROM listesf WHERE commandeID = %s ORDER BY reference ASC", GetSQLValueString($colname_rsListe, "int"));
    $rsListe = mysql_query($query_rsListe, $essai) or die(mysql_error());
    $row_rsListe = mysql_fetch_assoc($rsListe);
    $totalRows_rsListe = mysql_num_rows($rsListe);
    Je ne connais pas PDO mais après enquête, tu as certainement raison, c'est et ce sera la meilleure méthode.
    Mais peut-on mélanger mysql et PDO?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Après reflexion, il semblerait que ce soit ça qui bloque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insertListe = sprintf ("INSERT INTO listesf (commandeID, reference, quantite, prixArticle, nom, pres, dispo) VALUES ('$commandeID', '$reference', '$quantite', '$prixArticle', '$nom', '$pres', '$dispo')");

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    On peut mélanger mysql et PDO mais ça n'a aucun interêt, surtout que l'extension mysql est obsolète depuis PHP5.5

    Concernant ta requête, d'ou viennent les variables ? Pourquoi tu utilises sprintf ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Pour sprintf, c'était un essai, avec ou sans c'est pareil.
    Pour les variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mysql_select_db($database_essai, $essai);
    	$insertCommande = "INSERT INTO factures (date, clientID, total) VALUES (NOW(),'$clientID', '$total')";
    	$Result1 = mysql_query($insertCommande, $essai) or die(mysql_error()); 
    	$commandeID=mysql_insert_id();
    	//recupération des articles et quantité et enregistrement dans la table listesfactures
    	  for ($i=0;$i<count($liste);$i++)
    		{
    		$reference=$liste[$i][0];//réf
    		$quantite=$liste[$i][1];//quantité
    		$prixArticle=$liste[$i][3];//prix total (nb * prix unitaire)
    		$nom=$liste[$i][4];//nom
    		$pres=$liste[$i][5];//hauteur ou volume
    		$dispo=$liste[$i][6];//dispo
                    $insertListe = "INSERT INTO listesf (commandeID, reference, quantite, prixArticle, nom, pres, dispo, trp) VALUES ('$commandeID', '$reference', '$quantite', '$prixArticle', '$nom', '$pres', '$dispo', '$trp')";

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est le contenu de $liste qui pose problème pas les données qui viennent de la première requête.
    Il faut échapper tes chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $commandeID=mysql_insert_id();
    	//recupération des articles et quantité et enregistrement dans la table listesfactures
    foreach ($liste as $value) {
    		$reference= mysql_real_escape_string($value[0]);//réf
    		$quantite= mysql_real_escape_string($value[1]);//quantité
    		$prixArticle= mysql_real_escape_string($value[3]);//prix total (nb * prix unitaire)
    		$nom= mysql_real_escape_string($value[4]);//nom
    		$pres= mysql_real_escape_string($value[5]);//hauteur ou volume
    		$dispo= mysql_real_escape_string($value[6]);//dispo
                    $insertListe = "INSERT INTO listesf (commandeID, reference, quantite, prixArticle, nom, pres, dispo, trp) VALUES ('$commandeID', '$reference', '$quantite', '$prixArticle', '$nom', '$pres', '$dispo', '$trp')";
    }

  10. #10
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Je soupconne que ce pourrait venir de là car la variable $nom peut comporter des apostrophes.
    Je ne te demanderai pas pourquoi en php 4.5, cette variable n'avais pas besoin d'être echapée!
    En tout cas merci de ta disponibilité, je vais essayer ça ce soir et je te tiens au courant.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si $liste vient d'un formulaire tu avais peut être la mécanique des magic quotes qui intervenait.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Il y a aussi ça un peu plus haut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
    {
      if (PHP_VERSION < 6) {
        $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
      }
     
      $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
     
      switch ($theType) {
        case "text":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;    
        case "long":
        case "int":
          $theValue = ($theValue != "") ? intval($theValue) : "NULL";
          break;
        case "double":
          $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
          break;
        case "date":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;
        case "defined":
          $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
          break;
      }
      return $theValue;
    }
    }
     
    ?>
    Je vais chercher les magic quotes
    Mais mes factures/commandes fonctionnent désormais avec les noms apostrophés...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/08/2004, 17h49
  2. Réponses: 3
    Dernier message: 10/06/2004, 22h34
  3. Apres l'accent l'apostrophe
    Par man80 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 04/05/2004, 16h47
  4. Stocker un apostrophe
    Par Bowen dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/03/2004, 00h00
  5. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo