Compteur persistent

Eléphant du PHP | 224 Messages

08 déc. 2006, 21:24

Bonjour à tous :)

Voilà, j'ai un petit formulaire Html, et j'aimerai pouvoir compter le nombre de fois que le formulaire est validé...

Le truc est que lorsque le formulaire est mal rempli, une autre page apparait indiquant à l'utilisateur de revenir en arrière et de corriger sa saisie... seulement, j'aimerais limiter le nombre de tentatives de validation à 3 par exemple...

Quelqu'un aurait une piste pour réaliser ça ?

J'ai fait une petite fonction "compteur" :
function compteur($limite) {
	static $nbr = 0;
	$nbr ++;
	if ($nbr > $limite) { 
		return 1; 
	} else { 
		return 0; 
	}
}
Évidemment, ça ne fonctionne pas puisque la valeur du compteur n'est pas persistente... comment faire ? :roll:

Merci à tous :)
Modifié en dernier par FredoMkb le 11 déc. 2006, 07:31, modifié 1 fois.
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Mammouth du PHP | 19672 Messages

08 déc. 2006, 21:30

Tu pourrais explorer les sessions : en enregistrant le compte dans une variable de session, tu règlerais le problème. Fais une petite recherche sur le forum, il y a de nombreux sujet qui abordent la question des sessions et éventuellement il y a même un tuto sur les sessions sur le site
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 224 Messages

08 déc. 2006, 21:35

Tu pourrais explorer les sessions : en enregistrant le compte dans une variable de session, tu règlerais le problème. ...
Merci beaucoup pour ta réponse rapide... je regarde tout ça et reviens en cas de besoin 8)

Encore merci :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 224 Messages

08 déc. 2006, 23:16

Re...

Bon, j'ai lu le tuto, très intéressant :), et voilà ce que j'ai fait :
function compteur($limite = 3) {
	if (!isset($_SESSION['nbr'])) { $_SESSION['nbr'] = 0; }
	$_SESSION['nbr'] ++;
	if ($_SESSION['nbr'] > $limite) { 
		return 1; 
	} else { 
		return 0; 
	}
}
Bon bein... ça fonctionne... mais... ça ne marche pas :(

Je m'explique...

Lorsqu'on clique sur le bouton de validation du formulaire, ça affiche une nouvelle page si une valeur est mal entrée (page Html générée par le même fichier Php), en réiterant la même opération, le compteur n'est pas augmenté, il reste toujours à 1... du coup je ne peux vérifier le nombre de fois que le formulaire a été validé...

Voilà... je dois certainement mal m'y prendre... mais là je bloque, j'aurai besoin d'un petit coup de pouce... :priere:

Merci :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 281 Messages

09 déc. 2006, 00:36

---
Modifié en dernier par Ouaibou le 07 juil. 2007, 11:16, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 déc. 2006, 00:36

Tu as bien un session_start() dans chacune de tes pages pour démarrer la session ? (chacune de celles où tu as besoin de la session du moins :))

Sans lui tu ne pourras pas utiliser pleinement la variable $_SESSION d'une page à l'autre :)

Sinon ton traitement gère-t-il correctement le résultat de ta fonction ? elle renvoi 1 ou vrai si le compteur est strictement supérieur à 3, et 0/faux sinon... est ce bien ce que tu attends ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 224 Messages

09 déc. 2006, 11:11

Bonjour à tous et merci pour vos réponses :)
Tu renvois 1 ou 0. Par conséquent, ça ne poura afficher une autre valeur
Oui Ouaibou, mais dans mon code de travail j'ai bien quelques "echo" pour bien visualiser la valeur du compteur au fur et à mesure des traitements... seulement, dans un souci de clareté, j'ai posté ici une version nettoyée du code... mais, en l'état, tu as raison, ce n'est pas très clair... j'aurais peut-être dû indiquer ce détail dans mes explications... je ferai attention désormais à bien clarifier ces détails importants pour la compréhension de tous... merci :)
Tu as bien un session_start() dans chacune de tes pages pour démarrer la session ? (chacune de celles où tu as besoin de la session du moins :))

Sans lui tu ne pourras pas utiliser pleinement la variable $_SESSION d'une page à l'autre :)
Merci Ryle, c'était exactement mon erreur... bien vu ! :)

