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
    Nouveau membre du Club
    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
    Points : 31
    Points
    31
    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 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    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
    Nouveau membre du Club
    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
    Points : 31
    Points
    31
    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 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    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
    Nouveau membre du Club
    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
    Points : 31
    Points
    31
    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