Page 1 sur 1

Problème formulaire avec deux conditions

Posté : 25 oct. 2011, 23:49
par ecolom_be
Bonjour à tous,

je m'adresse à vous car j'ai un problème de compréhension concernant les conditions dans un formulaire de réservation de cours que je suis occupé à programmer.

Je galère depuis quelques heures via les tutorials pour que mon code soit correct mais malheureusement le débutant que je suis ne me permet pas de tout comprendre correctement.

En fait j'essaie de faire deux contrôles spécfiques lors de l'inscription dans mon formulaire.

Premier contrôle = verifier que la session n'est pas complète ( limite à 12 users)

Deuxième contrôle = verifier que le user ne s'est pas inscrit 2 fois.

Quand je teste mes codes séparéments, cela fonctionne très bien. Je reçois le message désiré.

Mais quand j'essaie de placer les deux codes en suivant, c'est la cata.

Pouvez-vous svp m'aider à comprendre ce qui ne focntionne pas dans mon programme. J'ai placé des else / elseif mais je ne trouve pas la bonne combinaison.

ci-dessous le bout de mon code. Merci pour l'aide ou indication que vous pourriez me transmettre.

// Verifie que les zones date de reservation et nom soient remplies
if ($_REQUEST['date_reservation'] != "" and $_REQUEST['name_users'] != "")
{
$sql = "SELECT * FROM int_org WHERE num_form='$date_reservation'";
$resultat = mysql_query ($sql);
if (mysql_num_rows($resultat) <12)
{
?>
<script language="JavaScript">
alert("La session est complète \n Veuillez choisir une autre date");
window.location.replace("index.php");// On inclut le formulaire d'identification
</script>
<?php

}
$sql1 = "SELECT * FROM int_org WHERE nom_users='$nom_users'";
$req1 = mysql_query ($sql1) or die ('erreur sql<br>'.$sql1.'<br>'.mysql_error());

//vérifie si le nombre de lignes trouvées est = 0 si oui, c'est que ce pseudo n'est pas encore utilisé => ok
if(mysql_num_rows($req1) == 0)
{
?>
<script language="JavaScript">
alert("Une réservation existe déjà à votre nom. \n Si vous désirez changer de date, veuillez contacter Kathy \n A booking already exists in your name. \n If you want to change the date, please contact Kathy");
window.location.replace("index.php");// On inclut le formulaire d'identification
</script>
<?php
}
else
{
$sql2 = "INSERT INTO int_org (date_encodage,
date_reservation,
num_form,
nom_users,
email_users
)
VALUES('$date_encodage',
'$date_reservation',
'$date_reservation',
'$nom_users',
'$email_users'
)";
$req2 = mysql_query($sql2) or die('Erreur SQL : <br />'.$sql2);
}
} // fin du else

Re: Problème formulaire avec deux conditions

Posté : 26 oct. 2011, 10:54
par moogli
salut,

on va prendre le taureau par les cornes.

tes requêtes SQL sont vraiment mal faites.
Pourquoi ?

simplement parce que l'on ne retourne une jeux de résultat de 12 lignes multiplié par le nombre de colonne de la table simplement pour savoir combien y a de ligne :)

pour cela il existe la fonction SQL count. un peu de littérature sur la chose => http://sqlpro.developpez.com/cours/sqlaz/ensembles/
globalement tu trouvera sur http://sqlpro.developpez.com tous ce qu'il y a, a savoir sur SQL :)

donc tes requêtes deviennent :
$sql = "SELECT count(*) as nombre FROM int_org WHERE num_form='$date_reservation'"
et
SELECT count(*) FROM int_org WHERE nom_users='$nom_users'"

dans les deux cas le jeux de résultat ne contient qu'une seul colonne qui aura pour nom "nombre" (par exemple avecun $data = mysql_fetch_assoc($retour_du_mysql_query); tu utilise $data['nombre'] qui va contenir le nombre de tuple que contient la table pour la date spécifiée.

avec cela tu peux utiliser la clause AND de SQL (dans la clause where) afin de coupler les conditions
par exemple : select count(*) as nombre where date ='truc' and user='machin'; si égale zéro : il est pas inscrit pour la session
la première requête ne change pas.
ça peux donner
<?php