En fait, étant très novice avec ces techniques, je pensais qu'une fois une session ouverte, elle le restée tant qu'on ne la fermez pas... je n'avais pas compris qu'il fallait établir une connexion à la session à chaque nouvelle page... merci Ryle pour cette remarque qui m'a permis d'avancer sur mon projet (voir explications plus bas)...
Sinon ton traitement gère-t-il correctement le résultat de ta fonction ? elle renvoi 1 ou vrai si le compteur est strictement supérieur à 3, et 0/faux sinon... est ce bien ce que tu attends ?
Oui, c'est bien ça que je cherche à obtenir comme résultat... pas trop de soucis de ce côté là.

Donc, en appliquant un "session_start()" tout au début du fichier Php, le compteur s'incrémente bien désormais, et c'est plutôt une bonne nouvelle ;)

Seulement, j'ai maintenant un autre soucis, qui complique un peu mon projet, je m'explique :

1. Lorsqu'on valide le formulaire, si tous les champs ont bien été remplis, on passe à la suite des traitements ;

2. Mais lorsqu'un champ comporte des données erronnées, une page comportant un message d'avertissment s'affiche, proposant un lien "retour" qui permet de retourner à la page formulaire sans perdre les différentes informations saisies afin de pouvoir facilement corriger les erreurs existantes ;

3. Le lien de retour est un simple petit java-script qui affiche la page précédente issue de l'historique du navigateur :

Code : Tout sélectionner

<a href="javascript: history.go(-1)">blabla</a>
4. Le problème, donc, est que la présence du "session_start()" au début du code, a pour effet le rechargement entier de la page, perdant du coup toutes les données saisies par l'utilisateur, et l'obligeant à tout resaisir... ce qui est bien rageant pour être honnête :(

Alors, la question qui s'impose :

Comment faire pour que le retour à la page précédente ne force pas le rechargement complèt de la page effaçant du même coup toute les données déjà saisies ?

Autrement dit, comment utiliser le "session_start()" sans perdre les données déja fournies par l'utilisateur ?

Merci en tout cas pour votre aide, elle m'a déjà permis d'avancer considérablement sur mon projet... a+ :)

PS. Je précise que ce projet consiste à ajouter une petite fonctionnalité de sécurité à un script Php issue d'une application Web très connue...
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 déc. 2006, 12:38

En fait ta fonction de retour en javascript est très hasardeuse pour l'usage que tu en as. En effet, cela va dépendre également de la configuration du cache du navigateur du client, et il se peut que son formulaire soit vide lorsqu'il revient dessus avec ou sans le session_start().

Le plus simple dans ton cas, maintenant que tu as une jolie session, serait de récupérer les données envoyées par le formulaire en cas d'erreur, de les passer en session (tu peux très bien coller directement le tableau $_POST (ou $_GET) que tu reçois dans une variable de session) et les exploiter lorsque tu reviens sur ton formulaire pour spécifier des valeurs par défaut :)

côté page d'erreur :
<?php $_SESSION['post'] = $_POST; ?>
côté formulaire :
<?php
$valeurDuChampToto = isSet($_SESSION['post']['toto']) ? $_SESSION['post']['toto'] : "" ; // valeur vide par défaut
?>
<input type="text" name="toto" value="<?php echo $valeurDuChampToto; ?>" />
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 224 Messages

11 déc. 2006, 07:30

Bonjour à tous :)

Merci beaucoup pour vos contributions et désolé pour cette réponse tardive...

En fait, j'ai bien pu avancer sur mon projet ce week-end, et j'ai finalement trouvé une solution, avec les "sessions" bien sûr, et qui a l'air de bien fonctionner...

J'aurais voulu poster ici les codes concernés, afin que ça puisse éventuellement servir à d'autres, mais, maleheureusment, les parties intéressantes à cet échange sont noyées dans un ensemble bien plus important qui n'aurait, quant à lui, aucune pertinence dans cette discussion...

Malgré tout, voici un petit bout de code du compteur utilisé, mais, comme vous le verrais, c'est un peu stérile sorti de son contexte :
	// Initialisation d'une session pour compter le nombre de tentatives
	$suiteOk = 0;
	session_start(); // Demarrage de la session
	if (isset($_SESSION['nbr'])) {
		$_SESSION['nbr'] ++;  // Iteration du compteur
		if ($_SESSION['nbr'] >= $limite) { $suiteOk = 1; }
	} else {
		$_SESSION['nbr'] = 1; // Initialisation du compteur
	}
Enfin, je tiens à vous remercier tous pour votre aide précieuse, sans laquelle je n'aurai certainement pas pu aboutir ce projet !

Encore merci et à bientôt :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)