Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2006, 15h12   #1
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
Par défaut [Conception] condition et empty

bonjour,

j'ai essayé différentes solutions pour vérifier les variables d'un formulaire, mais rien n'y fait. Je ne comprends pas où est l'erreur, ca a l'air tout simple pourtant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
if (isset($_POST['ajouter']) && $_POST['ajouter'] == 'Ajouter') 
{//si le formulaire a bien été envoyé alors on teste le contenu et on vérifie l'existence des variables
if 
(// si il n'y a aucune variable définie
(isset($_POST['date11'])) && (empty($_POST['date11']))
&&
(isset($_POST['date12'])) && (empty($_POST['date12']))
&&
(isset($_POST['date13'])) && (empty($_POST['date13']))
) 
 
{
$erreur="merci de remplir au moins la première date";
}
else if 
(
(isset($_POST['date11'])) && (!empty($_POST['date11']))
&&
(isset($_POST['date12'])) && (!empty($_POST['date12']))
&&
(isset($_POST['date13'])) && (!empty($_POST['date13']))
) 
{
    	$jour10=mysql_real_escape_string(stripslashes($_POST['date11']));
		$mois1=mysql_real_escape_string(stripslashes($_POST['date12']));
		$annee1=mysql_real_escape_string(stripslashes($_POST['date13']));
		$horaires1=mysql_real_escape_string(stripslashes($_POST['horaires1']));
			$jour1=$annee1."-".$mois1."-".$jour10;			
}
j'ai un else if car j'en ai d'autres ensuite pour vérifier d'autres groupes de variables.

quand je clique sur envoyer, si je n'ai rempli aucun champ, il est envoyé quand même, mais rien n'est mis dasn la cellule,
et idem quand j'envoie après avoir rempli des variables : elles ne sont pas prises en compte.

si quelqu'un a la gentillesse de m'aider, ca m'évitera de devenir chauve avant la fin de la journée.
__________________
En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 15h46   #2
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Déjà utiliser isset et empty, c'est redondant. Si une variable n'est pas setté, elle est par définition empty().

Et je crois qu'il serait interessant que tu envoies le code complet de ta page, (au moins avec avec le formulaire).

Par exemple, as-tu essayé d'afficher tes variables ? Tu es sure que tes $_POST['datex'] sont bien remplis ?

--
Rakken
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 16h20   #3
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
c'est effectivement dans l'enchainement des if que j'ai dû faire une erreur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
<?php
session_start();
if (!isset($_SESSION['login'])) 
{
    header ('Location: guideindex1.php');
    exit();
}
else
{
$base = mysql_connect ('xxx', 'xxx', 'xxx');
mysql_select_db ('xxx', $base);
 
if (isset($_POST['ajouter']) && $_POST['ajouter'] == 'Ajouter') 
{//si le formulaire a bien été envoyé alors on teste le contenu et on vérifie l'existence des variables
 
if // si il n'y a aucune variable définie pour la première date
(
(isset($_POST['date11'])) && (empty($_POST['date11']))
&&
(isset($_POST['date12'])) && (empty($_POST['date12']))
&&
(isset($_POST['date13'])) && (empty($_POST['date13']))
) 
{
$erreur="merci de remplir au moins la première date";
}
else if 
(
(isset($_POST['date11'])) && (!empty($_POST['date11']))
&&
(isset($_POST['date12'])) && (!empty($_POST['date12']))
&&
(isset($_POST['date13'])) && (!empty($_POST['date13']))
) 
{
$jour10=mysql_real_escape_string(stripslashes($_POST['date11']));
$mois1=mysql_real_escape_string(stripslashes($_POST['date12']));
$annee1=mysql_real_escape_string(stripslashes($_POST['date13']));
$jour1=$annee1."-".$mois1."-".$jour10;			
}
 
else if // pour les dates 2,3,4,5
 
else
{
$erreur="les dates ont mal été saisies, merci de recommencer";
}
 
//on se connecte à notre base 
 
 
$sql = 'UPDATE guide1 SET jour1="'.$jour1.'", jour2="'.$jour2.'", jour3="'.$jour3.'", jour4="'.$jour4.'", jour5="'.$jour5.'" WHERE id="'.$_SESSION['idac'].'"'; 
 
//on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
 mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());        
 
//on ferme la connexion à la base
 
header ('Location: guideactivite_ajoutdateok1.php');
exit();
mysql_close();
}//fin le formulaire a bien été envoyé
}
?>

