Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insertion d'une ligne sous MySQL via PHP

    5 octobre 2010 à 17:44:16

    Bonjour,

    J'essaie d'insérer via un formulaire PHP des membres dans une base de données (je travaille sous XAMPP).
    Je me suis appuyé sur le tutoriel PHP/MySQL ainsi que sur certains conseils issus du forum et voici le code (anonymisé) :
    <?php
    try
    {
        $host = 'localhost';
        $dbname = 'tttt_provence';
        $login = 'root';
        $pass = '';
        $options = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
        $bdd = new PDO("mysql:host=$host;dbname=$dbname", $login,$pass, $options);
    }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
        $message = sprintf('Erreur MySQL %d<br />%s', $e->getCode(), $e->getMessage());
        trigger_error($message, E_USER_ERROR);
    }
    //J'ajoute les données des nouveaux membres dans la table correspondante.
    $bdd->exec('INSERT INTO membres(numero, nom, prenom, adresse1, adresse2, code_postal, ville, membre_prv, pays, courriel, telephone_mobile, 
    telephone_fixe, date_naissance, date_derniere_adhesion, date_echeance_adhesion, fonctions_dans_asso, participation_activites, organisation_activites, 
    commentaires_activites, articles_expression) VALUES(:numero, :nom, :prenom, :adresse1, :adresse2, :code_postal, :ville, :membre_prv, :pays, :courriel, 
    :telephone_mobile, :telephone_fixe, :date_naissance, :date_derniere_adhesion, :date_echeance_adhesion, :fonctions_dans_asso, :participation_activites, 
    :organisation_activites, :commentaires_activites, :articles_expression)');
    
    $req->execute(array(
        'xxxx' => $numero,
        'AAAAAAAAA' => $nom,
        'bbbbbbbbb' => $prenom,
        '1 rue de zzzzz' => $adresse1,
        '' => $adresse2,
        '13000' => $code_postal,
        'Cccccccc' => $ville,
        0 => $membre_prv,
        'France' => $pays,
        'yyyyyyyy.xxxxxxx@wwww.fr' => $courriel,
        '06 00 00 00 00' => $telephone_mobile,
        '04 00 00 00 00' => $telephone_fixe,
        '01/01/1960' => $date_naissance,
        '2010-10-01' => $date_derniere_adhesion,
        '2011-09-30' => $date_echeance_adhesion,
        '' => $fonctions_dans_asso,
        '' => $participation_activites,
        '' => $organisation_activites,
        '' => $commentaires_activites,
        '' => $articles_expression
        ));
        
     echo 'Un nouveau membre a été ajouté à la liste !';
    ?>
    


    Lorsque j'affiche la page PHP correspondante, voici ce que ça donne :

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 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 ':numero, :nom, :prenom, :adresse1, :adresse2, :code_postal, :ville, :membre_prv,' at line 3' in C:\xampp\htdocs\nouveau-membre.php:22 Stack trace: #0 C:\xampp\htdocs\nouveau-membre.php(22): PDO->exec('INSERT INTO mem...') #1 {main} thrown in C:\xampp\htdocs\nouveau-membre.php on line 22


    J'ai beau regarder aux lignes concernées, je ne vois rien de plus bizarre qu'ailleurs...

    Précisions :
    1/ Comme le calendrier "DATE" ne remonte pas avant 1970 et que certaines personnes ne pouvaient pas être intégrées, j'ai dû écrire la date de naissance en mode "char", il est donc normal qu'elle se distingue des dates en-dessous, mais si vous avez une solution pour forcer "DATE" à accepter des dates antérieures...
    2/ Idem pour le code postal ou les numéros de téléphone, ingérables à ma connaissance en format numérique (espaces non gérés et 0 inital du CP ignoré), d'où "char"... Si je me trompe, merci de me le signaler... :D
    3/ Enfin, pour vérifier si les membres sont enregistrés dans la région ou pas, j'ai opté pour un booléen, mais je ne sais pas quoi mettre dedans : O/N ou forcément 1/0 ? Par défaut, en attendant de savoir quoi écrire, j'ai laissé 0 partout dans cette colonne (qui refuse d'ailleurs le "BOOL" et s'est mis d'autorité en "TINYINT", j'ignore pourquoi mais ça m'énerve, grrr :colere: ) et l'ai mis dans la présente requête aussi. Serait-ce là que ça bloque entre autres ? Je n'ai pas entouré le "0" de "quotes" comme les autres données, vu que les données numériques n'en requièrent pas, n'est-ce pas ?

    Voilà, c'est un peu long, mais au moins ai-je anticipé d'éventuelles questions... ;)

    Merci d'avance pour vos utiles lumières !
    • Partager sur Facebook
    • Partager sur Twitter
      5 octobre 2010 à 18:12:21

      Salut,

      Tu n'es pas au bon endroit pour les question PHP ;)

      Sinon, comme tu essayes de faire une requête préparée, c'est prepare() et pas exec que tu dois utiliser.
      Et tu as tout inversé dans l'array que tu passes à execute(), c'est "clé=>valeur" et pas "valeur=>cle". Comme les clés ne sont pas des variables, il ne faut pas mettre les "$".
      • Partager sur Facebook
      • Partager sur Twitter
        5 octobre 2010 à 18:16:14

        Grillé !

        En tous cas j'approuve :p
        Et ta variable $req sort de nulle part ! C'est $bdd que tu dois utiliser ;)

        <?php
        //J'ajoute les données des nouveaux membres dans la table correspondante.
        $bdd->prepare('INSERT INTO membres(numero, nom, prenom, adresse1, adresse2, code_postal, ville, membre_prv, pays, courriel, telephone_mobile, 
        telephone_fixe, date_naissance, date_derniere_adhesion, date_echeance_adhesion, fonctions_dans_asso, participation_activites, organisation_activites, 
        commentaires_activites, articles_expression) VALUES(:numero, :nom, :prenom, :adresse1, :adresse2, :code_postal, :ville, :membre_prv, :pays, :courriel, 
        :telephone_mobile, :telephone_fixe, :date_naissance, :date_derniere_adhesion, :date_echeance_adhesion, :fonctions_dans_asso, :participation_activites, 
        :organisation_activites, :commentaires_activites, :articles_expression)');
        
        $bdd->execute(array(
            'xxxx' => $numero,
            'AAAAAAAAA' => $nom,
            'bbbbbbbbb' => $prenom,
            '1 rue de zzzzz' => $adresse1,
            '' => $adresse2,
            '13000' => $code_postal,
            'Cccccccc' => $ville,
            0 => $membre_prv,
            'France' => $pays,
            'yyyyyyyy.xxxxxxx@wwww.fr' => $courriel,
            '06 00 00 00 00' => $telephone_mobile,
            '04 00 00 00 00' => $telephone_fixe,
            '01/01/1960' => $date_naissance,
            '2010-10-01' => $date_derniere_adhesion,
            '2011-09-30' => $date_echeance_adhesion,
            '' => $fonctions_dans_asso,
            '' => $participation_activites,
            '' => $organisation_activites,
            '' => $commentaires_activites,
            '' => $articles_expression
            ));
            
         echo 'Un nouveau membre a été ajouté à la liste !';
        ?>
        


        A part ça, c'est très agréable de trouver un problème si bien décrit, merci !
        • Partager sur Facebook
        • Partager sur Twitter
          5 octobre 2010 à 19:06:54

          Merci à vous deux !
          Bon, donc j'ai encore emmêlé mes neurones dans le code et dans l'architecture du forum (j'ai pourtant fait très attention, bizarre, il doit y avoir un plan détaillé quelque part, je suppose), comme d'hab' : y a rien contre l'allergie à l'organisation en général et au code en particulier ? Mon cas est désespéré, je crois... :honte:

          Bien, je pense que le problème est résolu mais je vais effectuer un test avant de le cocher comme tel...
          Là, trop mal à la tête, faut que je sorte un peu... :o
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2010 à 18:00:09

            Bon, le problème a évolué... :ninja:
            Il semblerait que je sois confronté à un défaut de définition de méthodes, que je n'avais pas remarqué avoir créées...
            Fatal error: Call to undefined method PDO::execute() in C:\xampp\htdocs\nouveau-membre_test_trycatch.php on line 23
            Voici la ligne 23 :
            $bdd->execute(array(
            


            Juste avant, le problème était sur la ligne 12, où je n'avais pas défini la méthode getCode() et encore avant sur la même ligne où je devais définir getMessage() : comme je ne savais absolument pas quoi en faire, je les ai passées en commentaires...
            Il s'agit de ce bloc-là :
            die('Erreur : '.$e->getMessage());
                $message = sprintf('Erreur MySQL %d<br />%s', $e->getCode(), $e->getMessage());
                trigger_error($message, E_USER_ERROR);
            

            J'avais cru qu'il était en désordre, alors j'avais glissé la première ligne en troisième position, mais ça avait déplacé l'erreur sur getMessage(), d'où la mise en commentaires et le rebond de l'erreur en ligne 12.
            J'ai l'impression que je perds du temps à esquiver le problème mais je ne sais pas comment le résoudre : il s'agit probablement d'une même erreur généralisée, donc j'espère qu'avec une correction je m'en sortirai, mais j'en doute...
            En attendant, je n'ai toujours pas réussi à effectuer l'ajout de membres depuis PHP vers MySQL... :(
            Bref, si vous y comprenez quelque chose, merci d'avance pour vos lumières... :ange:
            Sinon, bah j'esquiverai encore en insérant manuellement depuis MySQL, jusqu'au prochain problème en PHP... :p
            • Partager sur Facebook
            • Partager sur Twitter

            Insertion d'une ligne sous MySQL via PHP

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown