[PHP] Conditions dans un include

Résolu/Fermé
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 - 20 oct. 2009 à 13:08
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 - 1 nov. 2009 à 22:27
Bonjour,

Pour accéder à mon site, le client doit entrer son nom et, s'il est membre son mot de passe, dans un champ puis valider.

Si son nom (et son mot de passe) sont reconnus (if ($_POST['i_nom'] == 'exemple' AND $_POST['password'] == 'exemple'), son nom est inscrit dans ma bdd avec l'heure et le jour à côté, et une session est alors créée.
De plus, celui-ci accède à mon site, sinon il est renvoyé sur le formulaire.

Cela fonctionnait correctement, mais maintenant je préfère avoir les identifications (if ($_POST['i_nom'] == ...)
dans une page insérée en include.
Or, depuis, même si le nom et le mot de passe sont incompatibes,
.le client accède à mon site,
.une session est créée,
.une nouvelle entrée apparaît dans ma bdd, où il n'est même plus écrit le nom entré mais ' 1 '.

Voici mon script :

La page mise en include :
<?php
($_POST['i_nom'] == '...' AND $_POST['password'] == '...')
OR ($_POST['i_nom'] == '...' AND $_POST['password'] == '...')
OR ($_POST['i_nom'] == '...' AND $_POST['password'] == '...')
OR ...
?>

La page du formualaire :
<?php
// 2. ACCES A MON SITE :
if
(
!empty($_POST['i_nom'])
AND ( include('w.liste_membres.php') )
)
{
$_SESSION['i_nom'] = true;
?><input class="bouton" style="color:blue;" type="button" onclick="window.location='ba.acceuil.php';" value="Aller sur mon site !" /><?php
}
[...]
if
(
(include('w.liste_membres.php'))
AND
( !mysql_query( "INSERT INTO visites VALUES('(i) . $i_nom')" ))
)
{
// inscription dans la bdd
$i_nom = mysql_real_escape_string($_POST['i_nom']).' '.$date;
mysql_query("INSERT INTO visites VALUES('(i) . $i_nom')");
}

(comme vous avez remarqué, il y a 2 parties : c'est pour me simplifier mon script - je vous ai pas tout dit )

-> Comment obtenir le même résultat qu'avant mais avec l'include ?!

19 réponses

Le message d'erreur signifie que PHP ne trouve pas le fichier w.liste_membres.php. C'est que ce fichier n'est pas là où tu le dit, ou que le nom ne s'écrit pas exactement comme ça...
Donc, ce que tu mets dedans, que ce soit ce que tu avais mis au départ ou ce que je t'ai proposé, ne devrait rien y changer.

Le fichier que tu inclus s'appelle-t-il bien w.liste_membres.php et est-il bien dans le même répertoire que le script qui l'appelle ?
L'utilisation classique de include est d'inclure une suite d'instructions complètes. Or toi tu veux t'en servir comme d'une fonction qui retourne une valeur que tu utilises à l'intérieur d'une expression. As-tu vraiment besoin de cette utilisation particulière ? Car à la lecture de ton code, on ne voit pas vraiment ce qui le justifie.
1
1- La condition contenue dans l'include est vérifiée. Donc on évalue la deuxième partie, qui est un INSERT SQL SANS LA DATE (puisque tu n'initialises $i_nom avec la date que plus loin).
L'insertion se passe bien donc le mysql_query rend vrai donc le AND (!mysql_query.. est faux, donc le if est faux, donc le bloc { ... } qui suit n'est pas exécuté. Or, c'est dans ce bloc que tu mets ta date.
Je pense qu'en fait il ne fallait pas mettre de mysql_query dans ta condition, où es-tu allé pêcher cette idée ? Et à quoi sert le (i) . que tu mets avant le nom ? Et pourquoi mets-tu le nom et la date dans le même champ au lieu d'avoir deux champs séparés ?

2-quelques remarques :
Dans ton test $_SESSION['i_nom'] == false où as-tu initialisé $_SESSION['i_nom'] à la valeur false ? Si tu ne l'as jamais initialisé, le test à faire est plutôt if (!isset($_SESSION['i_nom'])).
La ligne $_SESSION['i_nom'] == true; est rigoureusement inutile. Elle ne fait absolument rien. Et même si tu avais mis un seul =, son effet serait annulé par la ligne qui la suit.
As-tu bien un session_start() au début de chaque script ?


Je préfère utiliser un include pour plus de clarté dans mon script Quelle clarté gagnes-tu ? Une simple fonction ferait aussi bien l'affaire. Et même si tu tiens à utiliser un include, tu pourrais y mettre la définition de la fonction, histoire que ce soit l'appel à une fonction qui apparaisse dans le if, plutôt que l'include lui-même. Je crois que c'est la première fois que je vois quelqu'un utiliser la valeur retournée par un include dans une expression.

Aussi, cela me permet d'avoir un répertoire des membres et de leurs mot de passe Je vois que tu les as codé 'en dur' sous forme de tests en PHP. Or, ils devraient être dans une base de données, que tu interroges avec un SELECT pour vérifier qu'un utilisateur est bien inscrit. C'est aussi simple et beaucoup plus souple à utiliser.
1
Le session_start est vraiment nécessaire sur toutes les pages qui utilisent les sessions. Et il doit être mis avant tout envoi de données au client : si tu as le message Warning: session_start() headers already sent..., C'est que tu as déjà envoyé des informations au client. le message te dit où tu as commencé (output started at...).

Si tu fais des INSERT dans une base de données, c'est que tu as déjà des notions sur le sujet. Tu devrais créer une table 'membres' (enfin, tu prends le nom que tu veux :) ) avec des champs 'peudo' et 'motdepasse'.
Dans ton programme, pour tester si quelqu'un est autorisé, tu fais (les puristes m'excuseront) :
$requete = "SELECT COUNT(*) as cnt FROM utilisateurs WHERE pseudo='". mysql_real_escape_string ( $_POST['i_nom']). "' AND motdepasse='".mysql_real_escape_string ( $_POST['password']). "'";
$reponse=mysql_query($requete); // exécution de la requête
$ligne=mysql_fetch_assoc($reponse); // extraction du résultat
if ($ligne['cnt']>0) { ...         // teste s'il y a au moins un inscrit avec ce pseudo et ce mot de passe
1
re-coucou !

Excuse-moi de ce retard, je ne sais pas pourquoi je n'ai pas vu tes derniers appels...
le mysql_fetch_assoc signifie que le mysql_query précédent s'est mal passé.
Il y a un tas de raisons possibles. La requête que je te propose n'a de sens que si tu as une table 'utilisateurs' avec des champs 'pseudo' et 'mot de passe'
Pour comprendre un peu mieux ce qui se passe, il faudrait modifier la ligne :
$reponse=mysql_query($requete); ->
$reponse=mysql_query($requete) or die (mysql_error());
ce qui nous affichera un message de diagnostic

le 'cnt' est ce qu'on appelle un alias. c'est un autre nom qu'on donne à un résultat d'une requête (sinon ici le résultat s'appellerait COUNT(*)). On s'en sert pour simplifier l'écriture, surtout quand on a des résultats compliqués avec des noms de tables et de champs combiné.

Je dis "les puristes m'excuseront" car eux, ils amélioreraient de nombreux détails, dont est très gros (donc pas un détail) : les mots de passe ne devraient jamais être enregistrés "en clair" dans une base de données car ça permet au webmestre de voir les mots de passe des gens, ce qui n'est pas éthique. Et surtout en cas de piratage du site, ça donne aux pirates l'occasion de les voir aussi. Or, beaucoup de gens utilisent le même mot de passe sur tous les sites (ce qu'il ne faut pas faire) et les pirates peuvent donc aller voir leurs mails, faire des opérations bancaires...
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
giheller Messages postés 1878 Date d'inscription dimanche 14 juin 2009 Statut Membre Dernière intervention 20 mars 2025 142
20 oct. 2009 à 13:48
bonjour,

la methode POST est utilisée dans un formulaire pour passer des données vers une autre page.
dans votre script il n'y a pas de formulaire.

le formulaire pourrait renvoyer sur la même page et là vous pourriez avoir vos variables.


include c'est comme si vous restiez dans la même page alors $_POST : non.
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 13:55
Il y a bien un formulaire dans mon script, mais je ne l'ai pas copié-collé pour abréger mon message...
" include c'est comme si vous restiez dans la même page alors $_POST : non. " ?!
-> pourquoi j'ai ' 1 ' dans ma bdd alors ?
0
giheller Messages postés 1878 Date d'inscription dimanche 14 juin 2009 Statut Membre Dernière intervention 20 mars 2025 142
20 oct. 2009 à 14:00
bonjour,
n'ayant pas tout le code, je ne peux vous dire d'où vient ce 1

par conttre vous pouvez aisément voir ce qu'il y a dans le tableau $_POSt avec :
echo "<pre>";print_r($_POST);echo "</pre>";


cela vous aidera peut être.
0
Bonjour

Pour qu'une expression comme if ( !empty($_POST['i_nom']) AND ( include('w.liste_membres.php') ) ) fonctionne, il faut que le fichier w.liste_membres.php rende une valeur. Le include se comporte comme une fonction plutôt que comme une substitution de texte.
To fichier inclus doit donc être de la forme :
<?php return ( machin OR truc AND (autre condition)); ?>
ou
<?php
if (condition) return true; else return false; ?>
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 19:04
Voici donc mon nouveau script suivant tes conseils (et si j'ai bien compris) :
<?php
if
(
($_POST['i_nom'] == '...' AND $_POST['password'] == '...')
OR ...
)
{
return true;
}
else
{
return false;
}
?>
Avec ce script là, aucune session n'est créée ! =\

En mettant l'expression " $_SESSION['i_nom'] == true; '" dans l'include, mon localhost me retourne :
" Warning: include(w.liste_membres.php) [function.include]: failed to open stream: No such file or directory in ...

Warning: include() [function.include]: Failed opening 'w.liste_membres.php' for inclusion (include_path='.;C:\php5\pear') in ... "
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
21 oct. 2009 à 18:32
Effectivement, le chemin source n'était pas correct ! x)

Ne manque donc plus que 2 problèmes à résoudre :
. pourquoi, depuis, l'heure de l'inscription dans la bdd ne s'inscrit plus dans ma bdd ?
Mon script :
<?php
$datejour = date("d/m/Y"); $dateheure = date("H\hi"); $date = "- le $datejour à $dateheure";
if
(
(include('w.liste_membres.php'))
AND
( !mysql_query( "INSERT INTO visites VALUES('(i) . $i_nom')" ))
)
{
// inscription dans la bdd
$i_nom = mysql_real_escape_string($_POST['i_nom']).' '.$date;
mysql_query("INSERT INTO visites VALUES('(i) . $i_nom')");
}
?>

.Pourquoi, depuis, lorsqu'un membre s'identifie en mettant son mot de passe et son nom, la session n'est apparemment plus créée ? (déduction faîte en ayant la valeur du textarea du livre d'or sur une autre page)
Mon script :
<?php
if
(
!empty($_POST['i_nom'])
AND ( include('w.liste_membres.php') )
)
{
$_SESSION['i_nom'] == true;
$_SESSION['i_nom'] = $_POST['i_nom'];
?><input class="bouton" style="color:blue;" type="button" onclick="window.location='ba.acceuil.php';" value="Aller sur mon site !" /><?php
}
?>

Mon script du Livre d'Or
<textarea [...] />
<?php if($_SESSION['i_nom'] == false){echo 's\'inscrire pour pouvoir poster !';}?>
</textarea>


P.S : Je préfère utiliser un include pour plus de clarté dans mon script et l'abréger un peu. Aussi, cela me permet d'avoir un répertoire des membres et de leurs mot de passe. =)
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
22 oct. 2009 à 17:43
"As-tu bien un session_start() au début de chaque script ?"
-> Effectivement non, je ne l'avais pas mis dans la page du script du formulaire... C'est vraiment nécessaire ?
En tout cas, si je le mets, j'ai "Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at [...] ) in..." qui s'affiche, MAIS, apparemment une session doit être reconnue car il n'y a plus la valeur du textarea ! Sauf que le message ne s'inscrit pas dans la bdd :( (et ne s'affiche donc pas). Autre nouveau problème : la valeur du textarea ne s'affiche pas non plus avec les non inscrits ! Pour corriger ce dernier problème, je dois retirer "<?php session_start() ?>" mais alors je tourne en rond...

"Je pense qu'en fait il ne fallait pas mettre de mysql_query dans ta condition"
-> Si je le mettait pas, je ne sais pas pourquoi, mais le nom s'inscrivait 2 fois dans ma bdd !
Je l'ai retiré et le nom ne s'inscrit qu'une seule fois... ça ne devait pas être la bonne solution :p
Quant à l'heure, elle s'inscrit bien à côté ! :)

"Et à quoi sert le (i) . que tu mets avant le nom ?"
-> Il me sert juste à savoir, lorsque je vais regarder les visites dans ma bdd, à savoir si le visiteur est inscrit.


"Je vois que tu les as codé 'en dur' sous forme de tests en PHP. Or, ils devraient être dans une base de données, que tu interroges avec un SELECT pour vérifier qu'un utilisateur est bien inscrit. C'est aussi simple et beaucoup plus souple à utiliser."
-> Peut-être vaut-il mieux faire cela... =) Mais je ne sais pas comment faire ! :s
Si tu connais un lien de tuto qui l'enseigne, surtout dis le moi ! :) (ou alors un modèle tout fait; je me démerderai pour la compréhension)
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
23 oct. 2009 à 18:07
Merci ! =)

Seulement, une alerte me dit que
"mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in ..." :(

P.S:
Que signifie "cnt" ??
Pourquoi dis-tu aussi que "les puristes t'excuserons" ? Il feraient quoi eux ?

0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
25 oct. 2009 à 13:41
- back up' -
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
26 oct. 2009 à 13:08
re-back up' - :)

(comment faire disparaître "mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in ...") ?
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
26 oct. 2009 à 16:36
et comme jamais 2 sans 3... :)
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
27 oct. 2009 à 17:01
... back'up !
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
28 oct. 2009 à 10:51
! B!Ng0 ! =)
En effet, mon champ mot de passe avait un nom (mot.de.passe) qui ne marche pas...

Mais me permet de poser une autre question un peu liée je pense :

Voici le script en question (le même) :
$requete = "SELECT COUNT(*) as cnt FROM inscrits WHERE nom='". mysql_real_escape_string ( $_POST['i_nom']). "' AND motdepasse='".mysql_real_escape_string ( $_POST['password']). "'";
$reponse = mysql_query($requete) or die (mysql_error());
$ligne = mysql_fetch_assoc($reponse); // (extraction du résultat)
if( $ligne['cnt'] > 0 )
{
$_SESSION['i_nom'] = $_POST['i_nom'];
?><input class="bouton" style="color:blue;" type="button" onclick="window.location='ba.acceuil.php';" value="Aller sur mon site !" /><?php
}

et voici là mon script de mon Livre d'Or :
<form class="formulaire" method="post">
<table><caption>LIVRE d'OR</caption></table>
<em style="text-decoration: none; margin-left: 2%; color: green">Toi aussi, laisse un mot!</em><br/>
<textarea onfocus="this.value = '';" style="margin-left: 2%; width: 92%; height: 100px; color: grey" name="message" rows="8" cols="45"/><?php if($_SESSION['i_nom'] == false){echo 's\'inscrire pour pouvoir poster !';}?></textarea>
<input style="margin-left: 20%" type="submit" value="Afficher !" /><br/>
<em style="...">Les 3 derniers messages, du plus au moins récent :</em>
<br/>

Pourquoi, même lorsqu'on s'identifie sur mon site en tant qu'inscrit, on a la valeur du textarea qui n'est censée n'apparaître que pour les non-inscrits ?!
-> Vaut-il mieux mettre à la place de la ligne en gras "if(!empty($_SESSION['i_nom']))" ?
0
Le test que tu fais n'est pas très judicieux : tu testes si $_SESSION['i_nom'] vaut false, alors que tu ne lui attribues jamais la valeur true ni la valeur false... Il vaudrait mieux tester if (empty($_SESSION['i_nom'])).
Mais ça n'explique pas que le message s'affiche pour un utilisateur identifié. Tu as peut-être oublié le session_start() au début de tes deux scripts? Si tu crois l'avoir mis, fais un print_r ($_SESSION) dans le livre d'or pour voir s'il récupère bien la session
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
1 nov. 2009 à 22:27
C'est corrigé ! merci ;)
0