et pour le formulaire
Code :
1
2
3
4
5
6
7
8
9
<form name="Ajouter" action="guideactivites_ajoutdate1.php" method="post">
 
 
 <select name="date11" id="date11">
                <option value="" selected>Jour</option>
                <option value="01">1</option>
                <option value="02">2</option>// etc
   </select>
// etc pour les autres dates

merci beaucoup pour votre aide et votre patience.
__________________
En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 16h24   #4
Membre habitué
 
Inscription : mars 2003
Messages : 154
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 154
Points : 145
Points : 145
Envoyer un message via MSN à Orgied
bon, si j'étais toi, je travaillerai en sectorisant car un pâté de elseif, c'est jamais bon.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?
 
 if((!empty($annee1)) && (!empty($mois1)) && (!empty($jour1))) {
 
  print $erreur;
 
} else {
 
   $date = ...;
 
}
 
?>
et cela ainsi de suite, ce sera plus clair et tu t'y retrouveras surement mieux.
Orgied est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 16h27   #5
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
Citation:
Déjà utiliser isset et empty, c'est redondant
c'est pas tout à fait le cas.
parce que si je ne remplit pas de date dans son formulaire et j'envoi, isset va lui rendre true dans les trois champs malgré qu'ils sont vides et c'est ce qu'il ne veut pas traiter!!alors l'utilisation de isset n'est pas conseillé! moi je dirai plutot pq pas utiliser empty toute seule sans isset

