Récupérer plusieurs données d'un formulaire.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récupérer plusieurs données d'un formulaire.

par s3b54sk8 » 26 nov. 2005, 10:56

Mieux vaut tard que jamais, j'ai trouvé un moyen !!
// Place dans le tableau :
$t = 0;

//
// Dans ma boucle :
// 
while($data_bid = mysql_fetch_array($req_bid)){

	// Reste du code

	// Partie qui nous intéresse
	$ligne_bass .= '<td><input type="checkbox" name="supprimer['.$t.']" unchecked></td>';

	$t = $t+1;
}

//
// Dans le traitement
//

	// 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 />");
		}
		
  }

Voilà ca marche, mais si vous avez des idées d'amélioration je suis toujours preneur !! :D

par s3b54sk8 » 25 nov. 2005, 20:40

Personne ?

par s3b54sk8 » 24 nov. 2005, 20:50

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 ??

par s3b54sk8 » 24 nov. 2005, 20:30

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 ?

par mere-teresa » 22 nov. 2005, 18:33

Le extract() t'évitait de faire une boucle sur $_POST, qui est une variable de type tableau.

par s3b54sk8 » 22 nov. 2005, 18:26

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 :roll: :
	// 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...).

:cry:

par mere-teresa » 22 nov. 2005, 17:05

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 :)

par s3b54sk8 » 22 nov. 2005, 16:52

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

par mere-teresa » 22 nov. 2005, 16:41

@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 !

par s3b54sk8 » 22 nov. 2005, 16:26

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 ?

par s3b54sk8 » 22 nov. 2005, 16:03

@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 :P

Bon j'ai pas fini, au boulot !

par VaN » 22 nov. 2005, 15:54

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&eacute;servation <b># ".$un_id_res."</b> annul&eacute;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 :oops: )

par mere-teresa » 22 nov. 2005, 15:44

Et en faisant :
$pid = array();
$pid[] = $pid;

nb : c'est pas ton EXTR_OVERWRITE qui est en cause ? ?

par s3b54sk8 » 22 nov. 2005, 14:37

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 ?

par pitt » 21 nov. 2005, 10:09

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