Utilisation de formulaires dans des tupples SQL

Eléphanteau du PHP | 13 Messages

27 déc. 2011, 17:26

Bonjour,
Dans le cadre de la création d'un site informatique, je fais un module d'inscription, je crée donc une page qui permet à l'administrateur de recevoir les différentes demandes d'inscriptions préalablement mises dans une table et qu'il puisse valider ou refuser l’inscription.
La validation amène à la création d'un tupple dans la table utilisateur et la destruction de celui dans 'deminscription', le refus amène à la simple destruction du tupple contenu dans la table 'deminscription'.
Ce que j'ai fait ne marche pas, j'imagine que le problème vient de la création des formulaires avec un même nom dans la boucle
Voilà ce que j'ai, merci de m'aiguiller !

Code : Tout sélectionner

<?php $db_conn = mysql_connect("localhost","root","") or die (mysql_error()); mysql_select_db("lif4",$db_conn) or die (mysql_error()); ?> <html> <head> <title>Gestion des Inscriptions</title> </head> <body> <h2><center>Demandes d'Inscription</center></h2> <br> <?php $requete =" SELECT * FROM deminscription"; $resultat = mysql_query($requete) or die(mysql_error()); print "<ul>\n"; while ($nuplet = mysql_fetch_assoc($resultat)) { print "<li> ".$nuplet['nom']." ".$nuplet['prenom']." ".$nuplet['login']." ".$nuplet['motdepasse']." ".$nuplet['type']; print "</li>"; print '<form method="POST" action="Inscription.php"> <input type="submit" name="Valide" Value="Valider"> <input type="submit" name="Refus" Value="Refuser"> '; } print "</ul>"; if( !empty($_POST['Refus']) ){ $nom=$_POST['nom']; $requete=" DELETE FROM deminscription WHERE nom = '".$nom."' "; $resultat = mysql_query($requete) or die(mysql_error()); } if( !empty($_POST['Valide']) ){ $nom=$_POST['nom']; $prenom=$_POST['prenom']; $login=$_POST['login']; $motdepasse=$_POST['motdepasse']; $type=$_POST['type']; $requete=" INSERT INTO utilisateur(nom,prenom,login,password,usager) Values ('".$nom."', '".$prenom."','".$login."','".$motdepasse."','".$type."') "; $resultat = mysql_query($requete) or die(mysql_error()); $requete =" DELETE FROM deminscription WHERE nom = '".$nom."' "; $resultat = mysql_query($requete) or die(mysql_error()); } ?> </body> </html>

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 17:45

$nom=$_POST['nom'];
   $prenom=$_POST['prenom'];
   $login=$_POST['login'];
   $motdepasse=$_POST['motdepasse'];
   $type=$_POST['type'];
Cela vient d'où ça ? ^^
Tu n'as aucun formulaire envoyant ces valeurs. ;)

Mais le mieux serait d'envoyer grâce au formulaire la valeur de la clé primaire du tuple et de refaire une requête avant l'update pour récupérer les données.

Eléphanteau du PHP | 13 Messages

27 déc. 2011, 17:49

ah oui, t'as raison !
et comment je fais ça ?

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 18:50

Tu inclus dans ton formulaire un champ caché par exemple :
echo '<input type="hidden" name="id" Value="' . $tuple['id'] . '">';

Eléphanteau du PHP | 13 Messages

27 déc. 2011, 19:27

D'accord mais comment je fais pour avoir la valeur de clé primaire ?

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 19:37

Question... Tu as une clé primaire dans ton schéma de table ?
Ou bien c'est une table avec des données en vrac ?

Eléphanteau du PHP | 13 Messages

27 déc. 2011, 19:46

C'est une table avec des données en vrac !
Mais je peux en mettre une si besoin est !

Eléphanteau du PHP | 13 Messages

28 déc. 2011, 11:01

Voilà, c'est fait, je fais quoi maintenant ?

ViPHP
xTG
ViPHP | 7331 Messages

28 déc. 2011, 11:32

Tu rajoutes le champ hidden avec l'id (ou bien tu le passes via la méthode GET dans l'url si tu préfères utiliser un lien plutôt qu'un formulaire).
Tu le récupères sur ton script de traitement et tu exécutes une requête pour récupérer les informations du tuple.
SELECT tesChamps FROM taTableDinscriptionEnAttente WHERE id = taVariableIdRécupérée
Puis tu fais ton INSERT avec le retour de la requête.
Ainsi c'est bien plus sûr et évite les erreurs de traitement.

Et saches qu'une table devrait toujours posséder une clé primaire, même si elle ne représente rien de cohérent avec les informations de son tuple.
Car lors d'une recherche ou d'une sélection la clé primaire qui est indexée permet une vitesse de traitement bien plus conséquente qu'avec des champs non indexés.

Eléphanteau du PHP | 13 Messages

28 déc. 2011, 11:54

Ok, merci pour l'aide, entre temps, j'ai fait ça, qu'en penses tu ?

Code : Tout sélectionner

$i=0; $requete =" SELECT * FROM deminscription"; $resultat = mysql_query($requete) or die(mysql_error()); print "<ul>\n"; while ($nuplet = mysql_fetch_assoc($resultat)) { print "<li> ".$nuplet['nom']." ".$nuplet['prenom']." ".$nuplet['login']." ".$nuplet['motdepasse']." ".$nuplet['type']; $nom[$i]=$nuplet['nom']; $prenom[$i]=$nuplet['prenom']; $login[$i]=$nuplet['login']; $motdepasse[$i]=$nuplet['motdepasse']; $type[$i]=$nuplet['type']; $i++; print "</li>"; print '<form method="POST" action="Inscription.php"> <input type="submit" name="Valide" Value="Valider"> <input type="submit" name="Refus" Value="Refuser"> '; } print "</ul>"; if( !empty($_POST['Refus']) ){ $requete=" DELETE FROM deminscription WHERE nom = '".$nom[$i]."' "; $resultat = mysql_query($requete) or die(mysql_error()); echo "pas lol"; } if( !empty($_POST['Valide']) ){ echo "lol"; $requete=" INSERT INTO utilisateur(nom,prenom,login,password,usager) Values ('".$nom[$i]."', '".$prenom[$i]."','".$login[$i]."','".$motdepasse[$i]."','".$type[$i]."') "; $resultat = mysql_query($requete) or die(mysql_error()); $requete =" DELETE FROM deminscription WHERE nom = '".$nom[$i]."' "; $resultat = mysql_query($requete) or die(mysql_error()); } ?>
Le problème est que chaque bouton de chaque tuple à le même nom, je ne sais pas comment faire pour le faire dépendre de la variable $i !

ViPHP
xTG
ViPHP | 7331 Messages

28 déc. 2011, 12:03

Quand tu insères des données dans une requête utilises la fonction mysql_real_escape_string() pour protéger les caractères spéciaux et éviter une erreur SQL.
Sinon ton histoire de $i revient au même que le traitement avec une clé primaire puisque ton indice i référence un seul et unique tuple, donc relis mon post.
Enfin si tu ne comptes pas faire une redirection à la fin de chaque requête il serait préférable de faire le traitement avant l'affichage, car sinon tu vas avoir une liste qui ne sera pas à jour. ;)

Eléphanteau du PHP | 13 Messages

28 déc. 2011, 12:13

Ah oui en effet, va falloir que je fasse une redirection.
Mais par contre je sais pas comment faire pour donner des noms différents aux différents formulaires type = submit !

ViPHP
xTG
ViPHP | 7331 Messages

28 déc. 2011, 13:10

C'est à dire ? Car tu leur donne déjà un attribut name différent dans ton code.