possible d'ouvrir une page qu'une fois par connection

Eléphanteau du PHP | 43 Messages

14 sept. 2007, 18:52

Ben c'est que tu as un pb de méthode dans le fonctionnement du gain de tes points.
Je vais voir sa.
Il faut donc que la page ne puisse s'afficher qu'une fois, contrôlée par une variable de session avec php, et tu fais le décompte de tes points en fonction du temps écoulé sur cette page en javascript (sans rafraichissement de la page).
Donc utilisé du Ajax ?
Et tu passes la variable javascript dans un post par exemple.
Heinn :oops:
J'ai pas le temps de te donner + de détails pour l'instant. En début de semaine prochaine si personne ne t'a aidé d'ici là. Mais c'est pas compliqué à faire.
Ok

Merci

ViPHP
AB
ViPHP | 5818 Messages

17 sept. 2007, 09:35

<?php
session_start();

$_SESSION['verif'] = isset($_SESSION['verif'])?  intval($_SESSION['verif']) : 0;

if ($_SESSION['verif'] < 2 )
{
$_SESSION['verif']++;

if (isset($_POST['valeur_temps'])) {
$temps = isset($_POST['valeur_temps'])? intval($_POST['valeur_temps']) : 0;
echo $temps;
}
}
else
{
//ici tu mets le code que tu veux et qui s'exécutera au troisième affichage de ta page. dans l'exemple ci-dessous je fais une redirection vers la page accueil.html;
			$page_goto = 'accueil.html';
  			if (isset($_SERVER['QUERY_STRING'])) 
				{
    			$page_goto .= (strpos($page_goto, '?')) ? "&" : "?";
    			$page_goto .= $_SERVER['QUERY_STRING'];
				}
  			header(sprintf("Location: %s", $page_goto));exit();
} 

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
<script type="text/javascript">

function affiche(timedebut) {
var nvdate = new Date();
var nvtime = nvdate.getTime();
var temps_ecoule = Math.round((nvtime - timedebut)/1000);
document.getElementById("valeur_temps").value = temps_ecoule;
setTimeout("affiche("+timedebut+")",1000);
}

function compte_temps(){
var date = new Date();
var timedebut = date.getTime();
affiche(timedebut);
}

</script>
</head>

<body onload="compte_temps()">
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<input type="submit" value ="ok">
<input type="hidden" id="valeur_temps" name="valeur_temps" />
</form>
</body>
</html>
La fonction javascript "compte_temps" appelée au chargement de la page enregistre le temps initial dans la variable javascript "timedebut". Puis elle appelle la fonction affiche() avec le paramètre "timededut".

La fonction affiche() calcule le temps écoulé soit la différence entre le temps actuel (nvtime) et le temps initial (timedebut), elle affecte cette valeur dans un champ caché du formulaire "valeur_temps", puis s'appelle elle-même toute des secondes.

La valeur de la variable $_POST['valeur_temps'] est donc incrémentée de 1 à chaque seconde.
En cliquant sur ok tu peux donc récupérer le temps écoulé avec php. Dans l'exemple j'ai fait afficher la valeur (echo $temps). à toi d'en faire ce que tu veux.

la page est protégée par une variable de session qui ne permet qu'un traitement par session sinon dans l'exemple je redirige vers une éventuelle page "accueil.html"

Colles ce code dans une page vierge puis fait des tests. Avec ce principe tu devrais pouvoir arriver à tes fins.
Modifié en dernier par AB le 27 sept. 2007, 22:44, modifié 1 fois.

ViPHP
AB
ViPHP | 5818 Messages

17 sept. 2007, 21:38

En fait on pourrait aussi bien noter le temps initial dans une variable de session en php puis récupérer ensuite le temps écoulé toujours en php, à l'envoi du formulaire.

Mais l'avantage de la méthode précédente c'est qu'elle te permet de faire un affichage dynamique du temps écoulé ou du nombre de points gagnés sans rafraichissement de la page.
Il suffit de rajouter une ligne dans la fonction affiche et une dans le code html pour l'affichage
<?php
session_start();