// Verifie que les zones date de reservation et nom soient remplies
 if ($_REQUEST['date_reservation'] != "" and $_REQUEST['name_users'] != "")
 {
 $sql = "SELECT count(*) as nombre FROM int_org WHERE num_form='$date_reservation'";
 $resultat = mysql_query ($sql);
 $data = mysql_fetch_assoc($resultat);
 if ($data['nombre'] > 12) 
 {
 ?>
 <script language="JavaScript">
 alert("La session est complète \n Veuillez choisir une autre date");
 window.location.replace("index.php");// On inclut le formulaire d'identification
 </script>
 <?php

 }
 $sql1 = "SELECT count(*) as nombre FROM int_org WHERE nom_users='$nom_users'";
 $req1 = mysql_query ($sql1) or die ('erreur sql<br>'.$sql1.'<br>'.mysql_error());
$data = mysql_fetch_assoc($req1);
 //vérifie si le nombre de lignes trouvées est = 0 si oui, c'est que ce pseudo n'est pas encore utilisé => ok
 if($data['nombre'] != 0) // si met == 0 c'est que c'est bon donc pas de message d'erreur :)
 {
 ?>
 <script language="JavaScript">
 alert("Une réservation existe déjà à votre nom. \n Si vous désirez changer de date, veuillez contacter Kathy \n A booking already exists in your name. \n If you want to change the date, please contact Kathy");
 window.location.replace("index.php");// On inclut le formulaire d'identification
 </script>
 <?php
 }
 else
 {
 $sql2 = "INSERT INTO int_org (date_encodage,
 date_reservation,
 num_form,
 nom_users,
 email_users 
 ) 
 VALUES('$date_encodage',
 '$date_reservation',
 '$date_reservation',
 '$nom_users',
 '$email_users'
 )"; 
 $req2 = mysql_query($sql2) or die('Erreur SQL : 
'.$sql2);
 } 
} // fin du else
?>
ta condition du second if n'est pas bonne ;)

Je pense que ton système à un defaut de conception, ceci dit n'ayant pas la structure complète de la base je ne peux que supposer, donc a prendre avec des pincettes.

Si : une session continent 1 ou plusieurs cours
Si : un cours peux être dans une ou plusieurs session(s) (parce que je suppose que si tu propose un cours d'anglais ou math niveau 3ème y a des chances que le fasse plusieurs fois, enfin je te le souhaite :) )
La session ne peux contenir que 12 participants

une session c'est :
- une date (disons une date de début)
- un ou plusieurs cours (donc à définir)
- des participants.

Avec tous cela tu devrais avoir 5 tables.
- une table session avec un identifiant, une date, un nom et pourquoi pas une description
- une table cours, avec un identifiant, un nom et une description
- une table "stagiaires" (ou clients ou autres) avec un identifiant, un nom, une adresse etc etc
- une table qui permet la correspondance entre les sessions et les cours :! un identifiant, l'identifiant du cours, l'indentifiant de la session
- une table qui permet la correspondance entre les sessions et les stagiaires ; un identifiant, un identifiant session, identifiant stagiaire.

La tu va me dire, wé nan c'est le bordel ton truc :mrgreen:

Oui au première abord mais ça tu répond à ta problématique simplement.
tu peux aussi gérer sans soucis, les sessions (pas besoin de modifer 40000 tuples si tu change la date de la session).

tu ne risque pas d'insérer une date qui n'existe pas (imagine ton système avec un "num_formation" foireux (qui n'existe pas dans la table) et un user quelconque => insertion direct dans la base j'suis inscrit même si la formation n'existe pas :)
La avec le jeux des contraintes de clef étrangères (le fait de vérifier qu'une session existe avant de pouvoir l'insérer dans la table 5) empeche ce type de phénomène.

le système est aussi plus fexible, car tu peux modifier les coordonnées d'un stagiaire sans devoir recherche toute les occurrences et mettre (potentiellement) a jour une grosse quantité de ligne la table, la c'est une seule ligne de modifiée ;)

bref un bon modèle de base te sera utile autant en terme de maintenance que d'utilisation.

liens sur le sujet
modélisation à l'aide de la méthode merise (il s'agit que d'une partie, c'est plutôt le modèle entité - associations qui est ce que l'on recherche ici).
la méthode merise


bonne lecture ;)

@+

Re: Problème formulaire avec deux conditions

Posté : 26 oct. 2011, 23:29
par ecolom_be
merci moogli pour ta longue réponse.
Je l'ai dit j'suis perdu dans les conditions..je n'avais pas menti sur ce coup là :)

PAr contre tes indications m'ont rendu un peu plus intelligent sur le domaine.
En ce qui concerne mon programme, il s'agit d'un formulaire de réservation pour une formation spécifique.
Quand je parle de session, cela correspond à une date de formation.
J'ai 9 dates que je propose via un menu déroulant ( donc pas d'erreur de transcription )
J'ai aussi un menu déroulant pour les users ( alimenté par une DB users )

