Double enregistrement pour 1 requette...

Résolu/Fermé
Sébastien724 - 30 déc. 2008 à 20:10
 Sébastien724 - 31 déc. 2008 à 00:49
Bonjour,

Voilà je suis entrain de faire un script de ticket à gratter avec limitation de participation à 3 par jour/par membre
J'enregistre les infos de participations dans ma base.

Je m'y prends comme ceci :

1. Je vérifie si le joueur qui tente de charger la page n'a pas déjà gratter ses 3 tickets
- Si il les a gratté, redirection vers page l'informant qu'il n'a plus de ticket
sinon
2. Au chargement de la page du ticket à gratter, j'enregistre la participation du joueur

Le joueur peut jouer

Une fois qu'il valide son ticket (par clic bannière)

Cela déclenche l'envoi du formulaire de participation qui met à jour la base en ajoutant le gain
et en créditant le compte du membre du gain tiré au hasard.

Jusqu'à là tout est super
Seul problème, au chargement de la page, il m'enregistre 2 fois la participation pour le même membre...

Je vous expose mon code car je vois pas où est le problème :(

Code du script PHP :
<?php
session_start();

//Ticket à gratter
include ("inc/dbconnect.php");

$date_jour = date ("d/m/Y");
$ip = $_SERVER['REMOTE_ADDR'];

//On verifie
$sql = "SELECT count(*) FROM cf_grattage WHERE id_membre='".$_SESSION['idmembre']."' AND date = '".$date_jour."'";
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql1.'<br />'.mysql_error());
if (mysql_num_rows($req)>3)
{
	die ("Désolé mais vous n'avez plus de tickets pour aujourd'hui.<br><br><a href='compte.php'>Cliquez-ici</a> pour retourner à votre compte !");
	exit();
}
else
{
session_start();
include ("inc/dbconnect.php");
//Dès le chargement de la page on enregistre la participation
$sql = "INSERT INTO cf_grattage (id_membre, date, gain, ip) VALUES ('".$_SESSION['idmembre']."', '".$date_jour."', '', '".$ip."')";
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
}

if (isset($_POST['participation']) && $_POST['participation'] == "oui")
	{
		include ("inc/dbconnect.php");
		
		//On met à jour !
		$sql = "UPDATE cf_grattage SET gain = '".$_POST['gain']."' WHERE id_membre='".$_POST['idmembre']."'";
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		
		//Mise à jour solde membre
		$sql = "UPDATE cf_solde_membre SET solde = solde + '".$_POST['gain']."' WHERE id_membre = '".$_POST['idmembre']."'";
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		
		//Ajout table historique rémunération
		$sql = "INSERT INTO cf_historique_remuneration (id_membre, programme, date, gain, etat) VALUES ('".$_POST['idmembre']."', 'Ticket à gratter', '".$_POST['date']."', '".$_POST['gain']."', 'Validé')";
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		
		$message = $_POST['gain']." ont été crédités sur votre compte !";
	}
?>


Merci de m'aider si vous voyez une anomalie !
A voir également:

14 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 déc. 2008 à 20:48
je ne sais pas si ça vient de là mais tu as 2 fois session_start()

et au moins 3 fois include ("inc/dbconnect.php");
1
Sébastien724
30 déc. 2008 à 20:55
Merci de ta réponse Alain, mais non ce n'est pas à cause de ça.
J'avais déjà essayé sans les include mais erreur connexion mysql
et sans les sessions mais ça fait toujours le même problème :=(
0
Utilisateur anonyme
30 déc. 2008 à 21:12
<?php
   //Ticket à gratter
   session_start();
   include ("inc/dbconnect.php");
   
   $date_jour = date ("d/m/Y");
   $ip = $_SERVER['REMOTE_ADDR'];
   
   //On verifie
   $sql = "SELECT count(*) FROM cf_grattage WHERE id_membre='".$_SESSION['idmembre']."' AND date = '".$date_jour."'";
   $req = query_or_die($sql);
   
   if (mysql_num_rows($req)>3) {
            die ("Désolé mais vous n'avez plus de tickets pour aujourd'hui.<br><br><a href='compte.php'>Cliquez-ici</a> pour retourner à votre compte !");
            exit();
   }
   elseif (isset($_POST['participation']) && $_POST['participation'] == "oui")        {
         //Dès le chargement de la page on enregistre la participation
         $sql = "INSERT INTO cf_grattage (id_membre, date, gain, ip) VALUES ('".$_SESSION['idmembre']."', '".$date_jour."', '', '".$ip."')";
         $req = query_or_die($sql);
               
         //On met à jour !
         $sql = "UPDATE cf_grattage SET gain = '".$_POST['gain']."' WHERE id_membre='".$_POST['idmembre']."'";
         $req = query_or_die($sql);
         
         //Mise à jour solde membre
         $sql = "UPDATE cf_solde_membre SET solde = solde + '".$_POST['gain']."' WHERE id_membre = '".$_POST['idmembre']."'";
         $req = query_or_die($sql);
         
         //Ajout table historique rémunération
         $sql = "INSERT INTO cf_historique_remuneration (id_membre, programme, date, gain, etat) VALUES ('".$_POST['idmembre']."', 'Ticket à gratter', '".$_POST['date']."', '".$_POST['gain']."', 'Validé')";
         $req = query_or_die($sql);
         
         $message = $_POST['gain']." ont été crédités sur votre compte !";
    }
    
    function query_or_die($sql) {
      return mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    }
?>

c'est pas mieux comme ca ?
n'utilise les variables $_POST directement dans tes requetes sans en avoir controlé le contenu !
utilise impérativement la fonction addslashes()
0
Sébastien724
30 déc. 2008 à 21:22
Merci desg pour ton code, cependant j'avais fait ce code au début avant que mon problème arrive.

Oui tout marche comme mon script de départ

Mais tu remarques que la participation s'enregistrera uniquement que si le membre valide le formulaire de participation
si il gratte, vois que c'est perdant et ne valide pas le formulaire mais recharge la page, bah il pourra gagner autant qu'il veut, puisqu'il choisira les tickets à valider et ceux à ne pas valider...
0

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

Posez votre question
Sébastien724
30 déc. 2008 à 21:25
PS :

Je précise que c'est un ticket à gratter des plus basic écrit en javascript et pas en flash... donc pas pareille :s
0
Utilisateur anonyme
30 déc. 2008 à 21:32
ok je n'avais pas vu cela comme ca
ta requete
$sql = "UPDATE cf_grattage SET gain = '".$_POST['gain']."' WHERE id_membre='".$_POST['idmembre']."'";
met a jour tout les gain du meme joueur !!

donc cela pose probleme :)