Orgied a raison sauf que c'est plutot ca qu'il veut :
Code :
1
2
3
4
5
6
7
8
9
<?
 
 if(empty($annee1) && empty($mois1) && empty($jour1)) {
 
  print $erreur;
 
} else {
 
   $date = ...;
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 16h32   #6
Membre habitué
 
Inscription : mars 2003
Messages : 154
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 154
Points : 145
Points : 145
Envoyer un message via MSN à Orgied
Ouuuuuups désolé, j'ai tapé trop vite
Orgied est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 16h58   #7
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
merci de votre aide,

je n'ai pas compris pourquoi vous utilisiez empty avec $date plutôt qu'avec les variables POST_

j'ai essayé de simplifier au maximum, pour trouver le problème plus facilement, mais c'est toujours pris en compte, j'arrive sur guideactivite_ajoutdateok1.php au lieu d'avoir un message d'erreur affiché

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
<?php session_start();
if (!isset($_SESSION['login'])) 
{
    header ('Location: guideindex1.php');
    exit();
}
else
{
$base = mysql_connect ('xxx', 'xxx, 'xxx');
mysql_select_db ('xxx', $base);
 
if (isset($_POST['ajouter']) && $_POST['ajouter'] == 'Ajouter') 
{//si le formulaire a bien été envoyé alors on teste le contenu et on vérifie l'existence des variables
 
if // si il n'y a aucune variable définie
(
(empty($_POST['date11']))
&&
(empty($_POST['date12']))
&&
(empty($_POST['date13']))
) 
{
$erreur="merci de remplir au moins la première date";
print $erreur;
}
else
{$jour10=mysql_real_escape_string(stripslashes($_POST['date11']));
$mois1=mysql_real_escape_string(stripslashes($_POST['date12']));
$annee1=mysql_real_escape_string(stripslashes($_POST['date13']));
$jour1=$annee1."-".$mois1."-".$jour10;
}		
//on se connecte à notre base 
 
$sql = 'UPDATE guide1 SET jour1="'.$jour1.'" WHERE id="'.$_SESSION['idac'].'"'; 
 
//on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
 mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());        
 
//on ferme la connexion à la base
 
header ('Location: guideactivite_ajoutdateok1.php');
exit();
mysql_close();
}//fin le formulaire a bien été envoyé
}
?>
Orgied, je n'ai pas compris la "sectorisation", ca me semblait logique d'essayer de voir les 5 dates les unes après les autres
__________________
En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h08   #8
Membre régulier
 
Avatar de titoon
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 84
Points : 84
Je pense que tes accolades sont mal placées : quel que soit le résultat de la condition avec les empty, tu exécutes le code :
Code :
1
2
3
4
5
6
 
//on se connecte à notre base 
$sql = 'UPDATE guide1 SET jour1="'.$jour1.'" WHERE id="'.$_SESSION['idac'].'"'; 
// [...]  
header ('Location: guideactivite_ajoutdateok1.php');
// [...]
et donc, tu es redirigé sur guideactivite_ajoutdateok1.php !

Essayes d'enlever l'accolade en dessus de la ligne
Code :
1
2
 
$jour1=$annee1."-".$mois1."-".$jour10;
et de la mettre en dessous du exit()
titoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h12   #9
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
je vais revoir mes accolades tu as raison, mais celle ci je ne peux pas l'enlever, en fait je vérifie 5 groupes de 3 champs (5 dates où 1 champ = jour, 1=mois, 1= année) puis j'intégre ceux des 5x3 champs qui ont été remplis.
__________________
En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h19   #10
Membre régulier
 
Avatar de titoon
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 84
Points : 84
D'après ce que j'ai compris, la 1ère date est obligatoire mais pas les autres ?

Essayes une structure dans ce gout là :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if (formulaire validé) {
  if (NOT date 1 valide) {
    message erreur
  }
  else {
    if (date 2 valide) {
      maj date 2
    }
    ...
    redirection
  }
}
Egalement, indente ton code pour y voir un peu plus clair
titoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h21   #11
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par SegmentationFault
c'est pas tout à fait le cas.
parce que si je ne remplit pas de date dans son formulaire et j'envoi, isset va lui rendre true dans les trois champs malgré qu'ils sont vides et c'est ce qu'il ne veut pas traiter!!alors l'utilisation de isset n'est pas conseillé! moi je dirai plutot pq pas utiliser empty toute seule sans isset
Je ne suis pas d'accord non plus, avec l'un ou l'autre.

Le but de isset est de verifier qu'une variable existe, l'avantage de cette fonction est qu'elle permet de ne pas afficher une erreur "Undefined index" si on tente d'acceder a un index de tableau qui n'existe pas. Il faudrait donc tester empty en effet, mais "protégé" par un isset afin de ne pas lever l'exception si un petit malin s'amuse a attaquer la page en POST sans les variables (je suis d'accord, ca sert pas a grand chose, mais au moins le code est propre, ca montre que l'on sait ce que l'on fait).
Donc, pour résumer :