j'ai appliqué le code que tu as modifié et cela fonctionne presque... :?
En fait, quand je sélectionne un user qui s'est déjà enregistré, il me donne le message correct et réinitialise ma page.
Quand je sélectionne une date dont le nombre de personne est atteint ( 12 dans mon exemple ), il me donne le message mais continue à upgrader les users pour cette date.
Si j'ai un message qui signale que la formation est complète, il ne doit en aucun cas ajouter 13,14 ou + de réservation que ce qui est prévu.
Qu'est ce qu'il fait qu'il continue le script malgré le message et qu'il update la DB ?

Merci pour l'aide que vous voudrez bien m'apporter.

// Verifie que les zones date de reservation et nom soient remplies
		if ($_REQUEST['date_reservation'] != "" and $_REQUEST['name_users'] != "")
		{
				$sql = "SELECT count(*) as nombre FROM int_org WHERE num_form='$date_reservation'";
				$resultat = mysql_query ($sql);
				$data = mysql_fetch_assoc($resultat);
				if ($data['nombre'] > 12) 
			{
	?>
				<script language="JavaScript">
				alert("La session est complète \n Veuillez choisir une autre date");
				window.location.replace("index.php");
				</script>
	<?php
			}
				$sql1 = "SELECT count(*) as nombre FROM int_org WHERE nom_users='$nom_users'";
				$req1 = mysql_query ($sql1);
				$data = mysql_fetch_assoc($req1);
					//vérifie si le nombre de lignes trouvées est = 0 si oui, c'est que ce pseudo n'est pas encore utilisé => ok
					if($data['nombre'] != 0) 
			{
	?>
				<script language="JavaScript">
				alert("Une réservation existe déjà à votre nom. \n Si vous désirez changer de date, veuillez contacter Kathy \n A booking already exists in your name. \n If you want to change the date, please contact Kathy");
				window.location.replace("index.php");
				</script>
	<?php
			}
		else
			{			
				$sql2 = "INSERT INTO int_org (date_encodage,
											  date_reservation,
											  num_form,
											  nom_users,
											  email_users							
											  )											
													VALUES('$date_encodage',
														   '$date_reservation',
														   '$date_reservation',
														   '$nom_users',
														   '$email_users'
														   )";	
				$req2 = mysql_query($sql2) or die('Erreur SQL : <br />'.$sql2);
			}
	}

Re: Problème formulaire avec deux conditions

Posté : 27 oct. 2011, 13:32
par moogli
ben faut que tu mette le traitement dans un else sinon le if ne sert a rien ^^

if ( nom > 12 ){
pas bien
}
else {
traitement avant insertion
}

@+

Re: Problème formulaire avec deux conditions

Posté : 27 oct. 2011, 19:55
par ecolom_be
Bonsoir Moogli,

j'ai mis le else
je fais mes 2 contrôles et après j'ai le else
je ne comprends plus rien ...
Dans l'exemple que tu m'indiques il n'y a qu'un contrôle.
J'ai inscrit mon exemple ci-dessous mais le mien ne fonctionne pas.
Je galère pas mal avec ce code. J'ai tout essayé..en tout cas toutes les combinaisons possible de ma connaissance. :cry:
if ( nom > 12 ){
pas bien
}
if ( user < 0 dans ma DB)
{
re pas bien
}
else {

traitement avant insertion
}

Re: Problème formulaire avec deux conditions

Posté : 27 oct. 2011, 20:12
par moogli
alors qu'est ce qui se passe
if ( nom > 12 ){ // est ce que nom est supérieur à 12
 pas bien // ou boouuuuuu c'est pas bien
}

// a ben la je passe a autre chose qui n'a rien a voir

if ( user < 0 dans ma DB) // est ce que user est inférieur a zéro ? (plutot <= non car si zéro t'est aussi dans la mouise ?
{
 re pas bien // pas de bol
}
else {
// ha j'peux enfin bosser :)
 traitement avant insertion
}
bon c'est très imagé mais le principe est la :d

en gros si tu n'a pas de else à un if c'est que tu ne tiens pas compte du "inverse" de la condition et que le traitement ne se fait que pour la condition du if et que ce qui se passe après ne t'interesse pas.
or ce n'est pas le cas ici, il faut donc que le second couple if / else soit placer dans le else du 1er if :mrgreen:

bon je suis pas certain que se soit clair mon affaire demande si c'est mal expliqué :d

@+