il te faut savoir quelle ligne de la table mettre a jour :)
0
Utilisateur anonyme
30 déc. 2008 à 21:38
ps: de la facon dont tu utilise $_POST on peut tricher sur les gains et y mettre ce qu'on veut
tu devrais utiliser pour passer la somme et toute les info que l'utlisateur n'as pas a modifier :)
0
Sébastien724
30 déc. 2008 à 21:45
[...]
 elseif (isset($_POST['participation']) && $_POST['participation'] == "oui")        {
         //Dès le chargement de la page on enregistre la participation
         $sql = "INSERT INTO cf_grattage (id_membre, date, gain, ip) VALUES ('".$_SESSION['idmembre']."', '".$date_jour."', '', '".$ip."')";
         $req = query_or_die($sql);
		 
		 $idgrattage = mysql_insert_id(); //<< j'ai récupéré l'id du dernier enregistrement et je le retrouve
               
         //On met à jour !
         $sql = "UPDATE cf_grattage SET gain = '".$_POST['gain']."' WHERE id_membre='".$_POST['idmembre']."' AND idgrattage='".$idgrattage."'"; //<< ici pour savoir ce que je met à jour !
         $req = query_or_die($sql);
[...]


voilà j'ai changé un peu, je vais tester pour voir

par contre pas compris par rapport à $_POST, comment on peut mettre ce qu'on veut :-/
0
Utilisateur anonyme
30 déc. 2008 à 21:53
les données sont envoyées par le naviguateur donc modifiable par l'utilisateur, on trouve des addons par exemple pour modifier les données envoyées via les formulaires sur firefox.
ca peut aussi aider à tester ses scripts ;)
0
Sébastien724
30 déc. 2008 à 21:56
Ah ok et euh faut que je les envoi comment alors mes données ? Oo
0
Utilisateur anonyme
30 déc. 2008 à 22:04
stock ca dans la sessions, c'est stocké coté serveur et presque transparent

essaye ca:

dans un fichier session_1.php

session_start();
$_SESSION['pwet]='coucout';

dans un fichier session_2.php

session_start();
echo $_SESSION['pwet];

tu devrais voir un jolie coucou !
la variable est transmise sans passer par le navigateur ;)

ca marche avec un identifiant de session transmis avec les cookies ou passer dans l'url, le serveur s'occupe de tout tu as juste à utiliser le code comme ca ;)
0
Sébastien724
30 déc. 2008 à 22:13
Ok je vais faire comme ça alors, merci

Cependant mon problème de départ ne bouge pas xD enfin bon

mais quant à la sécurité je vais m'y mettre ;-)
0
Utilisateur anonyme
30 déc. 2008 à 22:17
regarde si tu ne charge pas la page 2 fois sans t'en rendre compte, avec une redirection ou quelques chose comme ca
met un die() a la fin de ton code pour le stoper, et et regarde combien de participation que tu as
0
Sébastien724
30 déc. 2008 à 22:20
oui enfin dès le chargement de la page

//Dès le chargement de la page on enregistre la participation
     $sql = "INSERT INTO cf_grattage (id_membre, date, gain, ip) VALUES ('".$_SESSION['idmembre']."', '".$date_jour."', '0', '".$ip."')";
     $req = query_or_die($sql);


dès que j'enlève ce code ou que je le met dans la condition elseif... soumission du formulaire
bah plus rien s'enregistre dans la base

donc le problème viens de ce bout de code, mais il me semble correct...
moi je veux enregistrer la participation au chargement de la page, pour que le membre ne puisse pas choisir les ticket à valider, puis ensuite après validation, mettre à jour la base !
0
Sébastien724
30 déc. 2008 à 23:22
Je viens de faire un exit(); juste après

$sql = "INSERT INTO cf_grattage (id_membre, date, gain, ip) VALUES ('".$_SESSION['idmembre']."', '".$date_jour."', '0', '".$ip."')";
$req = query_or_die($sql);

et là miracle la page reste blanche et dans ma base qu'un seul enregistrement :-D, mais d'où cela peut il venir ??
c'est à dire que ma page se charge deux fois ??
0
Sébastien724
31 déc. 2008 à 00:49
Après plusieurs heures passé sur ce script, j'ai enfin trouvé

dans ma page footer.php
après la balise html, j'avais un include d'une page externe pour compter mes stats... c'est cette include qui fouter le caca pour être poli =)

en tout cas merci de m'avoir aider à chercher et surtout sur l'astuce avec les sessions plutôt que les $_post
0