[résolu]Problème insertion tableau dans base

Eléphant du PHP | 103 Messages

20 mai 2011, 12:00

Bonjour les maîtres du PHP,

Je développe actuellement une application et j'ai un problème auquel je ne trouve pas de solution.

Sur une page php, l'utilisateur doit saisir un certain nombre de valeur numérique :

<td><input type="text" name="eval[]" id="eval[]" size="2" maxlength="1" tabindex="5" /></td>
?>
$_SESSION['id']=$donnees['id'];

Ensuite quand il clique sur valider, une page de traitement se lance et j'aimerai insérer les données qui ont été saisies dans une base de données mysql. Le problème c'est que je ne sais pas comment insérer mes données en fonction de l'id qui convient.

$eval=$_POST['eval'];

foreach($eval as $element)
{
echo $element;
// on se connecte à la base
$bdd->exec('UPDATE l_met_scomp SET precedent='.$element.' WHERE id='.$_SESSION['id'].'');
}

Le echo m'affiche bien les valeurs qui ont été saisies mais en revanche seul la dernière ligne est modifiée dans la base. Je pense qu'il faudrait faire un tableau avec les id et insérer les valeurs en fonction mais ca ferait une boucle dans une boucle... Enfin je sais pas.
Si quelqu'un a une idée je suis preneur.

Merci
Modifié en dernier par Jibe le 15 sept. 2011, 12:37, modifié 1 fois.

Mammouth du PHP | 672 Messages

20 mai 2011, 12:08

Bonjour.

1. Merci d'utiiser les balises qui vont bien pour ton code, ça sera plus lisible....

2.
Le echo m'affiche bien les valeurs qui ont été saisies mais en revanche seul la dernière ligne est modifiée dans la base. Je pense qu'il faudrait faire un tableau avec les id et insérer les valeurs en fonction mais ca ferait une boucle dans une boucle... Enfin je sais pas.
Tu peux t'amuser à afficher les requêtes, et le résultat :
foreach($eval as $element) {
   echo $element;
   // on se connecte à la base
   $requete = 'UPDATE l_met_scomp SET precedent='.$element.' WHERE id='.$_SESSION['id'].'';
   echo $requete.'<br />';
   $count = $bdd->exec($requete);
   echo "$count ligne(s) modifiée(s)<br />";
}
Ca devrait te donner un début d'explication :roll:

Eléphant du PHP | 103 Messages

20 mai 2011, 12:17

J'ai utlisé le code que tu m'as donné et ça m'affiche :

UPDATE l_met_scomp SET precedent=2 WHERE id=77
1 ligne(s) modifiée(s)
UPDATE l_met_scomp SET precedent=1 WHERE id=77
1 ligne(s) modifiée(s)
UPDATE l_met_scomp SET precedent=3 WHERE id=77
1 ligne(s) modifiée(s)
etc ...

Donc c'est bien un problème de l'identifiant mais je ne sais pas comment le gérer. Sur la première page je récupère bien l'identifiant mais à l’exécution de la requête seul le dernier est validé.

Mammouth du PHP | 672 Messages

20 mai 2011, 12:35

J'ai utlisé le code que tu m'as donné et ça m'affiche :

UPDATE l_met_scomp SET precedent=2 WHERE id=77
1 ligne(s) modifiée(s)
UPDATE l_met_scomp SET precedent=1 WHERE id=77
1 ligne(s) modifiée(s)
UPDATE l_met_scomp SET precedent=3 WHERE id=77
1 ligne(s) modifiée(s)
etc ...