$_SESSION['verif'] = isset($_SESSION['verif'])?  intval($_SESSION['verif']) : 0;

if ($_SESSION['verif'] < 2 )
{
$_SESSION['verif']++;
if (isset($_POST['valeur_temps'])) {
$temps = isset($_POST['valeur_temps'])? intval($_POST['valeur_temps']) : 0;
echo $temps;
}
}
else
{
//ici tu mets le code que tu veux et qui s'exécutera au troisième affichage de ta page. dans l'exemple ci-dessous je fais une redirection vers la page accueil.html;
			$page_goto = 'accueil.html';
  			if (isset($_SERVER['QUERY_STRING'])) 
				{
    			$page_goto .= (strpos($page_goto, '?')) ? "&" : "?";
    			$page_goto .= $_SERVER['QUERY_STRING'];
				}
  			header(sprintf("Location: %s", $page_goto));exit();
} 

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
<script type="text/javascript">

function affiche(timedebut) {
var nvdate = new Date();
var nvtime = nvdate.getTime();
var temps_ecoule = Math.round((nvtime - timedebut)/1000);
document.getElementById("valeur_temps").value = temps_ecoule;
document.getElementById("valeur_temoin").value = temps_ecoule;
setTimeout("affiche("+timedebut+")",1000);
} 

function compte_temps(){
var date = new Date();
var timedebut = date.getTime();
affiche(timedebut);
}

</script>
</head>

<body onload="compte_temps()">
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<input type="submit" value ="ok">
<input type="text" id="valeur_temoin" name="affichage" />
<input type="hidden" id="valeur_temps" name="valeur_temps" />
</form>
</body>
</html>
Modifié en dernier par AB le 27 sept. 2007, 22:33, modifié 1 fois.

Eléphanteau du PHP | 43 Messages

21 sept. 2007, 20:48

Je comprend pas, pourquoi tu veux a tout pris limite le nombre d'affichage :?:

ViPHP
AB
ViPHP | 5818 Messages

21 sept. 2007, 22:34

