[PHP] Addition de points avec MySQL problème
Résolu
Bonjour,
Je suis en train de monter un site internet de jeu avec des points, j'ai créer dans ma base de donnée une variable "points" qui est à 0 par défaut puisque l'on commence par 0 lors de la création du compte. Lorsque l'on gagne à un jeu on est redirigé vers une page avec ce code qui est sensé ajouter 0.05 point au compte de l'utilisateur :
En ce qui concerne la connexion à la base un code PHP s'en occupe un peu plus haut.
Je ne comprend pas ce qui se passe; quand je vais sur la page les points ne sont pas ajoutés.
Pouvez-vous m'aider ?
merci d'avance
Cordialement
Sylvain
Je suis en train de monter un site internet de jeu avec des points, j'ai créer dans ma base de donnée une variable "points" qui est à 0 par défaut puisque l'on commence par 0 lors de la création du compte. Lorsque l'on gagne à un jeu on est redirigé vers une page avec ce code qui est sensé ajouter 0.05 point au compte de l'utilisateur :
$pointfin = $points+0.05;
mysql_query("UPDATE membres SET points='. $pointfin .' WHERE id='$id'") or die ('Erreur : '.mysql_error());
echo'<br>Vous avez '. $pointfin .' point';
En ce qui concerne la connexion à la base un code PHP s'en occupe un peu plus haut.
Je ne comprend pas ce qui se passe; quand je vais sur la page les points ne sont pas ajoutés.
Pouvez-vous m'aider ?
merci d'avance
Cordialement
Sylvain
Configuration: Windows XP Firefox 2.0.0.14
32 réponses
Résumé de la discussion
Plusieurs utilisateurs rencontrent un souci lors de l'incrémentation des points dans MySQL via PHP: un script tente d'ajouter 0,05 au compteur 'points' mais l'UPDATE ne s'applique pas. Des réponses préconisent de récupérer les points actuels, d'ajouter 0,05, puis d'exécuter l'UPDATE sans guillemets autour de la valeur lorsque le champ est un entier. En pratique, privilégier UPDATE membres SET points = $pointfin WHERE id = '$id' et éviter les guillemets autour d'un INT lorsque la colonne est numérique. D'autres remarquent que si le champ est INT, il vaut mieux utiliser des décimaux compatibles ou stocker comme DECIMAL; sinon l'incrément peut être perdu.
-
Bon courage alors pour les partiels et RDV mercredi aprèm sur le site.
@+ -
Bon lancement alors.
Je viendrais voir ce qu'il donne si j'ai le temps. Et ouais les partiels ça bouffe un temps monstre :( -
J'ai détecté le problème, le site sera entièrement lancé mercredi à 14h si tout va bien.
Cordialement
Sylvain -
a y est ton site est de nouveau accessible^^
-
bah là je t'ai dit je ne suis pas plus compétent qu'un autre... Soit c'est un problème de serveur et tu n'as qu'une chose à faire : attendre. Soit tu t'es fait typiaker et dans ce cas si ton hébergeur est fermé aujourd'hui tu peux toujours essayer de remettre un fichier simple sur le serveur pour voir si t'y as toujours accès.
Et sinon je suis désolé mais hormis attendre que le sav de ton hébergeur se remette à travailler... Je ne vois pas quoi faire.
Mais en même temps je ne suis pas du tout spécialiste de l'hébergement donc mon avis vaut ce qu'il vaut mais il ne vaut pas plus que ça.
Ouvre un nouveau topic si tu veux sur ce sujet précis pour essayer d'avoir l'avis d'un expert. -
C'est assez étrange ce qui se passe; quand je veux aller sur le site il m'envoie sur un dossier inexistant : installation.
Cordialement
Sylvain -
Merci beaucoup,
je suis chez un petit hébergeur qui monte, qui monte. Durant le mois de mai ils ont travaillés presque tous les jours fériés donc aujourd'hui ils ferment. Je vais voir pour mon site.
Cordialement
Sylvain -
Là par contre je ne vais rien pouvoir faire pour toi si tu ne peux plus accéder à ton site.
Tu est chez quel hébergeur ? parce qu'un hébergeur qui ne travaille pas les jours semi-férié comme aujourd'hui je ne trouve pas çà super sérieux.
D'autre part tu n'aurais pas dû mettre ton site en ligne avant de l'avoir totalement terminé. En général un site non terminé comporte des failles et peut être sujet à des attaques en tout genre. Mais bon espérons que ce n'est pas ce qui t'arrive et que c'est juste un problème de serveur ou autre.
Bon courage.
Je reste à ta disposition si jamais t'as besoin de moi -
Merci beaucoup, je vais essayer tout ça mais je pense que je ferais un script où dès que l'heure est supérieure à 00:00 ça ajoute 6 parties. Je ne sais pas ce qui se passe, il doit y avoir un problème parce que je n'arrive plus à accéder au site kdoplus.teleloire.com .
Merci pour tout
Cordialement
Sylvain -
Tu peux me remercier si tu veux mais me féliciter.... Je me sent tout honteux d'avoir laisser passer une erreur con comme ces guillemets mais bon passons.
Sinon pour ta fonction il me semble bien que ça existe mais je ne suis pas sûr (et je ne l'ai plus en tête si elle existe). Ce que tu peux faire par contre c'est noter dans ta base la dernière fois que le joueur a joué avec la fonction time.
Par exemple :$tps_derneir_jeu = time();
et quand le joueur réessaye de jouer tu vérifie que le timestamp est supérieur à $tps_dernier_jeu + 86400.
En gros ça donnerais, pour la vérification :$sql = mysql_query("SELECT time FROM..... WHERE id = '$id'); $table=mysql_fetch_array($sql) or die(mysql_error()); $tps_dernier_jeu = $table['time']; $tps_nouveau_jeu = time(); if (($tps_dernier_jeu + 86400) <= $tps_nouveau_jeu ) { //le script de ton jeu } else { echo "désolé mais vous ne pouvez jouer qu'une fois toutes les 24 heures"; }
J'espère que je suis clair^^ -
C'était bien FLOAT qu'il fallait mettre; tout fonctionne parfaitement à présent et je te félicite et te remercie !
Désolé mais j'aurais juste une petit question ; est-ce qu'il existe un code qui ne peut fonctionner qu'une fois par jour ? (pour l'ajout automatique de parties) ?
Merci d'avance
Cordialement
Sylvain -
Encore une fois excuse moi de pas y avoir pensé plus tôt mais si tu mets DECIMAL (ou DEC je sais plus) ou FLOAT à la place de INT ça marchera
-
Le code ne marche pas cependant quand je fais gagner 1 point à l'utilisateur ça marche !.
Le problème vient donc du 0.05 point. Il ne doit pas aimer les virgules mais le problème c'est que je suis obligé d'utiliser des virgules sinon ça fait beaucoup trop de points et puis ça m'empêche de proposer certains services qui ne font pas gagner beaucoup de points.
As-tu une solution ?
Merci beaucoup pour toute cette aide, grâce à toi j'ai presque fini mon site de jeux gratuits; il ne me restera plus qu'à sécurisé ma page gain.php et ajouter quelques fonctions.
Cordialement
Sylvain -
Oui en fait c'est tout con mais j'y ai pensé que avant d'envoyer le dernier message : vu que tes points sont des chiffres (INT) tu ne dois pas mettre de guillemets sinon ce n'est pas considéré comme un INT et donc pas mis à jour.
Et donc normalement cela devrait fonctionner :<?php session_start(); // Aller chercher les configurations My SQL et verifier l'identite de la personne connectée require_once('config.php'); require_once('verifications.php'); // Récupération du nombre de points $sql = mysql_query("SELECT points FROM nom_de_ta_table WHERE id='$id'"); $result = mysql_fetch_array($sql) or die(mysql_error()); $points = $result[0]; // Calcul des points $pointfin = $points+0.05; // Operation mysql_query("UPDATE membres SET points = $pointfin WHERE id='$id'") or die ('Erreur : '.mysql_error()); // Rappel le nombre de points echo'<br/>Vous avez '. $pointfin .' points'; ?>
Tout ça pour ça... Je suis vraiment désolé de ne pas y avoir pensé plus tôt -
J'ai essayé le premier code et rien ne changeait par contre dans le deuxième le nombre de point passait bien à 3 ! Je vais essayer de réfléchir à comment modifier cette ligne.
Cordialement
Sylvain -
Enfin ta preuve je veux bien^^ sauf qu'il faut être connecté^^ Mais je te fais confiance.
Pas grave on va tenter autre chose. Si tu fais :
mysql_query("UPDATE membres SET points = '3' WHERE id='$id'") or die ('Erreur : '.mysql_error());
Est-ce que ça marche ? (est ce que les points sont à 3 ?
Si oui : essaye de faire ça :<?php session_start(); // Aller chercher les configurations My SQL et verifier l'identite de la personne connectée require_once('config.php'); require_once('verifications.php'); // Récupération du nombre de points $sql = mysql_query("SELECT points FROM nom_de_ta_table WHERE id='$id'"); $result = mysql_fetch_array($sql) or die(mysql_error()); $points = $result[0]; echo "avant chgmt, l'id $id avait $points points<br/>"; // Calcul des points $pointfin = $points+0.05; echo "normalement après l'update il devrait avoir $pointfin points<br/>"; // Operation mysql_query("UPDATE membres SET points='". $pointfin ."' WHERE id='$id'") or die ('Erreur : '.mysql_error()); // Rappel le nombre de points echo'<br/>Vous avez '. $pointfin .' points'; ?>
Et si non : essaye ça :
mysql_query("UPDATE membres SET points = 3 WHERE id='$id'") or die ('Erreur : '.mysql_error()); -
J'ai essayé et effectivement ça m'affiche mon ID (c'est à dire 3). Il reconnait donc bien l'ID de la personne.
echo'<br/>Vous avez '. $pointfin .' points. Votre ID est '. $id . '';
Cordialement
Sylvain -
Si tu fais un echo $id; au tout début de ton script, ça te donne quoi ?
-
C'est une très bonne remarque; le problème vient, à mon avis, de là. Pourtant $id correspond bien à l'ID de la personne qui est connecté. Donc $id ne devrait pas poser de problème. Par exemple quand j'afficher $pseudo ça m'affiche bien mon pseudo et pourtant il y en a plusieurs.
Cordialement
Sylvain -
INT correspond bien à ce qu'il te faut (tu sais on peut se tutoyer c'est quand même plus convivial ;) ) étant donné que tu utilises des chiffres.
Le result[0] correspond à la première donnée du tableau dans lequel j'ai mis les résultats de ma requête sql ($result = mysql_fetch_array($sql)). Il est vrai qu'au début ça surprend mais je t'assures que tableau[0] correspond bien à la première donnée.
Maintenant passons à ton ID. Je veux bien que cet ID soit contenu dans la base MySQL. Encore faut-il que tu en informe ton script php. Et pour ce faire il faudrait que tu m'indiques comment tu sais quel est l'utilisateur qui arrive à cette page gain.php ?
Je veux dire par là : quelle donnée te permet de savoir que c'est l'utilisateur ayant l'ID 23 et non celui ayant l'ID 69 qui est présent sur ta page et donc que c'est à lui que tu dois ajouter 0,5 points.
- 1
- 2
Suivant