Donc c'est bien un problème de l'identifiant mais je ne sais pas comment le gérer. Sur la première page je récupère bien l'identifiant mais à l’exécution de la requête seul le dernier est validé.
Tu comprends les requêtes ?
Tu peux les "passer" à la main, avec un papier et un crayon pour bien te rendre compte de ce que tu fais...
1. UPDATE l_met_scomp SET precedent=2 WHERE id=77
Modifie la table l_met_scomp, met la valeur 2 dans la colonne "precedent" sur la/les ligne(s) où id=77
2. UPDATE l_met_scomp SET precedent=1 WHERE id=77
Modifie la table l_met_scomp, met la valeur 1 dans la colonne "precedent" sur la/les ligne(s) où id=77
etc.
Au final, tu as bien mis à jour N fois ta table, mais toujours sur la/les même(s) ligne(s).
j'aimerai insérer les données qui ont été saisies dans une base de données mysql.
INSERER => INSERT
MODIFIER => UPDATE #-o

Eléphant du PHP | 103 Messages

20 mai 2011, 13:59

Je me suis mal exprimé, je veux mettre à jour et oui c'est justement ça qui me gène, c'est de mettre les différentes valeurs sur la même ligne.

Mammouth du PHP | 672 Messages

23 mai 2011, 09:30

Je me suis mal exprimé, je veux mettre à jour et oui c'est justement ça qui me gène, c'est de mettre les différentes valeurs sur la même ligne.
:shock:

La je ne comprends plus...
Comment est la structure de ta table ?
Que veux-tu faire ?
Tu pourrais donner un exemple de ce que tu veux faire ?

Eléphant du PHP | 103 Messages

23 mai 2011, 10:25

OK, je vais essayer d'expliquer clairement. Voici la structure de la table qui s'appelle l_met_scomp :

id | codemet | codecat | codescomp | niveau | precedent
1 | 2 | 2 | 1 | 4 | 0
2 | 2 | 2 | 2 | 3 | 0
3 | 2 | 3 | 3 | 2 | 0
4 | 2 | 3 | 4 | 2 | 0
5 | 3 | 1 | 2 | 3 | 0
6 | 3 | 1 | 4 | 3 | 0

Voilà le bout de code de la page ou l'utilisateur saisie les valeurs :
<tr>
 <th>Catégorie</th>
 <th>Compétences spécifiques</th>
 <th>Précédente</th>
 <th>Evaluation</th>
 <th>Cible</th>