Code :
1
2
3
4
if (!isset($_POST['champ']) || empty($_POST['champ'] 
    || !isset($_POST['champ2']) || empty($_POST['champ2']) {
    echo "Champs manquants";
}
Listes des cas possibles :
* champ non défini : !isset renvoi TRUE, on execute pas le empty (TRUE OR X = TRUE, le champ est considéré comme vide)
* champ défini : !isset renvoi FALSE, on execute le empty :
* champ vide : empty renvoi TRUE : FALSE OR TRUE = TRUE, le champs est considéré comme vide)
* champ non vide : empty renvoi FALSE : FALSE OR FALSE = FALSE, le champs n'est pas considéré comme vide
Et on ajoute des || (et non des &&) entre les conditions pour verifier que TOUT les champs sont remplis... si tu utilise des &&, ca passera si tu as un seul champ rempli... au vu de ton code, je ne crois pas que ce soit ce que tu veuilles, car les 3 champs servent a construire une seule et meme date. Donc si il en manque une, tu aura une "portion de date" qui fera sans aucun doute planter la requete SQL derriere...
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h21   #12
Membre habitué
 
Inscription : mars 2003
Messages : 154
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 154
Points : 145
Points : 145
Envoyer un message via MSN à Orgied
si j'ai mis $date au lieu de $_POST, c juste pour taper moins de code...

une notion importante pour un développeur, c de pas trop en faire (wow je vais être hais ).
Orgied est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 17h55   #13
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
Citation:
Citation:
Je ne suis pas d'accord non plus, avec l'un ou l'autre.

Le but de isset est de verifier qu'une variable existe, l'avantage de cette fonction est qu'elle permet de ne pas afficher une erreur "Undefined index" si on tente d'acceder a un index de tableau qui n'existe pas. Il faudrait donc tester empty en effet, mais "protégé" par un isset afin de ne pas lever l'exception si un petit malin s'amuse a attaquer la page en POST sans les variables (je suis d'accord, ca sert pas a grand chose, mais au moins le code est propre, ca montre que l'on sait ce que l'on fait).
quand j'ai dis ca, je parlais pas de isset et empty d'une manière générale, mais je répondrai un cas précis mais je crois que tu l'as très bien compris.
Une autre chose: qu'est ce que ca peut nous faire que lquequ'un s'amuse à nous envoyer les variables POST sans valeurs, meme si on met pas isset? absolument rien, puisque il va voir afficher une exception et c tout. Par contre c assez interessant de l'utiliser dans d'autres cas, notamment si on a plusieurs formulaires dans la meme page (enfin je me comprend)
Citation:
Code :

Code :
if (!isset($_POST['champ']) || empty($_POST['champ'] || !isset($_POST['champ2']) || empty($_POST['champ2']) { echo "Champs manquants"; }
je crois que t'as pas trop fais attention à ce que la personne cherche à savoir (encore une fois)
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 19h39   #14
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par SegmentationFault
je crois que t'as pas trop fais attention à ce que la personne cherche à savoir (encore une fois)
ben quand je vois ca :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
// si il n'y a aucune variable définie
if ((empty($_POST['date11'])) && (empty($_POST['date12'])) && (empty($_POST['date13']))) {
   $erreur="merci de remplir au moins la première date";
   print $erreur;
} else {
   $jour10=mysql_real_escape_string(stripslashes($_POST['date11']));
   $mois1=mysql_real_escape_string(stripslashes($_POST['date12']));
   $annee1=mysql_real_escape_string(stripslashes($_POST['date13']));
   $jour1=$annee1."-".$mois1."-".$jour10;
}	
//on se connecte à notre base 
$sql = 'UPDATE guide1 SET jour1="'.$jour1.'" WHERE id="'.$_SESSION['idac'].'"';
je me dis que si date11, date12 OU date13 n'est pas renseigné, sa requete echouera, la condition devrait donc etre ET et non OU, ce n'est qu'une remarque au passage, mais bon quand meme.

Apres je suis d'accord, il y a aussi d'autres dates qui doivent etre gérées dans son probleme, mais commencons par gerer correctement une date avant d'etendre le processus ;o)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 10h29   #15
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
Merci beaucoup à vous tous

j'ai repris le problème à tête reposée, et effectivement j'avais une incompréhension totale de &&, qui aurait dû être ||

en plus

j'ai enlevé la vérification isset de chaque variable, en considérant que je demande au début si le formulaire a été envoyé. Donc si le formulaire est "ISSET" les variables le seront aussi. tandis que si je laisse cette vérification supplémentaire, ca ne fonctionne pas. J'ai juste vérifié si chaque variable n'est pas vide.

Merci vraiment pour toutes vos réponses qui m'ont beaucoup aidée.
__________________
En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h51.


 
 
 
 
Partenaires

Hébergement Web