IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

problèmes sur l'implémentation d'un système de points


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Par défaut problèmes sur l'implémentation d'un système de points
    bonjour j'ai créer un script pour voté avec root top.
    les utilisateurs votant (tout en étant loger) gagne 1 point.
    mais il y a un problème :s.
    soit on peut voté no stop et gagné des points a chaque fois ...
    soit ne pas voté ^^.
    car les points sonts attribués que s'il on vote toute les 2h.
    voici ma bdd :
    Code : SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    CREATE TABLE IF NOT EXISTS `rc_accounts` (
      `account_id` int(11) unsigned NOT NULL auto_increment,
      `username` varchar(32) character set latin1 NOT NULL,
      `password` varchar(32) character set latin1 NOT NULL,
      `email` varchar(32) character set latin1 NOT NULL,
      `isdm` tinyint(4) NOT NULL default '0',
      `isbanned` tinyint(4) NOT NULL default '0',
      `ignore` text character set latin1 NOT NULL,
      `pts` int(11) NOT NULL default '0',
      `hv` bigint(20) NOT NULL,
      PRIMARY KEY  (`account_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=8 ;
     
    --
    -- Contenu de la table `rc_accounts`
    --
     
    INSERT INTO `rc_accounts` (`account_id`, `username`, `password`, `email`, `isdm`, `isbanned`, `ignore`, `pts`, `hv`) VALUES
    (1, 'neo22', '********', '*******@*******', 1, 0, '', 12, 1400);
    et voila bien entendu mon script php :

    Code : PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    session_start();
     
    $pseudo=$_SESSION['pseudo'];
     
            mysql_connect("sql.free.fr", "david.balan", "*****");
            mysql_select_db("david_balan");
     
      $sql = "SELECT  * FROM rc_accounts WHERE username='".$pseudo."'";
      $req = mysql_query($sql) or exit(mysql_error());
     
      $data = mysql_fetch_assoc($req);
     
      $points = $data['pts'] +1 ;
     
    $heure = date("Hi");
    $alerte = $heure+ 120;
     
    if($data['hv'] >= $alerte) {
     
    mysql_query("UPDATE rc_accounts SET pts ='".$points."' WHERE username='".$pseudo."'") or die(mysql_error()); 
     
    mysql_query("UPDATE rc_accounts SET hv ='" .$heure . "' WHERE username='".$pseudo."'") or die(mysql_error()); 
     
    mysql_close();
    }
     
    header('Location: http://www.root-top.com/topsite/mmorpg/in.php?ID=1207');
     
    ?>


    dans le cas du :
    Code : PHP


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($data['hv'] >= $alerte)
    on peu voté mais il n'y a pas d'incrémentation d'un point.
    Code : PHP



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($data['hv'] <= $alerte)
    on peut voté non stop et gagné 1 points a chaque fois.

    un peu d'aide serai la bienvenue.
    autrement comment sécuriser tout ca , car les :
    Code : PHP




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mysql_query("UPDATE rc_accounts SET pts ='".$points."' WHERE username='".$pseudo."'") or die(mysql_error()); 
     
    mysql_query("UPDATE rc_accounts SET hv ='" .$heure . "' WHERE username='".$pseudo."'") or die(mysql_error());


    en pleine air c'est une bonne source de hack je pence.
    et je ne pence pas mètre :
    Code : PHP





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $machin = mysql_query("UPDATE rc_accounts SET hv ='" .$heure . "' WHERE username='".$pseudo."'") or die(mysql_error());
    car le mysql_query ne va pas ce lancer dans ce cas.
    merci de votre aide
    cordialement neo

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ouille il y a de gros problemes de logique

    1 - le format de date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $heure = date("Hi");
    $alerte = $heure+ 120;
    On n'additionne pas des heures et des minutes.
    Quand il est 23h40, $alerte vaut 2460 ... il va falloir se coucher tard pour pouvoir voter.

    2 - la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($data['hv'] >= $alerte) {
    comment l'heure de son dernier vote pourrait etre supérieure à une alerte qui est dans le futur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($data['hv'] <= $alerte) {
    et inversement, l'heure de son dernier vote sera toujours inférieure au futur

    3 - la requete
    Tu peux faire tes deux mises à jour dans la meme requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("UPDATE rc_accounts SET pts ='".$points."', SET hv ='" .$heure . "' WHERE username='".$pseudo."'") or die(mysql_error());
    Je te propose la solution express suivante : tout en une seule requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    session_start();
     
    mysql_connect("sql.free.fr", "david.balan", "*****");
    mysql_select_db("david_balan");
     
    $pseudo=mysql_real_escape_string($_SESSION['pseudo']);
     
    $sql = 'UPDATE rc_accounts SET pts = pts +1, hv = NOW() 
     WHERE username="'.$pseudo.'" AND NOW() > hv + INTERVAL + 2 HOUR';
     mysql_query($sql) or die(mysql_error());
     
    if (mysql_affected_rows()) {
       echo 'Vote pris en compte';
    }
    else {
       echo 'Votre ignoré';
    }
     
    mysql_close();
     
    ?>
    On ajoute 1 à "pts" et on met "hv" à l'heure actuelle pour les enregistrements correspondant au "username" et ayant un "hv" plus vieux qu'il y a deux heures.

    Il faut par contre changer le colonne hv en format DATETIME.

    Pour le problème de hack, il faut effectivement proteger la chaine que tu incorpores.
    Imaginons que tu autorises tous les caractères comme pseudo et que quelqu'un s'enregistre sous le nom : toto" --
    Ta requete deviendra : ... WHERE username="toto";
    car -- indique un commentaire SQL donc le deuxieme critère est ignoré et le fautif peut voter a l'infini.
    On utilise donc mysql_real_escape_string sur les chaines dans les requete.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Par défaut
    okay la table devien ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    CREATE TABLE IF NOT EXISTS `rc_accounts` (
      `account_id` int(11) unsigned NOT NULL auto_increment,
      `username` varchar(32) character set latin1 NOT NULL,
      `password` varchar(32) character set latin1 NOT NULL,
      `email` varchar(32) character set latin1 NOT NULL,
      `isdm` tinyint(4) NOT NULL default '0',
      `isbanned` tinyint(4) NOT NULL default '0',
      `ignore` text character set latin1 NOT NULL,
      `pts` int(11) NOT NULL default '0',
      `hv` datetime NOT NULL,
      PRIMARY KEY  (`account_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=8 ;
     
    --
    -- Contenu de la table `rc_accounts`
    --
     
    INSERT INTO `rc_accounts` (`account_id`, `username`, `password`, `email`, `isdm`, `isbanned`, `ignore`, `pts`, `hv`) VALUES
    (1, 'neo22', '******', '*@****', 1, 0, '', 12, '0000-00-00 00:00:00');
    mais au moment de voté :

    Vote ignoré !!

    ca vien de quoi.
    ???
    cordialement neo.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ta date actuelle dans la base est nulle, change la a la main.

    Pour les futurs inscrits, il ne faudra pas oublier de remplir le champ dans ta requete d'insertion.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Par défaut
    okay ca roule merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query=mysql_query("INSERT INTO rc_accounts(username,password,email,hv) VALUES('".$username."','".$password."','".$email."','NOW()')");
    j'ai mis ce script en inscription.
    ca tourné niquel avan que je rajoute le NOW()

    quesque je fait de pas bien :s?

  7. #7
    Invité
    Invité(e)
    Par défaut
    $query=mysql_query("INSERT INTO rc_accounts(username,password,email,hv) VALUES('".$username."','".$password."','".$email."','NOW()')") or die ("Erreur Insert:".mysql_error());
    Pour avoir plus d'informations.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    NOW() est une fonction mysql, elle ne se met pas entre guillemets.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 29
    Par défaut
    merci pour vos réponse.
    ca tourne niquelle.
    cordialement neo.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur une implémentation Hibernate
    Par sam.fet dans le forum Hibernate
    Réponses: 2
    Dernier message: 13/11/2007, 06h11
  2. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo