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 :
<?php
//Config points votes :
$date = date("j");
if($date<=7){
$vote_point = 80; // Vote x2 7 premiers jours du mois.
}else{
$vote_point = 40; //vote normal
}
//Connexion aux base de données
try{
$dblogin = new PDO('mysql:host=localhost;dbname=aionswor_al_server_ls','toto','1234');
$dblogin->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbgame = new PDO('mysql:host=localhost;dbname=aionswor_al_server_gs','toto','1234');
$dbgame->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbnews = new PDO('mysql:host=localhost;dbname=aionswor_system','toto','1234');
$dbnews->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e){
die('Erreur : ' .$e->getMessage());
}
?>
Ensuite sur ma page vote :
<?php
@session_start();
require('config/db.php');
if(isset($_SESSION['idaion']) and !empty($_SESSION['idaion']))
{
$sql1 = $dblogin->prepare('SELECT * FROM account_data WHERE id=?');
$sql1->execute(array($_SESSION['idaion']));
$sql1 = $sql1->fetch();
if($_GET['vote']!=0)
{
if($_GET['vote']==18){$colone = 18; $link = $linkgowonda; $timestamp="timestamp_v1";}
elseif($_GET['vote']==20){$colone = 20; $link = $linkrpg; $timestamp="timestamp_v2";}
else
{
echo '<script>window.location="index.php?p=index";</script>';
}
if($sql1[$colone] !=0){
$lastvote_v1 = new DateTime($sql1[$colone]);
$lastvote_v1->modify("+ 2 hours");
$now = new DateTime();
$now->format("Y-m-d H:i:s")." ".$lastvote_v1->format("Y-m-d H:i:s");
if($lastvote_v1<$now)
{
$vote = (int)$sql1[19]+1;
$reward = $sql1[12] + $vote_point;
$req2 = $dblogin->prepare('UPDATE acount_data SET '.$timestamp.'=?, toll=? vote_count=? WHERE id=?');
$req2->execute(array($now->format("Y-m-d H:i:s"), $reward, $vote, $_SESSION['idaion']));
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
echo "<script>windows.location='".$link."'</script>";
}
else
{
echo '<script>window.location="index.php?p=index";</script>';
}
}
else
{
$now = new DateTime();
$now = $now->format("Y-m-d H:i:s");
$vote = (int)$sql1[19]+1;
$reward = $sql1[12] + $vote_point;
$req2 = $dblogin->prepare('UPDATE account_data SET '.$timestamp.'=?, toll=?, vote_count=? WHERE id=?');
$req2->execute(array($now, $reward, $vote, $_SESSION['idaion']));
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
echo"<script>window.location='".$link."'</script>";
}
}
else{
}
}
else{
echo'<script>window.location="index.php?p=index";</script>';
}
?>
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.
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 :
if(empty($_GET['vote']) || $_GET['vote'] != 18 || $_GET['vote'] != 20){
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)
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
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:
$req2 = $dblogin->prepare('UPDATE acount_data SET '.$timestamp.'=?, toll=? vote_count=? WHERE id=?');
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 :
( ! ) Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1) at position 0 (1): Unexpected character' in C:\wamp\www\aion-sword_1.3\vote.php on line 20
( ! ) Exception: DateTime::__construct(): Failed to parse time string (1) at position 0 (1): Unexpected character in C:\wamp\www\aion-sword_1.3\vote.php on line 20
Call Stack
# Time Memory Function Location
1 0.0003 145064 {main}( ) ..\vote.php:0
2 2.9666 178200 __construct ( ) ..\vote.php:20
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 :
if($_GET['vote']!=0)
{
if($_GET['vote']==18){$colone = 18; $link = $linkgowonda; $timestamp="timestamp_v1";}
elseif($_GET['vote']==20){$colone = 20; $link = $linkrpg; $timestamp="timestamp_v2";}
else
{
echo '<script>window.location="index.php?p=index";</script>';
}
if($sql1[$colone] !=0){
$lastvote_v1 = new Datetime($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é :
$now->format("Y-m-d H:i:s")." ".$lastvote_v1->format("Y-m-d H:i:s");
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 :
echo '<script>window.location="index.php?p=index";</script>';
par
header('Location index?p=index');
die();
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 ^^
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 :
$vote = (int)$sql1[19]+1;
$reward = $sql1[12] + $vote_point;
$req2 = $dblogin->prepare('UPDATE acount_data SET '.$timestamp.'=?, toll=? vote_count=? WHERE id=?');
$req2->execute(array($now->format("Y-m-d H:i:s"), $reward, $vote, $_SESSION['idaion']));
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
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 :
<?php
if(isset($_SESSION['idaion']) and !empty($_SESSION['idaion'])){
$sql1 = $dblogin->prepare('SELECT * FROM account_data WHERE id=?');
$sql1->execute(array($_SESSION['idaion']));
$results = $sql1->fetch();
if(empty($_GET['vote']) || $_GET['vote'] != 18 || $_GET['vote'] != 20){
header('Location: index?p=index');
}
if($_GET['vote'] == 18){
$link = $linkgowonda;
$column = 'timestamp_v1';
}elseif($_GET['vote'] == 20){
$link = $linkrpg;
$column = 'timestamp_v2';
}
$last = new DateTime($results[$column]);
$last->modify("+ 2 hours");
$now = new DateTime();
if($last < $now) {
$reward = $results['toll'] + $vote_point;
$query = $dblogin->prepare("UPDATE account_data SET $column=NOW(), toll=:toll, vote_count= vote_count + 1 WHERE id=:id");
$query->bindParam(':toll', $reward);
$query->bindParam(':id', $_SESSION['idaion']);
$query->execute();
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
header("Location:$link");
}
} else {
header('Location:index?p=index');
}
?>
Edit : merci @Carouge10, c'est corrigé
Bizarre, il n'y a aucune référence à $link à cette ligne; Tu peux poster le code de vote.php s'il te plait ?
<?php
session_start();
require('config/db.php');
if(isset($_SESSION['idaion']) and !empty($_SESSION['idaion'])){
$sql1 = $dblogin->prepare('SELECT * FROM account_data WHERE id=?');
$sql1->execute(array($_SESSION['idaion']));
$results = $sql1->fetch();
if(empty($_GET['vote']) || $_GET['vote'] != 18 || $_GET['vote'] != 20){
echo"<script>window.location='".$link."'</script>";
}
if($_GET['vote'] == 18){
$link = $linkgowonda;
$column = 'timestamp_v1';
}elseif($_GET['vote'] == 20){
$link = $linkrpg;
$column = 'timestamp_v2';
}
$last = new DateTime($results[$column]);
$last->modify("+ 2 hours");
$now = new DateTime();
if($last < $now) {
$reward = $results['toll'] + $vote_point;
$query = $dblogin->prepare("UPDATE account_data SET $column=NOW(), toll=:toll, vote_count= vote_count + 1 WHERE id=:id");
$query->bindParam(':toll', $reward);
$query->bindParam(':id', $_SESSION['idaion']);
$query->execute();
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
header("Location:$link");
}
} else {
echo'<script>window.location="index.php?p=index";</script>';
}
?>
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 :-)
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.
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 :
<?php
if(isset($_SESSION['idaion']) and !empty($_SESSION['idaion'])){
$sql1 = $dblogin->prepare('SELECT * FROM account_data WHERE id=?');
$sql1->execute(array($_SESSION['idaion']));
$results = $sql1->fetch();
if(empty($_GET['vote']) || $_GET['vote'] != 18 || $_GET['vote'] != 20){
echo'<script>window.location="index.php?p=index";</script>';
}
if($_GET['vote'] == 18){
$link = $linkgowonda;
$column = 'timestamp_v1';
}elseif($_GET['vote'] == 20){
$link = $linkrpg;
$column = 'timestamp_v2';
}
$last = new DateTime($results[$column]);
$last->modify("+ 2 hours");
$now = new DateTime();
if($last < $now) {
$reward = $results['toll'] + $vote_point;
$query = $dblogin->prepare("UPDATE account_data SET $column=NOW(), toll=:toll, vote_count= vote_count + 1 WHERE id=:id");
$query->bindParam(':toll', $reward);
$query->bindParam(':id', $_SESSION['idaion']);
$query->execute();
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
header("Location:$link");
}
} else {
echo'<script>window.location="index.php?p=index";</script>';
}
?>
J'ai bien compris qu'au niveau de l'erreur, le problème vient du
header("Location:$link");
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>....
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
<?php
session_start();
require('config/db.php');
j'ai vérifié si il y avait le moindre espace avant une balise <?php et rien d'anormal, nada....
Le voici :
<?php
//Réseau sociaux :
$fb="https://www.facebook.com/aionsword4.6";
$tw="https://twitter.com/aionsword";
$ts="ts3server://94.23.16.195:8524";
//Lien des votes :
$linkrpg = 'http://www.rpg-paradize.com/?page=vote&vote=101063';
$linkgowonda = 'http://www.gowonda.com/vote.php?server_id=5791';
//Informations serveur :
$serveur = 'Aion Sword';
$version = '4.6.2';
$forum = 'http://forum.aion-sword.fr';
$access_level = "8";
//Serveur de jeu et Teamspeak :
$host_ls = 'xx.xx.xx.xxx';
$port_ls = 2106;
$host_gs = 'xx.xx.xx.xxx';
$port_gs = 7777;
$host_ts = 'xx.xx.xx.xxx';
$port_ts = 10011;
//Config points votes :
$date = date("j");
if($date<=7){
$vote_point = 80; // Vote x2 7 premiers jours du mois.
}else{
$vote_point = 40; //vote normal
}
//Connexion aux base de données
try{
$dblogin = new PDO('mysql:host=localhost;dbname=db','root',' ');
$dblogin->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbgame = new PDO('mysql:host=localhost;dbname=db','root',' ');
$dbgame->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbnews = new PDO('mysql:host=localhost;dbname=db','root',' ');
$dbnews->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbnews->exec("SET CHARACTER SET utf8");
}
catch (Exception $e){
die('Erreur : ' .$e->getMessage());
}
//Planning Forteresse :
$fortolundi1[0]="/"; // Nom premiere forteresse Lundi
$fortolundi1[1]="/"; // Heure premiere forteresse Lundi
$fortolundi2[0]="Asteria/roah"; // Nom deuxieme forteresse Lundi
$fortolundi2[1]="21h"; // Heure deuxieme forteresse Lundi
$fortomardi1[0]="Tiamaranta"; // Nom premiere forteresse mardi
$fortomardi1[1]="18h"; // Heure premiere forteresse mardi
$fortomardi2[0]="KKM"; // Nom deuxieme forteresse mardi
$fortomardi2[1]="21h"; // Heure deuxieme forteresse mardi
$fortomercredi1[0]="/"; // Nom premiere forteresse mercredi
$fortomercredi1[1]="/"; // Heure premiere forteresse mercredi
$fortomercredi2[0]="Sillus"; // Nom deuxieme forteresse mercredi
$fortomercredi2[1]="21h"; // Heure deuxieme forteresse mercredi
$fortojeudi1[0]="Event"; // Nom premiere forteresse jeudi
$fortojeudi1[1]="Toute la journée"; // Heure premiere forteresse jeudi
$fortojeudi2[0]="Event"; // Nom deuxieme forteresse jeudi
$fortojeudi2[1]="Toute la journée"; // Heure deuxieme forteresse jeudi
$fortovendredi1[0]="Tiamaranta"; // Nom premiere forteresse vendredi
$fortovendredi1[1]="18h"; // Heure premiere forteresse vendredi
$fortovendredi2[0]="Bassen/prades"; // Nom deuxieme forteresse vendredi
$fortovendredi2[1]="21h"; // Heure deuxieme forteresse vendredi
$fortosamedi1[0]="/"; // Nom premiere forteresse samedi
$fortosamedi1[1]="/"; // Heure premiere forteresse samedi
$fortosamedi2[0]="Divine"; // Nom deuxieme forteresse samedi
$fortosamedi2[1]="21h"; // Heure deuxieme forteresse samedi
$fortodimanche1[0]="Inggison/Gelkmaros"; // Nom premiere forteresse dimanche
$fortodimanche1[1]="18h"; // Heure premiere forteresse dimanche
$fortodimanche2[0]="Siel/souffre"; // Nom deuxieme forteresse dimanche
$fortodimanche2[1]="21h"; // Heure deuxieme forteresse dimanche
?>
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:
<?php
session_start();
require('config/db.php');
if(isset($_SESSION['idaion']) && !empty($_SESSION['idaion'])){
// Si le vote est différent des valeurs ci-dessous, alores redirection vers index
if(empty($_GET['vote']) || $_GET['vote'] != 18 || $_GET['vote'] != 20){
header("Location: index.php?p=index");
die();
}
if($_GET['vote'] == 18){
$link = $linkgowonda;
$column = 'timestamp_v1';
}elseif($_GET['vote'] == 20){
$link = $linkrpg;
$column = 'timestamp_v2';
}
$sql1 = $dblogin->prepare('SELECT * FROM account_data WHERE id = ?');
$sql1->execute(array($_SESSION['idaion']));
$results = $sql1->fetch();
$last = new DateTime($results[$column]);
$last->modify("+ 2 hours");
$now = new DateTime();
if($last < $now) {
$reward = $results['toll'] + $vote_point;
$query = $dblogin->prepare("UPDATE account_data SET $column = NOW(), toll = :toll, vote_count = vote_count + 1 WHERE id = :id");
$query->bindParam(':toll', $reward);
$query->bindParam(':id', $_SESSION['idaion']);
$query->execute();
$_SESSION['voteaion'] += 1;
$_SESSION['pointaion'] += $vote_point;
header("Location: $link");
die();
}
} else {
header("Location: index.php?p=index");
}
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.
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.