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 :

Foreach avec INSERT en MySQL


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Par défaut Foreach avec INSERT en MySQL
    Bonsoir à tous !

    J'essaie d'insérer des multi-lignes dans ma table en faisant une boucle mais je ne sais pas trop comment m'y prendre.
    Voici mon bout de code :
    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
    <?php
    $Fr_Nom = !empty($Fr_Nom) ? "$Fr_Nom" : NULL;
    $Fr_Carte = !empty($Fr_Carte) ? "$Fr_Carte" : NULL;
    $Fr_Code = !empty($Fr_Code) ? "$Fr_Code" : NULL;
    $Fr_Date = !empty($Fr_Date) ? "$Fr_Date" : NULL;
    $Fr_Total = !empty($Fr_Total) ? "$Fr_Total" : NULL;
    $Fr_Pourcentage = !empty($Fr_Pourcentage) ? "$Fr_Pourcentage" : NULL;
     
    $array_lib = !empty($_POST['Fr_Libelle']) ? $_POST['Fr_Libelle'] : NULL;
    $array_qte = !empty($_POST['Fr_Quantite']) ? $_POST['Fr_Quantite'] : NULL;
    $array_unt = !empty($_POST['Fr_PrixUnit']) ? $_POST['Fr_PrixUnit'] : NULL;
    $array_tot = !empty($_POST['Fr_PrixTotal']) ? $_POST['Fr_PrixTotal'] : NULL;
     
    foreach($array_lib as $key => $value)
    	{
    	$FR_PDO = $pdo->prepare("INSERT INTO tb_user_voucher (Nom, Carte, Pseudo, Email, Bon, Date, Total, Pourcentage, Libelle, Quantite, PrixUnit, PrixTotal)
    VALUES (:Fr_Nom, :Fr_Carte, :Fr_Pseudo, :Fr_Email, :Fr_Code, :Fr_Date, :Fr_Total, :Fr_Pourcentage, '" . $value . "', '" . $array_qte[$key] . "', '" . $array_unt[$key] . "', '" . $array_tot[$key] . "')");
    	$FR_PDO->execute(array(
    		"Fr_Nom" => $Fr_Nom,
    		"Fr_Carte" => $Fr_Carte,
    		"Fr_Pseudo" => $Fr_Pseudo,
    		"Fr_Email" => $Fr_Email,
    		"Fr_Code" => $Fr_Code,
    		"Fr_Date" => $Fr_Date,
    		"Fr_Total" => $Fr_Total,
    		"Fr_Pourcentage" => $Fr_Pourcentage,
    		"array_lib" => $value,
    		"array_qte" => $array_qte[$key],
    		"array_unt" => $array_unt[$key],
    		"array_tot" => $array_tot[$key]
    	));
    	}
    et voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fatal error: Uncaught PDOException:
    SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/voucher_ajouter.php:62
    Stack trace: #0 /home/voucher_ajouter.php(62):
    PDOStatement->execute(Array) #1 {main} thrown in /home/voucher_ajouter.php on line 62
    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Bonjour , pour commencer les clés de ton tableau ne sont pas bonnes.

    tu utilise :Fr_Nom dans ta requêtes mais 'Fr_Nom' dans ton tableau , il faut rajouter les ':'
    Ensuite les 4 dernières clés de ton tableau ne sont pas utilisé , ce qui forcément va conduire à une erreur (en plus du fait qu'elle soit aussi mal nommée).

    Pour finir le prepare() ne se fait qu'une fois , si tu le fais dans la boucle tu perd tout l'intérêt de la requête préparée qui consiste à préparer une fois et exécuter de multiple fois.

    Quelques chose comme :

    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
     
    $FR_PDO = $pdo->prepare("INSERT INTO tb_user_voucher (Nom, Carte, Pseudo, Email, Bon, Date, Total, Pourcentage, Libelle, Quantite, PrixUnit, PrixTotal)
    VALUES (:Fr_Nom, :Fr_Carte, :Fr_Pseudo, :Fr_Email, :Fr_Code, :Fr_Date, :Fr_Total, :Fr_Pourcentage, :array_lib, :array_qte, :array_unt, :array_tot)");
    foreach($array_lib as $key => $value)
    {
     
    	$FR_PDO->execute(array(
    		":Fr_Nom" => $Fr_Nom,
    		":Fr_Carte" => $Fr_Carte,
    		":Fr_Pseudo" => $Fr_Pseudo,
    		":Fr_Email" => $Fr_Email,
    		":Fr_Code" => $Fr_Code,
    		":Fr_Date" => $Fr_Date,
    		":Fr_Total" => $Fr_Total,
    		":Fr_Pourcentage" => $Fr_Pourcentage,
    		":array_lib" => $value,
    		":array_qte" => $array_qte[$key],
    		":array_unt" => $array_unt[$key],
    		":array_tot" => $array_tot[$key]
    	));
    }
    devrait déjà se rapprocher plus d'une solution fonctionnelle
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Par défaut
    Merci beaucoup Grunk ! Ca fonctionne tout à fait avec quelques petites corrections. Merci beaucoup !

    Je rencontre tout de même un dernier petit soucis, Undefined offset: 8 sur les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ":array_qte" => $array_qte[$key],
    ":array_unt" => $array_unt[$key],
    ":array_tot" => $array_tot[$key]
    Pourtant je penses avoir définit la valeur 0 !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $array_qte = !empty($_POST['Fr_Quantite']) ? $_POST['Fr_Quantite'] : 0;
    $array_unt = !empty($_POST['Fr_PrixUnit']) ? $_POST['Fr_PrixUnit'] : 0;
    $array_tot = !empty($_POST['Fr_PrixTotal']) ? $_POST['Fr_PrixTotal'] : 0;
    Afin de me faciliter l'injection de ma requête de mes 800 articles, y aurait-il moyen de limiter l'injection selon si les quantité sont 0 alors il n'ajoute pas la ligne ?

    Par exemple, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Libellé    | Quantité | Prix Unit. |Prix Total |
    ------------------------------------------------
    Libellé 1  |    2     |        200 |       400 |
    Libellé 2  |    0     |        300 |         0 |
    Libellé 3  |    1     |        100 |       100 |
    Il n'ajoutera que Libellé 1 et Libellé 3 ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Undefined offset veux dire que tu essai de lire une case d'un tableau qui n'existe pas.

    Si tu ne veux pas insérer quand la quantité est à 0 il suffit de faire un if autour du execute pour justement ne pas le faire si la quantité est à 0
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2006
    Messages : 38
    Par défaut
    Merci pour ton aide Grunk !
    J'y serai pas arrivé sans ton éclaircissement !

    Sujet résolu !

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

Discussions similaires

  1. probleme avec INSERT INTO mysql
    Par tylan95 dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2014, 19h01
  2. Problème avec INSERT dans MySQL
    Par Ercan67000 dans le forum Débuter
    Réponses: 4
    Dernier message: 09/01/2012, 09h17
  3. [Mysql 3.23.58] Problème avec insert
    Par trihanhcie dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 11h04
  4. Problème d'INSERT avec caractères accentués: mysql 5.0
    Par yizashi dans le forum Installation
    Réponses: 2
    Dernier message: 05/04/2006, 10h26
  5. pb avec insertion sigle € dans MySql
    Par mohican13 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 02/12/2005, 10h12

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