Page 1 sur 2
Récupérer plusieurs données d'un formulaire.
Posté : 20 nov. 2005, 17:45
par s3b54sk8
Bonjour.
Voilà j'ai un formulaire qui me revnvoie les données de plusieurs enregistrement sur une même table genre :
Code : Tout sélectionner
|=====================|
| ID | Image | Place |
|=====================|
| 1 | x1.jpg | 1 |
| 2 | x2.jpg | 2 |
| 3 | x3.jpg | 3 |
|=====================|
ENVOYER
En ce qui concerne le champs Place, il me sert à mettre dans un certains ordre les images (dans ma requète SQL : ORDER BY Place), et dans le formulaire c'est un input type=text, seule données modifiable par le formulaire.
J'aimerais pouvoir modifier la place par exemple mettre dans le formulaire :
Code : Tout sélectionner
|=====================|
| ID | Image | Place |
|=====================|
| 1 | x1.jpg | 2 |
| 2 | x2.jpg | 3 |
| 3 | x3.jpg | 1 |
|=====================|
ENVOYER
Et que la requete sql m'enregistre ca au bon endroit. Mais le problème c'est que je vois pas du tout comment faire pour mettre à jour la base de donnée. Ca aurait été qu'un enregistrement ca va, mais comment en gérer plusieurs en même temps ?
J'ai pensé a une boucle mais le prob c'est qu'avec le nom des champs de formulaire qui sont les mêmes ca risque de poser problème.
Si quelqu'un pouvait me mettre sur la voix.

