Rechercher : dans
Par :

[PHP] Conditions dans un include

Dernière réponse le 1 nov 2009 à 22:27:59 digival, le 20 oct 2009 à 13:08:18 
 Signaler ce message aux modérateurs

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 ?!

Configuration: Windows Vista
Firefox 3.5.3

Meilleures réponses pour « [PHP] Conditions dans un include » dans :
PHP - Structures conditionnelles Voir Qu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...
[PHP] Les ressemblances à ne pas confondre VoirIntroduction Concaténation ou paramètres ? Guillemets/Apostrophe Structure require/include isset vs empty htmlentities ou htmlspecialchars ? Nombre de signes égal Introduction Cette astuce présente plusieurs fonction ou astuces en...
PHP - Expressions régulières VoirQu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...

1

giheller, le 20 oct 2009 à 13:48:27

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.
J-L

Répondre à giheller

2

digival, le 20 oct 2009 à 13:55:14

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 ?

Répondre à digival

3

giheller, le 20 oct 2009 à 14:00:08

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.
J-L

Répondre à giheller

4

le père, le 20 oct 2009 à 14:00:38

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; ?>

Répondre à le père

5

digival, le 20 oct 2009 à 19:04:44

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 ... "

Répondre à digival

6

le père, le 21 oct 2009 à 08:16:53
  • +1

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.

Répondre à le père

7

digival, le 21 oct 2009 à 18:32:30

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. =)

Répondre à digival

8

le père, le 22 oct 2009 à 09:10:02
  • +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.

Répondre à le père

9

digival, le 22 oct 2009 à 17:43:14

"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)

Répondre à digival

10

le père, le 22 oct 2009 à 18:40:31
  • +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

Répondre à le père

11

digival, le 23 oct 2009 à 18:07:21

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 ?

Répondre à digival

12

digival, le 25 oct 2009 à 13:41:57

- back up' -

Répondre à digival

13

digival, le 26 oct 2009 à 13:08:11

Re-back up' - :)

(comment faire disparaître "mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in ...") ?

Répondre à digival

14

digival, le 26 oct 2009 à 16:36:55

Et comme jamais 2 sans 3... :)

Répondre à digival

15

digival, le 27 oct 2009 à 17:01:43

... back'up !

Répondre à digival

16

le père, le 27 oct 2009 à 17:21:12
  • +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...

Répondre à le père

17

digival, le 28 oct 2009 à 10:51:15

! 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']))" ?

Répondre à digival

18

le père, le 28 oct 2009 à 21:35:13

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

Répondre à le père

19

 digival, le 1 nov 2009 à 22:27:59

C'est corrigé ! merci ;)

Répondre à digival
Collection CommentÇaMarche.net