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 :

UPDATE insertion multiple [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut UPDATE insertion multiple
    Re-bonjour à nouveau à tous,
    Voilà je me retourne encore vers vous pour régler un problème que je conceptualise très bien mais que je n'arrive pas à mettre en oeuvre.

    J'ai un formulaire avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <td name="num_item" value="<?php echo $donnees['num_item_exercice'];?>"><?php echo $donnees['nom_item'];?></td>
    <td name="num_exercice" value="<?php echo $donnees['num_exercice'];?>"><?php echo $donnees['num_exercice']?> - <?php echo $donnees['nom_exercice']?></td>
    <td name="num_age" value="<?php echo $donnees['num_age'];?>"><?php echo $donnees['nom_age'];?></td>
    <td><select name="guidance">
    <option value="1" selected>Guidance Totale</option>
    <option value="2">Guidance Partielle</option>
    <option value="3" >Sans aide</option>
    </select></td>
    <td><textarea rows="2" cols="20" name="observations"></textarea></td>
    Ce formulaire fonctionne parfaitement. Ce que je souhaite c'est faire un UPDATE multiple de tous les enregistrements dans une seule requête. C'est-à-dire : l'utilisateur manipule comme il l'entend les données sur le formulaire et enfin clique sur le bouton sauvegarder et hop...update multiple pour tout mettre à jour.

    Je récupère mes données via un $_POST['nom_variable'] (mais est-ce qu'il récupère toutes les valeurs dans un array ???), je fais une boucle foreach ou while pour traiter chaque UPDATE et le tour est joué...quelqu'un peut-il m'aider ?

    Merci d'avance.
    Jérôme

  2. #2
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Qu'est ce que tu entends par UPDATE MULTIPLE.

    Est-ce que tu peux montrer la table qui est censé être mise à jour. Si tous ces champs sont dans une table, un seul UPDATE suffit.

    Peut-tu nous en dire un peu plus!

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Qu'est ce que tu entends par UPDATE MULTIPLE.

    Est-ce que tu peux montrer la table qui est censé être mise à jour. Si tous ces champs sont dans une table, un seul UPDATE suffit.

    Peut-tu nous en dire un peu plus!
    Par update multiple je veux dire mettre à jour plusieurs enregistrements en même temps en cliquant sur un bouton Mettre à jour par exemple.

    La table concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE IF NOT EXISTS `ime_constituer` (
      `num_enfant_C` int(4) NOT NULL,
      `num_item_C` int(5) NOT NULL,
      `num_exercice_C` int(4) NOT NULL,
      `guidance_C` tinyint(1) NOT NULL,
      `obs_C` text NOT NULL,
      PRIMARY KEY (`num_enfant_C`,`num_item_C`,`num_exercice_C`),
      KEY `num_exercice_C` (`num_exercice_C`),
      KEY `num_item_C` (`num_item_C`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Effectivement tous les champs sont dans une seule table (ime_constituer) et je récupère mes enregistrements de mon formulaire (voir mon post précédent). Comment fait-on ? Merci pour vos lumières.

    Jérôme

  4. #4
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Le formulaire que tu nous montre ne concerne qu'un seul enregistrement. Tu veux donc mettre à jour tous les champs de ce formulaire dans ta table?

    Si c'est le cas tu construit ta requête simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ime_constituer SET champ1 = "val1", etc WHERE num_enfant_C = "val1" AND num_item_C = "val2" AND num_exercice_C = "";
    En pensant à bien vérifier tes données dans le $_POST (protéger de la faille d'injection SQL et blablabla et blablabli).

    Bon dév'

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Le formulaire que tu nous montre ne concerne qu'un seul enregistrement. Tu veux donc mettre à jour tous les champs de ce formulaire dans ta table?
    Non, j'ai une boucle sur ce formulaire. Voici le code avec la boucle :

    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
     
    while ($donnees = $req->fetch())
    {
    echo '<tr class="prem '.( ($i % 2 == 0) ? 'classe1' : 'classe2' ).'">';
    $i++;
    ?>	
    <td name="num_item" value="<?php echo $donnees['num_item_exercice'];?>"><?php echo $donnees['nom_item'];?></td>
    <td name="num_exercice" value="<?php echo $donnees['num_exercice'];?>"><?php echo $donnees['num_exercice']?> - <?php echo $donnees['nom_exercice']?></td>
    <td name="num_age" value="<?php echo $donnees['num_age'];?>"><?php echo $donnees['nom_age'];?></td>
    <td><select name="guidance">
    	<option value="1" selected>Guidance Totale</option>
    	<option value="2">Guidance Partielle</option>
    	<option value="3" >Sans aide</option>
    </select></td>
    <td><textarea rows="2" cols="20" name="observations[]"></textarea></td>
     
    		</tr>
    Cela va donc créer plusieurs lignes dans le formulaire que l'utilisateur va modifier comme il l'entend et clique sur un seul bouton METTRE A JOUR pour executer ce que j'appel un "UPDATE MULTIPLE"

    Merci pour votre aide.
    Jérôme

  6. #6
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Salut,

    Dans ce cas il faut que tu formate un peu mieux ton formulaire:

    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
    <?php $i = 0; ?>
     <?php while ($donnees = $req->fetch()): ?>
    	<tr class="prem <?php echo ( ($i % 2 == 0) ? 'classe1' : 'classe2' ) ?>">
    		<td>
    			<input type="hidden" name="ime[<?php echo $i ?>][num_item]]" value="<?php echo $donnees['num_item_exercice']; ?>" />
    			<?php echo $donnees['nom_item'];?>
    		</td>
    		<td>
    			<input type="hidden" name="ime[<?php echo $i ?>][num_exercice]" value="<?php echo $donnees['num_exercice']; ?>" />
    			<?php echo $donnees['num_exercice']?> - <?php echo $donnees['nom_exercice']?>
    		</td>
    		<td>
    			<input type="hidden" name="ime[<?php echo $i ?>][nom_age]" value="<?php echo $donnees['nom_age']; ?>" />
    			<?php echo $donnees['nom_age'];?>
    		</td>
    		<td>
    			<select name="ime[<?php echo $i ?>][guidance]">
    				<option value="1" selected>Guidance Totale</option>
    				<option value="2">Guidance Partielle</option>
    				<option value="3" >Sans aide</option>
    			</select>
    		</td>
    		<td>
    			<textarea rows="2" cols="20" name="ime[<?php echo $i ?>][observations]"></textarea>
    		</td>
    	</tr>
    	<?php $i++; ?>
    <?php endwhile; ?>
    Tu récupère ainsi dans ton $_POST un tableau de ce type:
    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
    Array (
        [ime] => Array (
                [0] => Array (
                        [num_item] => 3
                        [num_exercice] => 4
                        [nom_age] => 18
                        [guidance] => 3
                        [observations] => Blablablablablablabla
                    )
                [1] => Array (
                        [num_item] => 3
                        [num_exercice] => 5
                        [nom_age] => 16
                        [guidance] => 2
                        [observations] => Blablablablablablabla 2
                    )
            )
    )
    Bon dév'

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Ok merci à toi firehist.
    Je vais tester ton code et je te tiens au courant.
    @+
    Jérôme

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Ok firehist : ton code fonctionne à merveille et j'ai compris...en fait cela crée un tableau que je récupère par l'intermédiaire du $_POST et je traite le tout dans un UPDATE avec une boucle pour parcourir tout le tableau...arrête moi si je me trompe ! ! !

    Mais voilà, autant je sais le faire avec un enregistrement unique (ci-dessous un exemple avec la table ime_enfant où j'ai récupéré chaque valeur par un $_POST et que je traite par une requête préparée en PDO)...

    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
     
    $req = $bdd->prepare('UPDATE ime_enfant SET
    nom_enfant = :nom_enfant,
    prenom_enfant = :prenom_enfant,
    DDN_enfant = :DDN_enfant,
    SF_enfant = :SF_enfant,
    Date_entree_enfant = :Date_entree_enfant,
    Date_debut_contrat_sejour_enfant = :Date_debut_contrat_sejour_enfant,
    Date_fin_contrat_sejour_enfant = :Date_fin_contrat_sejour_enfant,
    MDPH_date_debut_enfant = :MDPH_date_debut_enfant,
    MDPH_date_fin_enfant = :MDPH_date_fin_enfant,
    Diagnostic_psy_enfant = :Diagnostic_psy_enfant,
    Diagnostic_cria_enfant = :Diagnostic_cria_enfant,
    Infos_medicales_enfant = :Infos_medicales_enfant,
    Suivi_externe_enfant = :Suivi_externe_enfant,
    Suivi_interne_enfant = :Suivi_interne_enfant WHERE num_enfant = :num_enfant');
     
    $req->execute(array(
    	'nom_enfant' => $nom_enfant,
    	'prenom_enfant' => $prenom_enfant,
    	'num_enfant' => $num_enfant,
    	'DDN_enfant' => $DDN_enfant,
    	'SF_enfant' => $SF_enfant,
    	'Date_entree_enfant' => $Date_entree_enfant,
    	'Date_debut_contrat_sejour_enfant' => $Date_debut_contrat_sejour_enfant,
    	'Date_fin_contrat_sejour_enfant' => $Date_fin_contrat_sejour_enfant,
    	'MDPH_date_debut_enfant' => $MDPH_date_debut_enfant,
    	'MDPH_date_fin_enfant' => $MDPH_date_fin_enfant,
    	'Diagnostic_psy_enfant' => $Diagnostic_psy_enfant,
    	'Diagnostic_cria_enfant' => $Diagnostic_cria_enfant,
    	'Infos_medicales_enfant' => $Infos_medicales_enfant,
    	'Suivi_externe_enfant' => $Suivi_externe_enfant,
    	'Suivi_interne_enfant' => $Suivi_interne_enfant	
    	));
    ...autant je ne vois pas où placer la boucle pour parcourir tout le tableau...merci pour votre aide.

    Jérôme

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Dans la discussion précédente, je t'ai donné un lien vers une discussion qui indique comment utiliser les requêtes préparées.

    Donc tu fais le "prepare" hors de la boucle et le "execute" dans la boucle.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Merci CinePhil pour ton indication sur la boucle...et il est vrai que j'ai regardé d'un peu trop loin ton lien sur les requêtes préparées...je m'y mets pour essayer de piger le truc.

    Encore un grand merci à vous deux pour votre aide.
    @+
    Jérôme

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Voilà le code suivant qui indique comment on effectue une requête INSERT en y substituant un nom et une valeur pour les marqueurs nommés (cf site php.net) :

    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
     
    <?php
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
     
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
     
    // insertion d'une ligne
    $name = 'one';
    $value = 1;
    $stmt->execute();
     
    // insertion d'une autre ligne avec des valeurs différentes
    $name = 'two';
    $value = 2;
    $stmt->execute();
    ?>
    Je vois bien l'insertion des deux lignes et c'est là que je fais ma boucle while...mais pourriez-vous m'indiquer le code à réaliser...je n'ai pas trouver d'exemples prècis

    Merci
    @+
    Jérôme

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Il faut te mâcher le boulot toi !

    Tu démarres la boucle sur ton tableau entre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req = $bdd->prepare('UPDATE ime_enfant SET
    nom_enfant = :nom_enfant,
    prenom_enfant = :prenom_enfant,
    DDN_enfant = :DDN_enfant,
    // ...
    et cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req->execute(array(
    	'nom_enfant' => $nom_enfant,
    	'prenom_enfant' => $prenom_enfant,
    	'num_enfant' => $num_enfant,
    // ...
    Et bien sûr tu fermes la boucle après !
    Et n'oublie pas avant le "prepare" le paramètre marqué dans le lien que je t'ai donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Il faut te mâcher le boulot toi !
    Excuse moi d'être une vraie "buse" mais je ne sais pas comment m'y prendre...c'est pas pour vous faire chier mais je développe cette petite application bénévolement et je débute en php !

    Je vais essayer...je vous tiens au courant

    Merci
    @+
    Jérôme

  14. #14
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonsoir à tous,
    Toujours en galère avec cette @@@@@ de boucle...
    Quelqu'un peut il me mettre sur la piste...

    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
     
    <?php
     
    session_start();
    if (isset($_SESSION['user']) && (!empty($_SESSION['user'])))
    {
     
    include('../param_conn.php');
     
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
    $req = $bdd->prepare('UPDATE ime_constituer SET
    num_enfant_C = :num_enfant_C,
    num_item_C = :num_item_C,
    num_exercice_C = :num_exercice_C,
    guidance_C = :guidance_C,
    obs_C = :obs_C');
     
    //ici la boucle...mais de quel type ??? comment ??? quelqu'un peut-m'aider SVP...
     
    $req->execute(array(
    	'num_enfant_C' => $num_enfant_C,
    	'num_item_C' => $num_item_C,
    	'num_exercice_C' => $num_exercice_C,
    	'guidance_C' => $guidance_C,
    	'obs_C' => $obs_C	
    	));
     
    header('Location: index.php');
     
    }
    else
    {
    // pas de login en session : proposer la connexion
    echo '<a href="../identification.php" title="Accès à la page de connexion">Connexion</a>';
    }
     
    ?>
    @+
    Jérôme

  15. #15
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bon, j'ai un peu progressé mais il me reste un problème qui je crois est simple à résoudre mais je bloque et j'ai besoin d'un oeil neuf.
    Comment je formatte le tableau ?

    Par exemple :
    $_POST['$ime[$i]$num_enfant'] n'est pas bon...

    Pouvez-vous m'aider ?
    Merci
    Jérôme



    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
     
    <?php
     
    	session_start();
    	if (isset($_SESSION['user']) && (!empty($_SESSION['user'])))
    	{
     
    include('../param_conn.php');
     
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
    $req = $bdd->prepare('UPDATE ime_constituer SET
    num_enfant_C = :num_enfant_C,
    num_item_C = :num_item_C,
    num_exercice_C = :num_exercice_C,
    guidance_C = :guidance_C,
    obs_C = :obs_C');
     
    $i=0;
    while ($i < $_POST['nb_post'])
    {
     
    $req->execute(array(
    	'num_enfant_C' => $_POST['$ime[$i]$num_enfant'],
    	'num_item_C' => $_POST['ime[$i]num_item'],
    	'num_exercice_C' => $_POST['ime[$i]num_exercice'],
    	'guidance_C' => $_POST['ime[$i]guidance_C'],
    	'obs_C' => $_POST['ime[$i]observations']	
    	));
     
    $i++;
    }
     
    //header('Location: index.php');
     
    }
    	else
    	{
    		// pas de login en session : proposer la connexion
    		echo '<a href="../identification.php" title="Accès à la page de connexion">Connexion</a>';
    	}
     
    ?>

  16. #16
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour à tous,
    Voilà j'ai presque réussi à faire fonctionner mon code ci-dessous...

    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
     
    <?php
     
    	session_start();
    	if (isset($_SESSION['user']) && (!empty($_SESSION['user'])))
    	{
     
    include('../param_conn.php');
     
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
    $req = $bdd->prepare('UPDATE ime_constituer SET
    num_enfant_C = :num_enfant_C,
    num_item_C = :num_item_C,
    num_exercice_C = :num_exercice_C,
    guidance_C = :guidance_C,
    obs_C = :obs_C WHERE num_enfant_C = :num_enfant_C and num_item_C = :num_item_C and num_exercice_C = :num_exercice_C
    ');
     
    $i=0;
    while ($i < $_POST['nb_post'])
    {
     
    $req->execute(array(
    	'num_enfant_C' => $_POST['ime'][$i]['num_enfant'],
    	'num_item_C' => $_POST['ime'][$i]['num_item'],
    	'num_exercice_C' => $_POST['ime'][$i]['num_exercice'],
    	'guidance_C' => $_POST['ime'][$i]['guidance_C'],
    	'obs_C' => $_POST['ime'][$i]['observations']	
    	));
     
    $i++;
    }
     
    //header('Location: index.php');
     
    }
    	else
    	{
    		// pas de login en session : proposer la connexion
    		echo '<a href="../identification.php" title="Accès à la page de connexion">Connexion</a>';
    	}
     
    ?>
    ... mais il me renvoi l'erreur suivante :

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' in C:\wamp\www\imebaobab\evaluation\evaluation_cible.php on line 29

    PDOException: SQLSTATE[HY093]: Invalid parameter number in C:\wamp\www\imebaobab\evaluation\evaluation_cible.php on line 29
    Si quelqu'un a une idée je suis preneur...merci
    @+
    Jérôme

  17. #17
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Pas sûr que ce soit la cause de l'erreur mais ta requête ne va pas :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE ime_constituer 
    SET
        num_enfant_C = :num_enfant_C,
        num_item_C = :num_item_C,
        num_exercice_C = :num_exercice_C,
        guidance_C = :guidance_C,
        obs_C = :obs_C 
    WHERE num_enfant_C = :num_enfant_C 
        and num_item_C = :num_item_C 
        and num_exercice_C = :num_exercice_C
    Tu demandes à mettre à jour avec des valeurs qui sont celles qui te servent à sélectionner les lignes de la tables qui doivent être mises à jour.
    Dans ta requête, il n'y a que "guidance_C" et "obs_C" qui peuvent changer de valeur !

    Si tu sélectionnes les lignes avec les conditions que tu a mises dans le WHERE, supprime ces colonnes du SET :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE ime_constituer 
    SET
        guidance_C = :guidance_C,
        obs_C = :obs_C 
    WHERE 
        num_enfant_C = :num_enfant_C 
        and num_item_C = :num_item_C 
        and num_exercice_C = :num_exercice_C
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  18. #18
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Merci CinePhil pour ta solution, je venais juste de me rendre compte de ce problème avec un autre code que j'avais déjà fait.
    Maintenant ma page fonctionne nickel.
    Encore un grand merci à tous ceux qui m'ont aidé à réaliser ce travail.
    @+
    Jérôme

    PS : Pour info je remets le code (cela peut toujours servir à quelqu'un) :

    Le formulaire de départ :
    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
    69
    70
    71
    72
    73
    74
    75
    76
     
    <form method="post" action="evaluation_cible.php">
     
    <p>
        <table align=center border="1" cellpadding="10" cellspacing="5">
    		<tr>
    			<td>Items</td>
    			<td>Exercices</td>
    			<td>Tranche d'âge</td>
    			<td>Choix d'une guidance</td>
    			<td>Observations</td>
    		</tr>
     
    		<?php
    		$j = 0;
    		$i = 0;
    		$nb_post = 0;
    		$ime = array(array()) ;
    		while ($donnees = $req->fetch()):
    		$nb_post++;
    		?>
     
    		<tr class="prem <?php echo ( ($j % 2 == 0) ? 'classe1' : 'classe2' ) ?>">
    		<?php $j++;?>
     
    		<input type="hidden" name="ime[<?php echo $i ?>][num_enfant]" value="<?php echo $donnees['num_enfant_C']; ?>" />
     
    		<td><input type="hidden" name="ime[<?php echo $i ?>][num_item]" value="<?php echo $donnees['num_item_exercice']; ?>" />
    		<?php echo $donnees['nom_item'];?></td>
     
    		<td><input type="hidden" name="ime[<?php echo $i ?>][num_exercice]" value="<?php echo $donnees['num_exercice']; ?>" />
    			<?php echo $donnees['num_exercice']?> - <?php echo $donnees['nom_exercice']?></td>
     
    		<td><input type="hidden" name="ime[<?php echo $i ?>][nom_age]" value="<?php echo $donnees['nom_age']; ?>" />
    		<?php echo $donnees['nom_age'];?></td>
     
    		<td>
    			<select name="ime[<?php echo $i ?>][guidance_C]">
    				<?php
    				$req_option = $bdd->prepare('SELECT * FROM ime_param');
    				$req_option->execute(array());
    				while ($donnee = $req_option->fetch())
    				{
    				if ($donnee['guidance_param'] == $donnees['guidance_C'])
    				{
    				?>
    				<option value="<?php echo $donnees['guidance_C'];?>" selected><?php echo $donnee['nom_guidance']; ?></option>
    				<?php
    				}
    				else
    				{
    				?>
    				<option value="<?php echo $donnee['guidance_param']; ?>"><?php echo $donnee['nom_guidance']; ?></option>
    				<?php
    				}
    				}
    				?>
    			</select>
    		</td>
    		<td><textarea rows="2" cols="20" name="ime[<?php echo $i ?>][observations]"></textarea></td>
    	</tr>
    	<?php $i++; ?>
    <?php endwhile;
     
    		$req->closeCursor();
    		?>
    		<input type="hidden" name="nb_post" value="<?php echo $nb_post ?>" />
    		</tr>
    		<tr>
    			<td><input type="button" value="RETOUR" align=right onClick="history.back()" /></td>
    			<td><button onClick="return confirm('Confirmer votre modification ?'); return false;">SAUVEGARDER</button></td>
    		</tr>
    	</table>
    </p>
     
    </form>
    Le code qui traite le tableau ime :

    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
     
    <?php
     
    	session_start();
    	if (isset($_SESSION['user']) && (!empty($_SESSION['user'])))
    	{
     
    include('../param_conn.php');
     
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
    $req = $bdd->prepare('UPDATE ime_constituer SET
    
    guidance_C = :guidance_C,
    obs_C = :obs_C
    WHERE num_enfant_C = :num_enfant_C
    and num_item_C = :num_item_C
    and num_exercice_C = :num_exercice_C
    ');
     
    $i=0;
    while ($i < $_POST['nb_post'])
    {
     
    $req->execute(array(
    	'num_enfant_C' => $_POST['ime'][$i]['num_enfant'],
    	'num_item_C' => $_POST['ime'][$i]['num_item'],
    	'num_exercice_C' => $_POST['ime'][$i]['num_exercice'],
    	'guidance_C' => $_POST['ime'][$i]['guidance_C'],
    	'obs_C' => $_POST['ime'][$i]['observations']	
    	));
     
    $i++;
    }
     
    header('Location: enfant_item_evaluation.php?num_enfant=');
     
    }
    	else
    	{
    		// pas de login en session : proposer la connexion
    		echo '<a href="../identification.php" title="Accès à la page de connexion">Connexion</a>';
    	}
     
    ?>

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

Discussions similaires

  1. Insert ou Update lignes multiples
    Par DeWaRs dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/05/2012, 17h49
  2. trigger "update sur insert" avec insertion multiple
    Par harf18 dans le forum Développement
    Réponses: 4
    Dernier message: 18/05/2009, 14h46
  3. MySQL - Update et insert Multiple
    Par mastronic dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2006, 09h28
  4. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53

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