Posté : 21 nov. 2005, 10:09
par pitt
Tu peux donner un nom en fonction de l'id correspondante
<input type=\"text\" name=\"{$id}place\">
Ensuite pour traiter tu testes l'existence de la variable tu la recuperes et tu traites
Posté : 22 nov. 2005, 14:37
par s3b54sk8
J'ai essayé mais le formulaire ne renvoie à chaque fois qu'un seul enregistrement, alors qu'il devrait renvoyer les données des différentes lignes.
Ce que j'avais pensé faire :
// Récupération des informations envoyées par le formulaire :
extract($_POST,EXTR_OVERWRITE);
$pid = array($pid);
$place = array($place);
$url = array($url);
$nature = array($nature);
$comment = array($comment);
$supprimer = array($supprimer);
// On compte le nombre d'enregistrement
$compteur = count($pid);
echo("<PRE>".var_dump($compteur)."</PRE>");
// Bouble pour chacun des enregistrements
// for ...
Mais $compteur me renvoie à chaque fois "1" alors qu'il devrait m'envoyer le nombre d'image qui ont été affichée non ?
Posté : 22 nov. 2005, 15:44
par mere-teresa
Et en faisant :
$pid = array();
$pid[] = $pid;
nb : c'est pas ton EXTR_OVERWRITE qui est en cause ? ?
Posté : 22 nov. 2005, 15:54
par VaN
l'astuce réside dans l'utilisation du foreach() :
Voici un bout de code que j'utilise de plus en plus, et qui marche :
if (isset($_POST['id_res']))
{
$tab = $_POST['id_res'];
}
else
{
$tab = array();
}
foreach($tab as $un_id_res)
{
if (is_numeric($un_id_res))
{
// selection du nombre de pc réservés
$sql_pc = "SELECT nb_pc, id_soiree FROM calendar_reservation WHERE id_res='".$un_id_res."'";
$query_pc = mysql_query($sql_pc);
$result_pc = mysql_fetch_array($query_pc);
// suppression des pc réservés
$sql_pc2 = "SELECT pc_libres FROM calendar_soiree WHERE id_soiree='".$result_pc['id_soiree']."'";
$query_pc2 = mysql_query($sql_pc2);
$result_pc2 = mysql_fetch_array($query_pc2);
$pc_libres = $result_pc2['pc_libres'] + $result_pc['nb_pc'];
$sql_upd = "UPDATE calendar_soiree SET pc_libres='".$pc_libres."'";
$query_upd = mysql_query($sql_upd);
// suppression de la reservation dans la table calendar_reservation
$sql = "DELETE FROM calendar_reservation WHERE id_res='".$un_id_res."'";
$query = mysql_query($sql) OR die("Erreur :".mysql_error());
}
echo ("Réservation <b># ".$un_id_res."</b> annulée.<br /><br />");
}
sans oublier de spécifier le name de l'input de cette manière :
Code : Tout sélectionner
<input type="checkbox" name="id_res[]" value="<?php echo $result['id_res']; ?>">
Tiens nous au courant, et comprends la démarche avant de l'utiliser (j'hesite a chaque fois avant de fournir un code tout fait, par peur de me faire taper sur les doigts

)
Posté : 22 nov. 2005, 16:03
par s3b54sk8
@Mere_theresa :
J'utilise le "extract($_POST,EXTR_OVERWRITE);" pour récupérer mes données du formulaire en une fois, ca m'évite de faire "$var = $_POST['var'];" pour chaque champs.
@Van :
Ne t'inquiete pas, j'utilise pas un code que je comprends pas (sinon ca me sert à rien vu que j'arriverais pas à le refaire).
J'avais pensé au foreach() mais le problème venait surtout des noms des champs, je savais pas trop comment les gérer, étant donné que ca me renvoyait à chaque fois les données d'un seul champs (ce qui est logique en fait étant donné qu'ils avaient les mêmes noms pour les divers enregistrements).
Je teste ca et je tiens au courant
Edit : en rajoutant simplement "[]" à la fin du champs pid, compteur me renvoi bien le nombre d'image. Ca confirme que extract() n'était pas en cause
Bon j'ai pas fini, au boulot !
Posté : 22 nov. 2005, 16:26
par s3b54sk8
Juste une chose que j'ai pas compris, c'est à propos de la variable "$un_id_res". Ca correspond à la valeur entre [] des tableaux en fonction de celui de la variable donné en première?
Par exemple si $id[0] alors $autres_vars[0] automatiquement et on les notes seulement $autres_vars. C'est ca ?
Posté : 22 nov. 2005, 16:41
par mere-teresa
@Mere_teresa :
J'utilise le "extract($_POST,EXTR_OVERWRITE);" pour récupérer mes données du formulaire en une fois, ca m'évite de faire "$var = $_POST['var'];" pour chaque champs.
EXTR_OVERWRITE
Lors d'une collision, réécrire la variable existante.
http://fr.php.net/manual/fr/function.extract.php
Alors si dans ton tableau tu as plusieurs $sid, ils s'écrasent !
Posté : 22 nov. 2005, 16:52
par s3b54sk8
Oups

Bon je vais passer pas la définitions des variables via $_POST alors

Posté : 22 nov. 2005, 17:05
par mere-teresa
Ah et pour ta gouverne 
"en rajoutant simplement "[]" à la fin du champs pid" en fait, cela équivaut à :
$pid = array();
$pid[n] = $_POST['pid'];
Où n commence à 0 et s'incrément automatiquement 
Posté : 22 nov. 2005, 18:26
par s3b54sk8
Bon je dois être beubeu mais j'y arrive pas.
Au départ le compteur me donnait le bon nombre d'enregistrement et comme valeurs pour toutes les variables : Array.
Maintenant ca me donne plus qu'un seul enregistrement.
Mon code en l'état avec un essai pour url

:
// Récupération des informations envoyées par le formulaire :
$url = array($_POST['url']);
$url[] = $url;
$pid = array();
$pid[] = $pid;
$place = array();
$place[] = $place;
$nature = array();
$nature[] = $nature;
$comment = array();
$comment[] = $comment;
$supprimer = array();
$supprimer[] = $supprimer;
// On compte le nombre d'enregistrement
$compteur = count($pid);
echo("<PRE>".var_dump($compteur)."</PRE>");
// Bouble pour chacun des enregistrements
foreach($pid as $valeur){
echo($pid."/".$place."/".$url."/".$nature."/".$comment."/".$supprimer."<br />");
}
(J'ai changé les nom des champs aussi mais ca change rien...).

Posté : 22 nov. 2005, 18:33
par mere-teresa
Le extract() t'évitait de faire une boucle sur $_POST, qui est une variable de type tableau.
Posté : 24 nov. 2005, 20:30
par s3b54sk8
Bon mon code avance. Plutôt que d'utiliser
foreach(), j'utilise tout simplement
for() de la facon suivante :
// Récupération des informations envoyées par le formulaire :
$url = $_POST['url'];
$pid = $_POST['pid'];
$place = $_POST['place'];
$nature = $_POST['nature'];
$bass_id = $_POST['bass_id'];
$comment = $_POST['comment'];
$supprimer = $_POST['supprimer'];
// On compte le nombre d'enregistrement
$c = count($pid);
for ($i = 0; $i < $c; $i++) {
if(!empty($supprimer[$i])){
// Suppression du serveur
unlink("../../kbasse/photos/".$bass_id[$i]."/".$url[$i]);
// Suppression de la base de donnée
$sql_del = "DELETE FROM kah_img WHERE pid='".$pid[$i]."'";
$req_del = mysql_query($sql_del) or die('Erreur SQL !<br>'.$sql_del.'<br>'.mysql_error());
echo("Photo ".$pid[$i]." : Effacée<br />");
}
else{
$sql_up = "UPDATE kah_img SET place='".$place[$i]."', comment='".$comment[$i]."', nature='".$nature[$i]."' WHERE pid='".$pid[$i]."'";
$req_up = mysql_query($sql_up) or die('Erreur SQL !<br>'.$sql_up.'<br>'.mysql_error());
echo("Photo ".$pid[$i]." : Modifiée<br />");
}
}
Mais bon ca serait trop beau pour marcher sans problème... La modification ne pose pas de problème, ni la suppression de la base de donnée.
En revanche la suppression du serveur ne marche pas. L'erreur renvoyée est :
Code : Tout sélectionner
Warning: unlink(../../kbasse/photos/6/006_05_07.jpg): No such file or directory in /var/www/free.fr/c/5/s.herblot/kbasse/admin/mod_img.php on line 148
Pourtant à la racine du serveur il existe bien le fichier ./kbasse/photos/6/006_05_07.jpg... Donc je sais pas trop d'ou ca peut venir. Des idées ?
Posté : 24 nov. 2005, 20:50
par s3b54sk8
Oublions ce que j'ai dis, le script avait bien marché mais avait effacé toutes les photos d'un coup.
Maintenant ca à l'air de marché la suppression.. Mise à part que ca supprime pas la bonne photo.
Exemple :
J'ai 6 photos et je veux supprimer que la 5è.
Problème : mon code me supprime la première photo.
Cause : si j'ai bien bien tout compris, quand on a $tableau[$i] alors $i s'incrément automatiquement en fonction des enregistrements renvoyé par le formulaire en commencant par 0. Donc quand je coche la case de suppression de la photo 5, la valeur renvoyé par le formulaire est $suppression[0].. Or quand on traite les données par la suite, $i=0 pour la première photo donc c'est elle qui est supprimée...
Y'a pas une solution pour éviter ca ??
Posté : 25 nov. 2005, 20:40
par s3b54sk8
Personne ?