Checkboxs non cochées... de noms inconnus

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 : Checkboxs non cochées... de noms inconnus

Re: Checkboxs non cochées... de noms inconnus

par smashcfr » 05 juin 2012, 22:45

C'est fait et tout marche, merci :).

Re: Checkboxs non cochées... de noms inconnus

par smashcfr » 05 juin 2012, 19:24

Merci pour ces deux réponses !

Par rapport à ça

=> Ok pour le HTML. J'ai trouvé un doc de transition de html vers xhtml. Ca permettra de me mettre à jour et de revoir un peu mon code pour qu'il soit bon.

=> Pour les autres commentaires, c'est vrai que je me suis peut être un peu enfermé dans la "checkbox".
Passer en bouton radio me semble pas mal (Liste déroulante aussi, mais moins pratique).
Je vais creuser la piste de :
- Nommer chaque doublette de boutons radio (ok / nok) avec le nom du champ de la bdd => En récupérant le nom des séries de boutons radio, je pourrai ainsi peut être re-fabriquer ma requête SQL.
- Utiliser les valeurs des boutons radios avec les valeurs à réinjecter dans la bdd => Et donc compléter la requête.
Ca me donnera une base pour une fonction "générique" pouvant être réutilisée depuis plusieurs endroits du site pour mettre à jour la table à partir de formulaires...

A creuser !

Re: Checkboxs non cochées... de noms inconnus

par Mazarini » 05 juin 2012, 08:01

Si la valeur de la checkbox n'a pas d'importance (attribut value) et que seul le caractère coché ou non compte, il suffit de prendre isset($_POST['maCheckbox']) comme valeur. On a ainsi vrai si coché et faux sinon.

$maCheckbox = isset($_POST['maCheckbox']);

Autrement <br> ou <br /> dépend de la norme choisit pour faire ces pages xhtml demandant de fermer toutes les balises mais pas html.

Re: Checkboxs non cochées... de noms inconnus

par sirakawa » 05 juin 2012, 07:09

Diverses remarques :
  • dans le code HTML,
    • les majuscules sont exclues depuis un bon moment
      <input ..... > devient <input .... />
      
      <br> devient <br />
      
  • dans le formulaire
    • est-il nécessaire de passer par des checkbox ? parce que des boutons radio, au moins on est sûr qu'une des deux valeurs est sélectionnée.
    • je trouve qu'il serait plus clair de constituer une chaîne comme ceci:
      $table = "<table......>";
      $checked_1 = ($alerole1) ? "checked = checked" : "";
      $role_1 =  "<input type = 'checkbox'  name= 'roles[]' $checked_1 />"; 
      ...
      $table .= $role_1;
      print "$table";
      
  • dans le script qui reçoit
pour chaque checkbox:
$valeur = (isset($_POST['nom_de_var']) ? $_POST['nom_de_var'] : 0;

Checkboxs non cochées... de noms inconnus

par smashcfr » 04 juin 2012, 23:00

Bonsoir,

J'ai trouvé pas mal de choses sur le net, mais rien qui me permette de résoudre mon énigme.
Pour l'instant je ne me suis pas penché sur la présentation (donc emploi d'une table html) ni sur ma séparation traitement/présentation.

Objectif : A partir d'une form, récupérer les checkboxs cochés ET non cochés, et les noms correspondants (le nom d'une checkbox est le nom du champ dans la bdd), ce pour me permettre de faire directement mon update de table dans le fichier qui réceptionne les données.

Problème... Une checkbox non cochée n'existe pas, et n'est pas passée à la page d'après. Du coup, pas possible de repasser facilement dans la bdd un champ à 0 si on ne sait pas lequel...

Question : quelqu'un aurait-il une piste pour réaliser cela simplement, oui suis-je obligé de tester champ par champ (Le but serait, en cas de modif du formulaire, d'éviter d'avoir à refaire le fichier qui réceptionne les données... Et même mieux, pourquoi pas ensuite faire du fichier un endroit qui réceptionne les données de formulaires divers, et qui est capable de les traiter sans redonner les champs concernés) ?

Les fichiers :

