Bon essai effectuer au delà des 2 heures prévues, résultat impeccable, aucune erreur, je suis vraiment ravi. Merci à vous qui m'avez sacrément retirer une épine du pied.
Bonjour, je suis actuellement en train de coder un système de vote pour mon site internet de mon jeu en ligne. Le principe étant de rajouter à chaque fois 40 points utilisable dans la boutique en jeu à chaque fois qu'un joueur vote tous les 2 heures.
Dans ma base de donnée j'ai rajouté 3 colonnes (timestamp_v1, vote_count, timestamp_v2) .
Malheureusement après essai, cà fait tout sauf ce que je veux... le délai des 2 heures pour les points n'est pas respecté, on clique 10x on obtiendra 10x les 40 points... et surtout je me retrouve en 2 clics avec une valeur à 2016 pour la colonne vote_count et de là, impossible d'avoir la valeur qui change, en gros la donnée est plantée...
Voici le code de mon système de vote :
Tout d'abord la partie config nécessaire à la connexion PDO :
Ensuite sur ma page vote :
Voilà, tout conseil ou astuce afin que ce script marche et que je passe à la suite et le bienvenue, étant donné que çà fait une semaine que je suis dessus, j'en ai plus que marre.
Merci à tous ceux qui prendront le temps de lire ce message et merci à ceux qui répondront également.
38 réponses
Bonjour,
Avez-vous comparer $lastvote_v1 et $now pour vérifier qu'ils sont correcte ?
Il me semble qu'il n'y pas d'espace entre "+" et "2" dans $lastvote_v1->modify("+ 2 hours");
Il manque une virgule dans la requête:
tout d'abord, merci pour m'avoir signaler mon oubli de virgule, je me suis aperçu aussi que j'avais oublié un 'c' à account_data.
J'ai donc corrigé ceci et je me retrouve maintenant avec cette erreur :
Par ailleurs lorsque je clic sur le bouton correspondant au $colone = 20, il m'envoie un offset undefined ligne 19 avant de basculer sur le site de référencement pour voter(RPG-PARADIZE);
Code de de la ligne 11 à 19 :
Que vaut $sql1[$colone] ?
18 et 20 suivant la page appelé (18 et 20 correspondant à l'emplacement de timestamp_v1 et timestamp_v2 dans la table account_data
Ce n'est pas la valeur de $colone que je désire, là je savais (^_^)
Faite un var_dump($sql1[$colone]); et dites moi ce qui est affiché.
alors avec le var_dump il m'affiche string '2016' (length=4) et c'est la valeur que je retrouve à chaque fois dans la colonne vote _count dès que çà plante ou du moins c'est peut être à cause de çà que çà plante
D'accord
Donc comment voulez-vous convertir une année en année + mois + jour.... ?
De plus, je pense que la syntaxer de cette ligne est erroné :
Bah de toute manière, la valeur '2016' ne devrait même pas apparaitre dans la colonne vote_count, elle devrait s'incrémenter de 1 en 1...
Il va falloir que je revois cette partie du code...
N'hésiter pas à faire des var_dump pour vérifier que les données sont conformes à vos attentes.
Si vous n'avez pas de html avant ce code, remplacer les :
par
Bonjour,
de manière plus générale je trouve la conception trop complexe pour la fonctionnalité voulue.
Ce que je ferais :
Description des tables
La table users contient les utilisateurs et leurs informations associées
users(id, ..., count_vote)
La table votes contient chaque vote enregistré (ce qui permet de pouvoir mettre le compteur de la table users à tout moment)
votes(id, created, ..., #user_id)
La table lock_vote, empêche un utilisateur de re-voter avant 2heures
lock_vote(id, user_id, #end)
Exemple :
1er vote de l'utilisateur :
Un utilisateur portant l'id 15 vote à 15h30 :
Dans la table votes on enregistre son vote avec la date du vote.
Dans la table lock_vote on enregistre l'id de l'utilisateur et l'heure à la quelle il pourra re-voter.
2eme vote de l'utilisateur :
On check dans la table lock_vote s'il y a un verrou, c'est à dire s'il y a l'id de l'utilisateur avec une date de "end" qui n'est pas encore dépassée. Si c'est le cas l'utilisateur ne peut pas voté. Si la date est dépassée on supprime le verrou et on peut procéder au vote.
Voilà mon approche après je comprends que tu ne veuilles pas forcement tout changer. Si tu es interessé, je pourrai approfondir au besoin.
Bonne continuation.
ma restriction principale est notamment sur le fait que les bases de données sont avant tout celle du serveur de jeu ( la table account_data est composé de :
(id,name,password,activated,access_level,membership,old_membership,last_server,last_ip,last_mac,ip_force,expire,toll,email,question,answer , balance ) à laquelle j'ai rajouté à la fin les 3 colonnes sus mentionné plus haut.
la colonne toll est pour le nombre de points que possède le joueur en ayant voté toutes les deux heures
Bah entre tout changer et que çà fonctionne et rien changé et que çà fonctionne pas, je préfère que çà fonctionne tant qu'à faire ^^
De rien n'oublie pas de marquer la réponse qui a résolu ton problème ;)
Ok dans un premier temps je vais essayer de bien comprendre ce que tu veux faire.
Peux-tu me dire à quoi correspondent timestamp_v1 et timestamp_v2 ?
Et aussi comment tu fais pour stocker les points ? Dans quelle table et eventuellement dans quelle partie du code que tu as posté ?
Merci, on va y arriver :)
Edit : je prends la direction de faire fonctionner ton code existant... après on verra l'amélioration si possible.
timestamp v_1 et v_2 correspondent au heure ou l'utilisateur a voté sur RPGparadize et sur Gowonda. Les points sont stockés dans la table account_data au même endroit que le login , mot de passe , ip,ect...
les points sont envoyés lors de l'UPDATE :
dans la requête timestamp = heure du dernier vote, toll = les points, vote_count = le nombre de fois que cette personne a voté.
Ok,
dis moi si ce code fonctionne :
Edit : merci @Carouge10, c'est corrigé
@connected : il manque les : dans le 1er header... (^_^)
Quand on vote pour la première fois aucun problème les timestamp s'ajoute bien et le vote_count affiche bien +2 votes effectués, les points sont bien ajoutés. Mais si on tente de revoter :
on obtient l'erreur :
Notice : Undefined variable: link in C:\www\aion....\votephp?vote=18 on line 6 , correspondant :
En effet, comme il recharge le script et que column 18 ou column 20 n'est plus vide, il recherche la variable link correspondant (si j'ai bien compris l'erreur)
Bizarre, il n'y a aucune référence à $link à cette ligne; Tu peux poster le code de vote.php s'il te plait ?
Et j'ai remis les window.location comme mes boutons ne sont pas placé dans le header.
bah en fait j'ai trouvé ma bourde lol.... J'ai mis un $link dans le echo"<script>window.location='".$link."'</script>";
Edit : Je relancerais deux votes dans deux heures et je te tiendrais au courant Connected :-)
Je me disais bien ... lol
Donc tout est bon ?
Bonsoir, je reviens vers vous car je me retrouve avec une erreur ennuyeuse concernant mon système de vote qui fonctionne parfaitement en local grâce au code fournit par Connected. Malheureusement ce soir, j'ai voulu mettre le site sur le serveur mutualisé et au moment du test pour les votes voici l'erreur que j'ai eu :
PHP Warning: Cannot modify header information - headers already sent by (output started at /home/aionswor/public_html/vote.php:15) in /home/aionswor/public_html/vote.php on line 35
Je remets le code de Connected :
J'ai bien compris qu'au niveau de l'erreur, le problème vient du
Mais je sèche complètement quand à la solution pour résoudre ce problème.
Merci d'avance pour ceux qui pourront m'aider.
Quand on fait appel à un header, il ne faut pas qu'il y ait de code html avant, ni de < script>....
Ok merci, j'ai encore beaucoup de chose à apprendre :)
bon j'ai remplacé tout les < script> par header, il n'y a donc que du php et malgré tout, lors du clic sur le bouton, c'est 2 erreurs maintenant :
Warning: Cannot modify header information - headers already sent by (output started at /home/aionswor/public_html/config/db.php:1) in /home/aionswor/public_html/vote.php on line 10
Warning: Cannot modify header information - headers already sent by (output started at /home/aionswor/public_html/config/db.php:1) in /home/aionswor/public_html/vote.php on line 31
y aurait t-il un problème avec
j'ai vérifié si il y avait le moindre espace avant une balise <?php et rien d'anormal, nada....
Puis-je voir le fichier db ? Caché les éléments sensibles
Le voici :
Je ne vois rien d'anormale dans le fichier db hormie le fait qu'il ne faut pas fermer la balise php s'il n'y a pas de html derrière. Le serveur la fermera et cela évite d'avoir un espace ou tout autre caractère qui pourrait se glisser.
J'ai un peu modifier le fichier vote pour essayer de trouver l'erreur:
j'ai testé ce que tu as mis, et l'on revient toujours à la même erreur. Est ce que l'erreur pourrait venir d'une autre page ?
Edit : j'ai du merder quelque part, plusieurs autres pages me mettent la même erreur.
Qu'elle est l'organisation de votre site, la page vote est-elle incluse dans une autre ?
l'organisation de haut en bas est de cette manière :
config => db.php
css => fichier .css
download => fichier téléchargeable
img => images
js => fichier javascript ( animation des boutons du site, slider,ect;)
modules => fichier requis pour exécuter un ajout de news, différentes fonctions pour l'inscription)
page => toutes les pages de contenu
template => tous les includes des différentes parties de l'affichage du site
admin.php
index.php
vote.php
logout.php
et comme je précise (sur WAMP) le site marche parfaitement. Donc je dois certainement avoir une gestion d'erreur sur mon serveur mutualisé que je n'ai pas activé sur WAMP...
Edit : Je viens de lire sur un site en faisant des recherches qu'il ne faut jamais utilisé la fonction header() si un session_start() est avant ? Le problème viendrait-il de cette raison ?
Non, je l'utilise sur plusieurs de mes sites et cela ne pose aucun problème.
La page vote est-elle incluse dans une autre page ?
non Carouge10, mes deux boutons (vote.php?vote=18 et vote.php?vote=20) sont placés dans une div qui elle même est inclue dans le fichier index.php placé à la racine du site. ma page vote.php est donc uniquement appelé lorsque l'on clique sur l'un des boutons.
Mettez un die("Je suis connecté"); avant la déclaration des tableaux dans le fichier config et voyez si vous avez toujours une erreur.
Si aucune erreur, déplacer ce die et voyez là où la page plante.
Bon bah l'erreur était toute bête, j'avais fais une erreur dans une autre page ou un session_start était inclue avec dans la page index.php
Encore un problème de résolu. (^_^)