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

PHP & Base de données Discussion :

Insert passe sur Phpmyadmin et plante par script php [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Insert passe sur Phpmyadmin et plante par script php
    Bonjour,

    Je suis confronté pour la première fois à ce problème.
    Une instruction Insert de base est rejetée pour une raison de syntaxe par mysqli et passe parfaitement sur phpmyadmin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO locations_vacances(date_creation) VALUES('2014-06-17')
     
    1064) 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 '' at line 1

    Est-ce que cela vous est déjà arrivé ?
    Avez-vous trouvé une solution ?

    Merci pour votre retour d'expériences.
    Camillo

  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
    Peux-tu nous montrer le code PHP ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Mysql : 5.1.37
    PHP : 5.2.11
    PhpMyAdmin : 3.2.4

    L'origine des données est un fichier XML récupéré d'un WebServices qui me retourne une liste d'enregistrements.
    Je génère une table à la volée, puis insère chaque enregistrement en table.


    Voici le code pour les parties concernées :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    function maj_sqlinsert($nom, $valeur, $type, $idvalue = "") {
        global $sql_insert, $sql_value;
     
        // Supprime les caractères accentués des balises XML et passage en minuscule
        $colonne = str_replace('É', 'e', $nom);
        $colonne = str_replace('È', 'e', $colonne);
        $colonne = strtolower($colonne);
     
        // Préparation de l'insertion
        if (($colonne == "nature_bien") || ($colonne == "secteur") || ($colonne == "ville"))
    	$valeur = $idvalue;
        if (($type == "date") && ($valeur != "")) {
            $jours = $mois = $an = "";
            list($jours , $mois , $an) = split("[-./]",$valeur);
            $valeur = $an."-".$mois."-".$jours;
        }
        if ($type == "float") {
            $valeur = str_replace(',', '.', $valeur);
        }
        $valeur = str_replace('"', "'", $valeur);
        $valeur = enregistrerDonnee($valeur);
     
       // Prise en compte si la donnée n'est pas vide 
       if ($valeur != "")
    	switch ($type) {
    		//case "varchar" :
                    //case "text" :
                    case "date" : 
                          $sql_insert .= $colonne . ","; 
                          $sql_value .= '"' . $valeur . '",'; 
                          break;
    		//case "smallint" :
                    //case "float" : 
                    //       $sql_insert .= $colonne . ", "; 
                    //       $sql_value .= $valeur . ", "; 
                    //       break;
    	}
    }
     
    ...
     
    // Connexion à la base
    $mysqli = new mysqli($host, $user, $pass,$db_name);
    if ($mysqli->connect_errno) {
        echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
        emailErreur($message, $email_administrateur, $email_client);
        exit;
    }
     
    ...
     
     
    // Pour chaque enregistrement retourné par le WebService
    foreach($child->children() as $subchild) {
        $sql_insert = "INSERT INTO locations_vacances(";
        $sql_value = " VALUES(";
        ...
        $sql_insert[strrpos($sql_insert, ',')] = "";
        $sql_value[strrpos($sql_value, ',')] = "";
        $sql = $sql_insert . ") " . $sql_value . ")";
        if (!$mysqli->query($sql)) {
    	 echo $mysqli->   $mysqli->errno . ") " . $mysqli->error;
             emailErreur($message, $email_administrateur, $email_client);
        }
    }
     
    ...

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_insert = "INSERT INTO locations_vacances(";
        ...
        $sql_insert[strrpos($sql_insert, ',')] = "";
    Tu as vraiment contrôlé la requête finale ?
    Parce que la soit tu fais des choses étranges, soit tu ne nous montres pas le code tel qu'il est.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je t'enverrai le code complet en MP si tu veux.

    Effectivement je n'ai pas mis la partie qui consiste à parser les balises XML reçues par Webservice.

    Pour chaque balise, je lis son contenu, la valeur de la donnée, en détermine le type et appelle function maj_sqlinsert($nom, $valeur, $type, $idvalue = "")
    qui complète la requête à exécuter.

    Avant d'exécuter j'affiche le résultat bien entendu (cf premier message du topic) et affiche le résultat de l'exécution qui retourne une erreur de syntaxe SQL.

    A force de regarder, je dois avoir les yeux qui fatiguent, j'espère qu'un oeil extérieur pourra m'aider

    Je commence à me dire qu'il y a peut-être des caractères invisibles dans le flux XML reçu et qui vient polluer ma requête et qui ne serait pas visible en restitution HTML ...

  6. #6
    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
    Est-ce que tu peux expliquer au moins les deux lignes que j'ai cité ?
    $sql_insert est une chaine de caractère ou bien un tableau qui contient je ne sais pas trop quoi ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_insert = "INSERT INTO locations_vacances(";
    ...
    $sql_insert[strrpos($sql_insert, ',')] = "";
    Oui pas de pbm pour l'explication
    Merci pour le temps que tu prends pour m'aider dans tous les cas


    $sql_insert est bien une chaine de caractère qui me permet de préciser au fur et à mesure les colonnes qui seront valorisées dans l'INSERT.
    La première ligne initialise le début de la requête avec une chaine de caractères.

    La seconde ligne (qui se trouve juste avant l'exécution de la requête), a pour seul but d'enlever la virgule finale afin de la remplacer ensuite par une parenthèse fermante.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Solution trouvée et tu avais bien flairé le problème de traitement de chaine comme un tableau, à tort.

    Il fallait coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql_insert = substr($sql_insert,0,-1);
    $sql_value = substr($sql_value,0,-1);

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

Discussions similaires

  1. [phpMyAdmin] Insertion bloquée sur phpMyAdmin
    Par chanteur06 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 09/10/2015, 17h59
  2. Réponses: 1
    Dernier message: 24/04/2013, 00h43
  3. besoin d'aide sur envoi de commande par script SSH
    Par threepwood dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 16/03/2010, 17h52
  4. Réponses: 7
    Dernier message: 07/06/2007, 18h18
  5. [MySQL] Problème de backup par script PHP
    Par bagu dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 30/04/2006, 16h51

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