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 :

Insertion données avec une requête préparée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut Insertion données avec une requête préparée
    Bonjour,

    Je vous expose mon problème simplifié.
    J'ai une table produit :
    produit (ref_produit,nom_produit,num_sav)
    La clé étrangère num_sav est clé primaire de la table SAV
    sav-constructeur (num_sav,nom_sav,adresse_sav)

    Le base est crée sur phpmyadmin.
    Voici ma requête implémentée dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $req = $bdd->prepare('INSERT INTO `produits`(`REF_PRODUIT`, `NOM_PRODUIT`, `NUM_SAV`) VALUES (:ref-produit,:nom-produit,:num-sav)'); // On prépare la requète
    $req->execute(array( // et on insère
     'ref-produit' => $_POST['ref-produit'],
     'nom-produit' => $_POST['nom-produit'],
     'num-sav' => $donnees[0]
    ));
    $donnees[0] est la clé du sav auquel le produit est associé.

    Evidemment cette requête ne marche pas et je ne comprend absolument pas pourquoi ...

    Des idées ? Suggestions ? Remarques ?

    Cordialement.

  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
    Par défaut
    C'est mieux de mettre les : dans le nom des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req->execute(array( // et on insère
     ':ref-produit' => $_POST['ref-produit'],
     ':nom-produit' => $_POST['nom-produit'],
     ':num-sav' => $donnees[0]
    ));
    Sinon quelle erreur as-tu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut Merci
    Tout d'abord merci pour la réponse rapide.

    J'ai exactement cette erreur :
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    A priori, une des données que tu utilises comme paramètre est vide.
    Est-ce que tu contrôles ces données avant ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Peut-être un problème de quote autour du nom du produit ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $bdd->prepare("INSERT INTO `produits`(`REF_PRODUIT`, `NOM_PRODUIT`, `NUM_SAV`) VALUES (':ref-produit',':nom-produit',':num-sav')");

    Je n'utilise pas PDO (je suis passé directement du mysql_... à Doctrine) donc à prendre avec des pincettes, mais c'est une des erreurs que je faisais régulièrement

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    Apparemment c'était un problème de quotes, je n'ai plus l'erreur.
    Le problème maintenant est que lors de l'ajout, ça ajoute :
    0 pour ref-produit
    :nom-produit pour nom-produit
    0 pour num-sav
    ....

    Je vous re-montre mon code que j'ai désormais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $req = $bdd->prepare("INSERT INTO `produits`(`REF_PRODUIT`, `NOM_PRODUIT`, `NUM_SAV`) VALUES (':ref-produit',':nom-produit',':num-sav')");
    $req->execute(array(
     ':ref-produit' => $_POST['ref-produit'],
     ':nom-produit' => $_POST['nom-produit'],
     ':num-sav' => $donnees[0]
    ));

    Edit : en fait j'ai enlevé les quotes autour de :ref-produit etc ... l'erreur me revient encore, je trouve ça assez énorme ...
    Du coup je vous met le code entier de la page :

    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
    <!DOCTYPE html>
    <html>
    <head>
    <title>Ajout d'un produit</title>
     
    <meta charset="utf-8" /></head>
     
    <body>
    	<?php 
     
     
     
    try
    {
        // On se connecte en MySQL
        $bdd = new PDO('mysql:host=localhost;dbname=toutebo', 'root', '');
     
    }
    catch(Exception $e)
    {
        // En cas d'erreur, on affiche un message et on arrète tout
            die('Erreur : '.$e->getMessage());
    }
     
    $reponse = $bdd->query("SELECT NUM_SAV from `toutebo`.`sav-constructeurs` WHERE NOM_SAV='".$_POST['choix']."'");
    $donnees = $reponse->fetch();
    echo $donnees[0];
     
    $req = $bdd->prepare("INSERT INTO `produits`(`REF_PRODUIT`, `NOM_PRODUIT`, `NUM_SAV`) VALUES (:ref-produit,:nom-produit,:num-sav)");
     // On prépare la requète
    $req->execute(array( // et on insère
     ':ref-produit' => $_POST['ref-produit'],
     ':nom-produit' => $_POST['nom-produit'],
     ':num-sav' => $donnees[0]
    ));
     
    echo "Le produit ";
    echo $_POST['nom-produit'] ;
    echo " a été ajouté <br/>";
    echo "Il a pour référence : ";
    echo $_POST['ref-produit'];
    $reponse->closeCursor();
     
    ?>
     
     
     
    </br>
    <a href="index.php">Revenir au menu</a>
     
    </body>
    </html>

    Si je fais echo de tous 3 paramètres ça m'affiche bien ce que j'ai entré dans le formulaire

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Un exemple de ce que tu as rentré dans le formulaire ? (Et, pourquoi pas, le code HTML de ce fameux formulaire)

  8. #8
    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
    Par défaut
    Le nom des paramètres ne peut pas contenir un tiret.
    Ce n'est malheureusement pas documenté.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Effectivement, après recherche, sabotage a raison (je me coucherai moins bête ce soir ) et effectivement c'est très mal, voire pas du tout documenté.
    https://bugs.php.net/bug.php?id=43130

    En bref, mieux vaut se limiter aux alphanum + underscore (comme pour les variables PHP en fait)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    Effectivement j'ai changé tous les tirets par des underscores et plus aucune erreur, l'ajout se fait également dans la base de données.

    Merci beaucoup pour vos réponses, c'est vraiment gentil.
    @+

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

Discussions similaires

  1. [MySQL] Supprimer une entrée avec une requête préparée
    Par safron dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 20/02/2013, 19h06
  2. [MySQL] Probleme avec une requête préparée
    Par lucduke dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 14/12/2012, 06h59
  3. probleme avec une requête préparée
    Par stc074 dans le forum JDBC
    Réponses: 5
    Dernier message: 19/08/2010, 22h04
  4. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10
  5. [PDO] une requête préparée pour un insert avec jointure?
    Par seïna dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/08/2008, 00h34

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