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

Requêtes MySQL Discussion :

Point-virgule dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut Point-virgule dans une requête
    Bonjour,

    J'ai une requête MYSQL qui charge du texte avec des entitès HTML.

    INSERT texte='c'est l'été';

    La premier point-virgule clos la reqête, c'est comme si je chargeais :

    INSERT texte='c'';

    Je pensais que les apostrophes protégeaient le contenu.

    Voyez-vous une solution ?

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Bonjour,

    J'ai plus l'habitude d'une syntaxe du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into T (col1) values ('blabla') ;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Merci de ton suivi.

    La syntaxe ne change rien.

    Mon problème est de passer des points-virgules dans la requête.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    INSERT texte='c'est l'été';
    Ta requête est invalide, commence par la former correctement.

    Si le problème persiste, donne-nous ta requête.

    Généralement on n'inclue pas de HTML dans une base de données, et surtout pas échappé (&...; ou &#...;).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Hello Seb,

    La requête sous MySQL est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO base SET texte='été';
    C'est une syntaxe valide, le problème ne vient pas de là.

    PS : j'ai enlevé "'" qui est transformé en ' par le forum.

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Je ne vois pas d'anomalie sur ta requête. As-tu essayé de l'exécuter avec un client le plus simple possible, comme mysql en ligne de commande ?

    Tu ne donnes pas le message d'erreur.

    Donne-nous le DDL et un échantillon de données nous permettant de le reproduire.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Merci de ton suivi.

    La requête est exécutée dans PHP.

    Il n'y a pas de message d'erreur, la requête s'exécute mais le texte est tronqué au premier point-virgule rencontré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO base SET texte='été';
    Charge "&eacute"

    Le point-virgule marque la fin de la requête, c'est aussi bête que ça.

    As-tu essayé de l'exécuter avec un client le plus simple possible, comme mysql en ligne de commande ?
    Non.

    Donne-nous le DDL et un échantillon de données nous permettant de le reproduire.
    Ne peux-tu pas reproduire avec ma requête ?
    INSERT INTO base SET texte='été';

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Avec la syntaxe normalisée sous db<>fiddle et MySQL V8, aucun souci pour insérer des points virgules dans une colonne de type char(n) :

    https://dbfiddle.uk/Lah7Gt6Q


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    create table T1
          (  T1ID   integer auto_increment primary key
           , T1CH   char(10)               not null
          )
    ;
    insert into T1 (T1CH)
    values ('abcdefghij')
         , ('a;b;c;d;e;')
         , ('wxyz;abcd;')
         , ('1234567890')
         , ('; oh la la')
    ;
    select * from T1
    ;


    Résultat :

    Nom : Sans titre.png
Affichages : 223
Taille : 4,2 Ko

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Citation Envoyé par escartefigue
    Avec la syntaxe normalisée sous db<>fiddle et MySQL V8, aucun souci pour insérer des points virgules dans une colonne de type char(n) :
    C'est noté.
    Je te remercie, j'attends un peu avant de cocher Résolu.

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Je n'ai pas bien compris ce que tu attends.

    Si le problème est toujours d'actualité alors il faut nous donner les moyens de le reproduire,
    table, données et script PHP exécutable compris.

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 834
    Par défaut
    Salut à tous.

    Citation Envoyé par boteha
    La requête est exécutée dans PHP.
    Ce n'est pas un problème de syntaxe sous MySql car l'exemple de Escartefigue fonctionne parfaitement, mais plutôt celle sous Php.

    Utilisez "PDO_MYSQL" ce qui vous éviterez des tas de problèmes, au lieu de "MYSQLI" :
    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
    /*--------------------*/
    /* Mode Transactionel */
    /*--------------------*/
     
    $link->beginTransaction();
     
    /*-----------------------------------*/
    /* Insertion dans la table "clients" */
    /*-----------------------------------*/
     
    try {
    	$ins = $link->prepare("INSERT INTO `tab_client` (`nom`, `prenom`, `naissance`, `ville`, `datenreg`) VALUES (:param1, :param2, :param3, :param4, :param5)");
     
    	$ins->bindParam('param1', $nom);
    	$ins->bindParam('param2', $prenom);
    	$ins->bindParam('param3', $naissance);
    	$ins->bindParam('param4', $ville);
    	$ins->bindParam('param5', $datenreg);
     
    	$ins->execute();
    	}
    catch ( Exception $e )
    {
    	$link->rollback();
    	echo "Une erreur est survenue dans la requête insert : ", htmlentities($e->getMessage());
    	die();
    	}
    $link->commit();
    En utilisant "MYSQLI", vous devez insérer le caractère ESCAPE (\) devant tous les caractères pouvant être interprétés autrement pas MySql.
    Avec "PDO_MYSQL", le problème ne se pose plus.

    Par exemple, sous "MYSQL" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = 'insert into `tab_exemple` (`id`,`libelle`,`date`,`time`) values (4,\'treize\',\'2015-08-27\',\'19:08:07\'),(5,\'quinze\',\'2015-08-28\',\'19:08:07\');';
    @+

  12. #12
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Je précise que l'API PHP mysqli dispose aussi des requêtes préparées et que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = 'insert into `tab_exemple` (`id`,`libelle`,`date`,`time`) values (4,\'treize\',\'2015-08-27\',\'19:08:07\'),(5,\'quinze\',\'2015-08-28\',\'19:08:07\');';
    Devrait s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "insert into tab_exemple (`id`, `libelle`, `date`, `time`) values (4, 'treize', '2015-08-27', '19:08:07'), (5, 'quinze', '2015-08-28', '19:08:07');";
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $query = <<<SQL
        insert into tab_exemple (`id`, `libelle`, `date`, `time`)
        values
            (4, 'treize', '2015-08-27', '19:08:07'),
            (5, 'quinze', '2015-08-28', '19:08:07')
        SQL;
    Dans l'absolu, oui, en PHP il vaut mieux utiliser PDO qui est activement maintenue que toute autre API d'accès BdD.

  13. #13
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 834
    Par défaut
    Je crois qu'il faut utiliser la fonction "mysqli_real_escape_string" pour introduire l'ESCAPE, le caractère d'échappement qui ne provoquera plus les erreurs de syntaxes. Vu que cela fait longtemps que je n'utilise plus "MYSQLI", c'est juste un vieux souvenir. A confirmer.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Bonjour,

    Merci pour votre suivi.

    En me replongeant dans le problème à tête reposée j'ai découvert que le problème du champ coupé par un point-virgule n'a rien à voir avec la requête SQL.
    J'importe un fichier .csv depuis Excel.

    Pour séparer les cellules je dois demander :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $v = valeur-1;valeur_2;valeur_3; etc...
    $vv = explode (';', $v);
    Dès qu'une valeur contient un point-virgule il y a forcément un problème...

    Je vous ai dérangé un peu pour rien mais vos réponses sont très utiles et intéressantes.

  15. #15
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    On ne parse pas un CSV avec explode(), mais avec fgetcsv() => https://php.net/fgetcsv
    Si le CSV est correctement formé (= valeurs contenant un ; délimitées avec des ") alors il n'y aura pas de problèmes.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    Citation Envoyé par Séb. Voir le message
    On ne parse pas un CSV avec explode(), mais avec fgetcsv() => https://php.net/fgetcsv
    Si le CSV est correctement formé (= valeurs contenant un ; délimitées avec des ") alors il n'y aura pas de problèmes.
    Oui, tu as raison.

  17. #17
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    re,
    Perso j'essaie d'expliquer que les fichiers plats délimités sont des P.A.C. : il y a toujours 1 cas qui fout la grouille.

    Je recommande l'utilisation de fichiers Json, voire Xml (avec un XSD ?)
    C'est à la fois pérenne dans le temps (ajout de colonne) et la probabilité de collision entre contenu/conteneur est extraordinairement faible

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    718
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 718
    Par défaut
    C'est noté, tu as raison.

    Mais dans mon cas je reçois de mes fournisseurs des fichiers Excel bien pourris que je dois exploiter.
    Je les enregistre selon les cas en .txt (séparateur : tabulation) ou .csv (séparateur : point-virgule)

    Il existe une possibilité de .xml dans les choix d'enregistrement d'Excel.

    Du coup je ne vois pas quel fonction PHP pour créer un array avec le fichier .xml.

  19. #19
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Citation Envoyé par boteha Voir le message
    Mais dans mon cas je reçois de mes fournisseurs des fichiers Excel bien pourris que je dois exploiter.
    Oui, classique
    C'est pour ça qu'il y a les ETL ! \o/
    Celui de M$ est inclu dans la licence SQLserver (si sur le même hôte que la base) et s'appelle SSIS

    ça permet de faire les contrôles de validité ^^

    Et quand le module sera totalement opérationnel, tu pourras même le distribuer aux fournisseurs le package, pour que les sources soient directement validées à la source.


    Citation Envoyé par boteha Voir le message
    Je les enregistre selon les cas en .txt (séparateur : tabulation) ou .csv (séparateur : point-virgule)
    Ben non, c'est là que la bât blesse.
    Utilise l'ETL pour faire la partie L ^^
    Plus besoin de créer des fichiers sur disque ; fichiers qu'il faudra gérer par la suite du traitement.


    Citation Envoyé par boteha Voir le message
    Il existe une possibilité de .xml dans les choix d'enregistrement d'Excel.
    Le format xlsx est en xml


    Citation Envoyé par boteha Voir le message
    Du coup je ne vois pas quel fonction PHP pour créer un array avec le fichier .xml.
    Pourquoi passer par du PHP ?
    https://fr.wikipedia.org/wiki/PHP


    PHP est un langage de script utilisé le plus souvent côté serveur : dans cette architecture, le serveur interprète le code PHP des pages web demandées et génère du code (HTML, XHTML, CSS par exemple) et des données (JPEG, GIF, PNG par exemple) pouvant être interprétés et rendus par un navigateur web. PHP peut également générer d'autres formats comme le WML, le SVG et le PDF.
    En quoi un langage de script Web peut tenir la distance avec un outil de type ETL, qui lui est spécialisé dans cette tâche ?
    A part chercher des emm*des, je ne vois pas, désolé.

  20. #20
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 956
    Par défaut
    Petite recherche Web des ETL open source
    note : les ETL sont à part et je ne vois pas de forums consacrés à ça

    https://github.com/pentaho/pentaho-kettle
    https://nifi.apache.org/
    https://www.singer.io/

Discussions similaires

  1. [XL-2010] Avoir un point ou une virgule dans une textbox
    Par phiphi27700 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/09/2015, 06h15
  2. Convertir le point par une virgule dans une textbox
    Par trentks95 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/04/2013, 13h58
  3. [XL-2003] Ecrire un point-virgule dans une formule
    Par Marin d'Eau Douce dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/04/2012, 16h58
  4. [Débutant] [VS2003] Point à la place d'une virgule dans une String
    Par ahmedige dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/07/2011, 15h17
  5. [PROC] Remplacer un point par une virgule dans une Proc Tabulate
    Par PAULOM dans le forum SAS Base
    Réponses: 2
    Dernier message: 20/08/2009, 08h36

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