</tr>
<?php
$req = $bdd->query('SELECT categorie.libcat, scompetence.libscomp, scompetence.defscomp, l_met_scomp.niveau, l_met_scomp.precedent, l_met_scomp.codecat, l_met_scomp.codescomp, l_met_scomp.id FROM categorie, scompetence, l_met_scomp, metier WHERE l_met_scomp.codemet = '.$_SESSION['met'].' AND l_met_scomp.codemet = metier.codemet AND	l_met_scomp.codecat = categorie.codecat AND l_met_scomp.codescomp = scompetence.codescomp');
while ($donnees = $req->fetch())
 {
?>
 <tr>
	<td><?php echo $donnees['libcat']; ?></td>
	<td><p onmouseover="montre('<?php echo addslashes($donnees['defscomp']); ?>');" onmouseout="cache();"><?php echo $donnees['libscomp']; ?></td>
	<td><?php echo $donnees['precedent']; ?></td>
	<td><input type="text" name="eval[]" id="eval[]" size="2" maxlength="1" tabindex="5" /></td>
	<td><?php echo $donnees['niveau']; ?></td>														
</tr>
<?php
$_SESSION['id']=$donnees['id'];
Donc là l'utilisateur saisie des valeurs sur la ligne <input type="text" name="eval[]" id="eval[]" size="2" maxlength="1" tabindex="5" />.

Ensuite, voilà le bout de code de la page qui fait la mise à jour dans la base :
$eval=$_POST['eval'];
foreach($eval as $element)
{
	echo $element.'<br /><br />';
				
	// On se connecte à MySQL
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$bdd = new PDO('mysql:host=localhost;dbname=test_stage', 'root', '*****', $pdo_options);
						
	$bdd->exec('UPDATE l_met_scomp SET precedent='.$element.' WHERE id='.$_SESSION['id'].'');
A l'éxécution de cette requête j'aimerai que les valeurs qui ont été saisies par l'utilisateur mettent à jour la colonne precedent pour les lignes concernées, hors seul la dernière ligne se met à jour.
Exemple avec la structure de la table que j'ai donné plus haut :
Le nombre de valeur à saisir dépend du métier, donc si on prend le métier qui a pour code 2, l'utilisateur devra saisir 4 valeurs.
Supposons qu'il saisisse 2, 4, 3 et 1, losrqu'il va cliquer sur le bouton valider, seule la dernière ligne (qui a pour identifiant 4 va se mettre à jour).

Voilà j'espère que c'est assez clair et que quelqu'un pourra m'aider.

Mammouth du PHP | 672 Messages

23 mai 2011, 13:35

Premier script :
while ($donnees = $req->fetch()) {
// ...
$_SESSION['id']=$donnees['id'];
$_SESSION['id'] va prendre la valeur de $donnees['id'] à chaque passagze dans ta boucle.
Avec ton exemple, il va donc valloir successivement 1, 2, 3 puis 4. A la fin du script il vaudra 4.

Deuxième script :
// $_SESSION['id] = 4, d'après le script précédent.
$eval=$_POST['eval']; // $eval = Array (2,4,3,1) d'après ton exemple
foreach($eval as $element) {
// ...
        $bdd->exec('UPDATE l_met_scomp SET precedent='.$element.' WHERE id='.$_SESSION['id'].'');
Ce que tu obtiens :

Code : Tout sélectionner

id | codemet | codecat | codescomp | niveau | precedent 1 | 2 | 2 | 1 | 4 | 0 2 | 2 | 2 | 2 | 3 | 0 3 | 2 | 3 | 3 | 2 | 0 4 | 2 | 3 | 4 | 2 | 1 (2 puis 4 puis 3 puis 1) 5 | 3 | 1 | 2 | 3 | 0 6 | 3 | 1 | 4 | 3 | 0
Ce que tu veux, si je comprends bien :

Code : Tout sélectionner

id | codemet | codecat | codescomp | niveau | precedent 1 | 2 | 2 | 1 | 4 | 2 2 | 2 | 2 | 2 | 3 | 4 3 | 2 | 3 | 3 | 2 | 3 4 | 2 | 3 | 4 | 2 | 1 5 | 3 | 1 | 2 | 3 | 0 6 | 3 | 1 | 4 | 3 | 0
Question : comment t'assurer de mettre le precedent au bon endroit ?
Réponse : tu dois avoir un moyen de retrouver de manière sure le bon enregistrement.

Par exemple :
while ($donnees = $req->fetch()) {
?>
 <tr>
        <td><?php echo $donnees['libcat']; ?></td>
        <td><p onmouseover="montre('<?php echo addslashes($donnees['defscomp']); ?>');" onmouseout="cache();"><?php echo $donnees['libscomp']; ?></td>
        <td><?php echo $donnees['precedent']; ?></td>
        <td><input type="text" name="eval[<?php echo $donnees['id'];?>]" id="eval[<?php echo $donnees['id'];?>]" size="2" maxlength="1" tabindex="5" /></td>
        <td><?php echo $donnees['niveau']; ?></td>                                                                                                             
</tr>
Tu récupèreras $eval (1 => 2, 2 => 4, 3 => 3, 4 => 1)
foreach($eval as $element => $valeur) {
        // On se connecte à MySQL
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
        $bdd = new PDO('mysql:host=localhost;dbname=test_stage', 'root', '*****', $pdo_options);
// La clause WHERE changera à chaque passage de la boucle...
        $bdd->exec('UPDATE l_met_scomp SET precedent='.$valeur.' WHERE id='.$element.'');

Eléphant du PHP | 103 Messages

23 mai 2011, 14:05

macgawel, tu es mon sauveur !!!

Tu as parfaitement bien compris mon problème et après avoir essayé le code que tu m'as donné, les valeurs se mettent à jour comme il faut dans ma table.

Je te remercie.