As-tu oublié que tu souhaitais que les joueurs ne puissent pas jouer plusieurs fois (c'est-à-dire réafficher la page) lors d'une même session ?
Bonjour,

Je suis en train de faire un site qui est d'ailleur bientot fini.

mais j'ai trouvé un bug de sécurité, en effet
il y a une page qui fait gagné des points toute les x secondes(simule les personne payant a une caisse)
le problème est que l'on peut oiuvrir autant de fois la page qu'on le souhaite et alors multiplié les gains

Donc je voudrais savoir comment faire ?

merci
Remarques que dans ce cas on pourrais également laisser la possibilité de réafficher la page sans que le compteur de points soit incrémenté une seconde fois.

Faudrais que tu soit clair dans ce que tu souhaites sinon difficile de te conseiller :wink:

Eléphanteau du PHP | 43 Messages

21 sept. 2007, 23:24

As-tu oublié que tu souhaitais que les joueurs ne puissent pas jouer plusieurs fois (c'est-à-dire réafficher la page) lors d'une même session ?
Bonjour,

Je suis en train de faire un site qui est d'ailleur bientot fini.

mais j'ai trouvé un bug de sécurité, en effet
il y a une page qui fait gagné des points toute les x secondes(simule les personne payant a une caisse)
le problème est que l'on peut oiuvrir autant de fois la page qu'on le souhaite et alors multiplié les gains

Donc je voudrais savoir comment faire ?

merci
Remarques que dans ce cas on pourrais également laisser la possibilité de réafficher la page sans que le compteur de points soit incrémenté une seconde fois.

Faudrais que tu soit clair dans ce que tu souhaites sinon difficile de te conseiller :wink:
La page peux ce réactualise SEUL(toute les Xsec.) autant de fois que le membre ce souhaite

Le problème vien que l'on peux ouvrir autant de fois la page qu'on le souhait

vous voyez ce que je veux dire AB ?

Sinon, je pense plutot qu'il faudrait vérifier le nombre de seconde entre les raffraichismet
si c'est = a exemple 20 on affiche la page, sinon redirection

ViPHP
AB
ViPHP | 5818 Messages

22 sept. 2007, 21:02

Sinon, je pense plutot qu'il faudrait vérifier le nombre de seconde entre les raffraichismet
si c'est = a exemple 20 on affiche la page, sinon redirection
Pourquoi pas, ce peut-être une solution à envisager.

Mais avant d'aller plus loin, et afin d'étudier la meilleure solution, j'aimerais bien comprendre le fonctionnement complet de cette page.

Le visiteur arrive sur ta page
- Que peut-il faire ou qu'est-il sensé faire sur cette page ?
- Qu-a-t-il à faire pour gagner des points ?
- De quelle façon enregistres-tu les points ?
- Pourquoi veux-tu rafraichir cette page toutes les x secondes ?
- Que ce passe-t-il lors de ce rafraichissement ?
- Y-a-t-il une redirection automatique au bout de X secondes ?
- Si le visiteur tente de se reconnecter ultérieurement sur la même page durant la même session, que veux-tu qu'il se passe ?

Il faut que tu donnes tout le principe de fonctionnement.
Sans ces informations, difficile de te répondre avec une solution adaptée.

Eléphanteau du PHP | 43 Messages

22 sept. 2007, 23:17

Je vais te repondre clairement.

Tout d'abord, voici la page temporaire concerné http://www.mabarre.com/labarre/cashbar.php

- Que peut-il faire ou qu'est-il sensé faire sur cette page ?
Il peut soit regardé la bannière en haut et ces points ou navigué sur internet grace au frame.

- Qu-a-t-il à faire pour gagner des points ?
Rien !!^^, navigué avec cette page.

- De quelle façon enregistres-tu les points ?
Avec un form caché qui contient id, points du membre, quand la page ce rafraichi elle recupere les données du form avec $_post['']; puis les ajoute dans a bdd.

- Pourquoi veux-tu rafraichir cette page toutes les x secondes ?
Je m'en sert pour changé la bannière et ajouté 1 point au membre.

- Que ce passe-t-il lors de ce rafraichissement ?
Comme dit juste au dessus.

- Y-a-t-il une redirection automatique au bout de X secondes ?
En javascript

Code : Tout sélectionner

<form name="ss" method="post" action=""> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">Veuillez patienter</font> <input type="text" name="tt" size="2"> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">sec.</font> </form> <form name=finishtask action=bar.php method=post> <input type=hidden name=id value=<?echo $id ?>> <input type=hidden name=pts value=<?echo $points?>> <input type=hidden name=banp value=<?echo $banp?>> </form> <script language="Javascript" type="text/javascript"> var sec=35; secund(); function secund() { sec--; document.ss.tt.value=sec; if(sec==0) document.finishtask.submit(); setTimeout('secund()',1000); } </script>
- Si le visiteur tente de se reconnecter ultérieurement sur la même page durant la même session, que veux-tu qu'il se passe ?
C'est-à-dire ?

ViPHP
AB
ViPHP | 5818 Messages

24 sept. 2007, 12:32

Si on fait au plus simple

Dans la frame supérieure
- tu fais un décompte des points en javascript avec une fonction dans le genre de celle que je t'ai indiquée par exemple. A toi de l'adapter si tu souhaites pour afficher + 1 point toutes les 35 secondes.

- Donc arrivé au seuil des 35 secondes tu fais afficher + un point en javascript et tu en profites pour changer le contenu de ta bannière toujours en javascript comme pour un diaporama.

- Un bouton pour que le visiteur puisse valider ses points. Quand il valide tu fais l'enregistrement en bdd et tu le redirige vers une page de ton choix.

Si tu veux éviter que le visiteur ait à valider ses points tu peux utiliser onUnload qui déclenchera l'envoi de formulaire lorsque le visiteur quittera cette page.
doc http://fr.selfhtml.org/javascript/langa ... m#onunload

- Pour éviter que le visiteur ne puisse pas rejouer (se reconnecter sur cette même page) durant la même session - puisque c'est ce que tu demandes dans ton premier post - tu pourras donc utiliser le système de session dont nous avons déjà parlé.

Est-ce que ce système te conviens ?

(essaies d'éviter trop de titres en rouge dans tes post, ça flash)

Eléphanteau du PHP | 43 Messages

24 sept. 2007, 13:13

Je vais essayé sa

En fait, faut utilisé ajax ?

Merci de consacre quelque minute de ton temps a mon problème
Est-ce possible de conversé avec toi par messagerie instantané ?

ViPHP
AB
ViPHP | 5818 Messages

24 sept. 2007, 13:53

Je viens de répondre à ta dernière question en t'envoyant un message.

Sinon pour le début de ta question y'a pas besoin d'utiliser ajax pour faire ma méthode précédente. Javascript seul devrait suffire avec un peu de php en complément.

Eléphanteau du PHP | 43 Messages

24 sept. 2007, 18:14

Peut-on utilisé du php dans JS ou/et l'inverse :?:

ViPHP
AB
ViPHP | 5818 Messages

24 sept. 2007, 19:28

Pour enregistrer les points c'est le même principe que tu utilises actuellement sauf que cela se fera soit quand l'utilisateur valide ses points soit quand il quitte ta page.

Sinon, concernant le principe du diaporama pour changer ta banière toutes les x secondes tu peux utiliser un script du genre :

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>Sans titre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script type="text/javascript"> <!-- var photo = new Array("http://www.abciweb.net/PHOTO/abciweb-100.jpg","http://www.abciweb.net/PHOTO/amazigh-100.jpg","http://www.abciweb.net/PHOTO/aned_mau-100.jpg","http://www.abciweb.net/PHOTO/aub_ane-100.jpg"); var source = new Array(); for (var i=0; i < photo.length; i++){ source[i] = new Image(); source[i].src = photo[i]; } var Temps = 35 * 1000; /*Temporisation par défaut (35 secondes) à définir ici*/ var Inc = 0; var timer = 0; function diapo() { document.getElementById("vue").src = source[Inc].src; if (Inc < photo.length - 1) {Inc++;} else {Inc = 0;} timer = setTimeout("diapo()",Temps); } //--> </script> </head> <body onload="diapo();"> <div id="diaporama"> <img id= "vue" style="border:0" src="" alt="" /> </div> </body> </html>
Il suffit de remplir le tableau javascript "photo". Tu peux bien sûr mettre l'adresse des images en relatif. Et s'il n'y a pas de " dans l'adresse de tes fichiers (il ne devrait pas y'en avoir), tu peux facilement alimenter ce tableau par un script php (résultat d'une requête ou autre) au chargement de la page.

En rajoutant un bout de code et un tableau dans le code javascript, tu peux également rendre les photos cliquables.
Modifié en dernier par AB le 27 sept. 2007, 21:46, modifié 1 fois.

Eléphanteau du PHP | 43 Messages

25 sept. 2007, 12:39

ok mais

Peut-on utilisé du php dans JS ou/et l'inverse ?

pour les bannière je dois effectué une requête

ViPHP
AB
ViPHP | 5818 Messages

25 sept. 2007, 14:33

No problème.

Il existe des classes très complètes pour alimenter des tableaux javascript avec du php, mais dans ton cas comme tu ne devrais pas avoir de " dans le nom de tes fichiers images, il est simple d'alimenter ton tableau photo js comme ceci :

Code : Tout sélectionner

var photo = new Array(<?php echo $chaine ?>);


où tu aura pris soin de formater $chaine à partir du résultat de ta requête initiale pour que cette variable retourne : "chemin du premier fichier","chemin du second fichier","etc"

EDIT en fait les enregistrements doivent êtres concaténés sous la forme
$chaine='';
//puis dans ta boucle qui lit ta requête :
$chaine .= '"'.chemin du premier fichier.'",'; //etc
//sauf le dernier qui doit être sous la forme
$chaine .= '"'.chemin du dernier fichier.'"';
Et tu pourras réutiliser cette méthode pour alimenter des petits diaporama de présentation ou publicitaires à partir d'une requête php.