Fichier construisant le formulaire :
<?php
if(isset($_SESSION) and array_key_exists('id_ok',$_SESSION) and $droits_user -> aledroit(4) == true) 
{
	// Affichage du menu
	include ($listeroutes -> getemplacement("gene_menu_admin"));
	
	// On va chercher l'id de l'utilisateur à considérer : 
	$userid = $_GET['numuser'];
	
	// Instanciation d'une classe.
	$administre_user = new controle_acces($req_sql, $userid);
	
	// On récupère tous les rôles actuels
	$tous_roles = $administre_user -> recup_tous_roles();
	
	// Nombre de rôles existants
	$nbroles = count($tous_roles);
	
	//$nbroles = count($administre_user -> roles_user);
	
	// Implémentation du formulaire, avec l'état de validation de l'utilisateur, les rôles possibles et ceux qu'il a.
	//$valide = $administre_user -> isvalide;
	echo "<BR>";
	echo "<FORM method=post action='".$listeroutes -> geturl('gene_admin_modif_droits').'&numuser='.$_GET['numuser'].'&nbroles='.$nbroles."'>";
		echo "<TABLE BORDER=1>";
			echo "<TR>";
				echo "<TD>Validation</TD>";	
				echo "<TD colspan=2><INPUT type=checkbox name=tab[id] value=1";
				if ($administre_user -> isvalide == 1) 
				{
					echo " checked";
				}
				echo "></TD>"; 
			echo "</TR>";
			echo "<TR>";
				echo "<TD>";
					echo "Nom du rôle";
				echo "</TD>";
				echo "<TD>";
					echo "Rôle accordé ?";
				echo "</TD>";
				echo "<TD>";
					echo "liste des droits associés";
				echo "</TD>";				
			echo "</TR>";
			// On crée une ligne par rôle existant.
			// 1ere cellule, on indique le rôle.
			// 2e cellule, on indique si l'utilisateur a le rôle en question par une case à cocher.
			// 3e cellule, on indique les permissions correspondantes du rôle.
			for ($i = 0; $i < $nbroles; $i++)
			{
				echo "<TR>";
					echo "<TD>";
						echo $tous_roles[$i][1];
					echo "</TD>";
					echo "<TD align='center'><INPUT type=checkbox name=tab[".$tous_roles[$i][1]."] value=1";
					if ($administre_user -> alerole($tous_roles[$i][0]) == true) 
					{
						// Si l'utilisateur a le rôle évalué, alors on coche la case.
						echo " checked";
					}
					echo "></TD>"; 
					echo "<TD>";
						$perms = NULL;
						$perms = $administre_user -> recup_perms_role($tous_roles[$i][0]);
						$nbperms = count($perms);
						for ($ind = 0; $ind < $nbperms; $ind++)
						{
							echo $perms[$ind][1]."<BR>";
						}
					echo "</TD>"; 				
				echo "</TR>";	
			}
		echo "</TABLE>";
		echo "<BR><INPUT type='submit' value='Valider' />";
	echo "</FORM>";

}
else
{
	// L'utilisateur n'a pas le droit d'accéder à la page.
	include ($listeroutes -> getemplacement("pasledroit"));
}
?>
Fichier réceptionnant les données :
<?php

// On va récupérer les valeurs de la page précédente, puis effectuer les modifications dans la base de données.
// Pour cela, aller chercher l'id de l'utilisateur concerné.
// Mettre à jour la base de données.

$iduser = $_GET['numuser'];
$nbroles = $_GET['nbroles'];


/*foreach ($_POST as $index=>$valeur)
{
	echo $index;
	echo $valeur;	
}*/

foreach($_POST['tab'] as $index=>$case)
{
	echo $index;
	echo $case;
}

echo "fait";
?>
Extrait de la classe qui permet de construire le nom des checkboxs :
//...
	private function get_roles()
	{	
		// Fonction ramenant l'ensemble des rôles d'un utilisateur.
		// param = 0 => Rôles de l'utilisateur
		// param = 1 => Tous les rôles
		switch ($this -> param)
		{
			case 0:
				$this -> requete = "SELECT gen_user_roles.id_role, nom_role FROM gen_user_roles inner join gen_roles on gen_user_roles.id_role = gen_roles.id_role WHERE id_user = ".$this -> iduser;				
				break;
			case 1:
				$this -> requete = "SELECT id_role, nom_role FROM gen_roles";
				break;
		}
		$this -> retour = $this -> connexion_mysql -> selectionner($this -> requete);
		
		$this -> ind = 0;		
		
		switch ($this -> param)
		{
			case 0:					
				while ($this -> ligne = $this -> retour -> fetch())
				{
					$this -> roles_user[$this -> ind][0] = $this -> ligne -> id_role;
					$this -> roles_user[$this -> ind][1] = $this -> ligne -> nom_role;						
					$this -> ind = $this -> ind + 1;
				}			
				return $this -> roles_user;
				break;
			case 1:
				while ($this -> ligne = $this -> retour -> fetch())
				{
					$this -> liste_roles[$this -> ind][0] = $this -> ligne -> id_role;
					$this -> liste_roles[$this -> ind][1] = $this -> ligne -> nom_role;						
					$this -> ind = $this -> ind + 1;
				}
				return $this -> liste_roles;
				break;
		}
	}


	public function recup_tous_roles()
	{
		// On récupère tous les rôles
		$this -> param = 1;
		$this -> liste_roles = $this -> get_roles();
		return $this -> liste_roles;
	}


Si je n'ai pas été clair, n'hésitez pas... Merci !