Il n'y a pas les corrections qu'on a déjà vu ensemble
Il n'y a pas les corrections qu'on a déjà vu ensemble
J'ai pas été plus loin mais y'a déjà une erreur à la première ligne où il manque le marqueur "?" :
devrait être :
Code : Sélectionner tout - Visualiser dans une fenêtre à part "SELECT time FROM votes WHERE ip="
EDIT : Arf je viens de voir que j'ai posté en même temps que sabotage. Du coup effectivement il vaut mieux que tu partes du code corrigé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "SELECT time FROM votes WHERE ip = ?"
oui merci de me le rappeler, je l'avais enlevé pour essayer un truc et j'ai oublié de le remettre :-/
alors je vous transmet le code, voilà le souci qui se pose:
je peux voter avec tout le monde (A peut voter même quand B vote avant) ors ça m'affiche que je dois attendre 120min mais ça m'envoie vers la page de vote en même temps :-/
dans le code que je vous donne, j'ai enlevé la ligne double INSERT et rajouté le "?".
si tu parles de l'opti que tu avais fait en une seule ligne, je la garde pour après car la j'y vois plus clair^^
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 { // recupération de la ligne de vote de l'utilisateur $sql = $db1->prepare("SELECT time FROM votes WHERE ip=?"); $retour = $sql->execute([$_SESSION['id']]); if ($retour) { // la requête s'est bien passée $data = $sql->fetch(PDO::FETCH_ASSOC); // ligne sous forme de tableau associatif $now = time(); // le temps enregistré est il supérieur à maintenant ? if($data['time'] > $now) { // oui il est supérieur le vote n'est pas possible // temps restant à attendre avant le prochain vote $time_calc = ceil(((int) $data['time'] - $now) / 60); echo "<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre " . $time_calc . " minutes avant de pouvoir revoter !</p></fieldset>\n"; } else { // non le temps enregistré est inférieur à maintenant, l'utilisateur peut revoter // // ici traitememt du nouveau vote // ... } } else { // traitement de l'erreur de la requête // ... } $time_vote = 7200; $time_db = time() + $time_vote; $sql = "INSERT INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')"; $sql = $db1->prepare($sql); $sql->execute(); $a = get_info($_SESSION['id'],'point'); $b = get_info($_SESSION['id'],'pts_vote'); $point1 = $vote + $a; $point2 = 1 + $b; $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); $sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); //header('Location:'.$rpg.''); echo '<meta http-equiv="refresh" content="0; url='.$rpg.'">'; }
(mais je ten remercie en tout cas )
Est-ce que tout ton bazar à partir deÇa ne devrait pas être le traitement de vote ? Car je suppose qu'on commence un timer et qu'on met à jour les points quand l'utilisateur vote non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part $time_vote = 7200;
Dans ton code actuel, on a toujours la redirection à la fin quoi qu'il se soit passé avant.
Au passage pour l'insertion, il vaut mieux utiliser REPLACE que INSERT car sinon ton utilisateur va être coincé sur son premier timer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $sql = $db1->execute("REPLACE INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')";);
alors je dois être le premier et leader des benêts parce que ta ligne (qui en efface 3 de chez moi) me donne une erreur de synthax et quand je place le dit bazar au dessus des fonction sql, ça me fait pareil et quand je met l'écho (qui redirige vers la page de vote si le timer est bon) dans un else prévu à cet effet, ça me bloque pour 120min :-/
je vais tester avec un autre bout de ce code (l'ancienne version avant celle que je vous est montré, voir si en modifiant, ça fonctionne mieux)
Autres remarques en complément :
1/ Tu devrais utiliser un header Location en php plutôt que de faire afficher un méta.
2/ On conseille aux débutants de toujours utiliser des requêtes préparées pour des problèmes de sécurité mais il faut utiliser des marqueurs et passer tes variables dans un tableau dans le execute() ou sinon les binder individuellement. Sinon la préparation n'apportent strictement rien et la requête n'est en rien sécurisée.
Eventuellement dans des cas basiques sans variables externes ou quand tu es absolument sûr de tes variables (genre castées numériquement avec un intval par exemple) tu peux utiliser query. C'est un peu plus rapide à écrire et très légèrement plus rapide à l'exécution. Mais bon l'habitude d'utiliser systématiquement des requêtes préparées est une bonne chose, encore faut-il utiliser des marqueurs si tu veux qu'elles servent à quelque chose.
3/ Avant d'être "le premier et leader des benêts" tu es surtout débutant et comme bien d'entre eux tu codes sans avoir suffisamment de bases. Il faut que tu comprenne absolument tout ce que tu fais, ne pas hésiter à isoler des bout de codes pour les tester séparément dans des pages distinctes de l'ensemble de ton code, et/ou faire afficher tes résultats et variables (avec un echo ou un var_dump pour les tableaux et objets) à différents endroits de ton code pour bien comprendre ce qui se passe. La précipitation et l'impatience sont tes principaux ennemis
je te remercie grandement de ton aide et de tes conseils, il est vrai que je n'ai pas l'habitude de tester morceau par morceau le code et que je suis impatient dans le genre :$
Mais oui, tu as raison, dans une entreprise comme ça, partir tête baissée n'est pas la bonne solution, je vais garder cette page en favori histoire de ne pas oublier vos conseils et votre aide, car après c'est grâce à vous que la j'ai réussi à faire fonctionner mon système et je vous dois quelque chose pour sur
(ça serait bête de refaire la même erreur plusieurs fois)
tout le crédit vous revient, vous êtes top merci encore^^
voilà donc le code qui fonctionne^^
oui je n'ai pas mis le header location, ni la soluce de sabotage dans le code que je vous montre, mais je le mettrais dans la version définitive^^
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
31
32
33
34
35
36
37
38
39 $time_vote = '7200'; $time_db = time()+$time_vote; $sql = "SELECT time FROM votes WHERE ip='".$_SESSION['id']."' "; $sql = $db1->prepare($sql); $sql->execute(); $nbRow = $sql->rowCount(); if($nbRow > 0) { $data = $sql->fetch(PDO::FETCH_ASSOC); $time_wait = $data['time']; $time_now = time(); $time_calc = $time_wait-$time_now; $time_calc2 = (int)($time_calc/60); echo "<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre ".$time_calc2." minutes avant de pouvoir revoter !</p></fieldset>\n"; } else{ $sql = "REPLACE INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')"; $sql = $db1->prepare($sql); $sql->execute(); $a = get_info($_SESSION['id'],'point'); $b = get_info($_SESSION['id'],'pts_vote'); $point1 = $vote + $a; $point2 = 1 + $b; $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); $sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); //header('Location:'.$rpg.''); echo '<meta http-equiv="refresh" content="0; url='.$rpg.'">'; }
(que je mettrais sur le post par la suite^^)
Re,
Encore une fois il est inutile de faire des requêtes préparées si tu ne lie aucune variable à aucun marqueur.
Donc :
devrait être remplacé par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $sql = "REPLACE INTO votes (ip,time) VALUES ('".$_SESSION['id']."', '".$time_db."')"; $sql = $db1->prepare($sql); $sql->execute();
Evites de faire un code trop approximatif car c'est prendre de mauvaises habitudes. Surtout que le second code est plus facile à écrire et la requête est fonctionnelle et sécurisée dans tous les cas. Alors que dans le premier code elle ne fonctionne et n'est sécurisée que parce que les variables sont numériques et ne peuvent pas être manipulées par le visiteur, sinon cela deviendrait un trou de sécurité majeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $sql = "REPLACE INTO votes (ip,time) VALUES (?, ?)"; $sql = $db1->prepare($sql); $sql->execute(array($_SESSION['id'],$time_db));
d'accord je remplace^^
Si je comprend bien, pour la fonction "header" il faut que je vire tout les "echo" et que je la déclare en haut de la page avant de remplacer les "echo" par les "header".?
Tu peux mettre les header où tu veux mais toujours avant de faire afficher quelque chose CF doc - donc avant un echo mais normalement on ne met jamais d'écho directement dans un code php sinon par l'intermédiaire d'une fonction qui sera appelée depuis le html.
Un exemple de headers définissant un content-type et des redirections. Celui concernant le content-type est mis en première ligne pour que tout le code qui suit soit impacté mais ce n'est pas une obligation.
Attention cependant que le contexte qui défini la condition d'envoi des headers de redirection ne soit pas identique au rechargement de la page sinon c'est la boucle infinie (et le navigateur t'enverra un message comme quoi la page n'est pas bien redirigée).
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
31
32
33
34
35
36
37
38
39
40
41 <?php header('Content-type: text/html; charset=UTF-8'); $a = isset($_GET['a']) ? $_GET['a'] : null; // pour test depuis les liens html mais normalement c'est ton code qui fait les conditions if ($a == "0") { header('Location: ?message=0'); exit; } else if($a > 0) { header('Location: ?message=1'); exit; } else if($a < 0) { header('Location: ?message=2'); exit; } $message = isset($_GET['message']) ? $_GET['message'] : null; switch ($message) { case "0" : $alerte = '<p style="color:black">a est égal à 0</p>'; break; case "1" : $alerte = '<p style="color:green">a est supérieur à 0</p>'; break; case "2" : $alerte = '<p style="color:red">a est inférieur à 0</p>'; break; default : $alerte = null; } ?> <!DOCTYPE HTML> <html> <head> </head> <body> <p><a href="?a=0">a = 0</a> <a href="?a=12">a = 12</a> <a href="?a=-50">a = -50</a></p> <?= $alerte?> </body> </html>
Par exemple :
Là c'est trivial, mais $b pourrait être le résultat d'une requête qui s'effectue à chaque rechargement de la page par exemple. Dans ce genre de cas pour éviter la boucle infinie tu pourrais faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $b = 'toto'; if ($b == "toto") { header('Location: ?message=5'); exit; } //...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $b = 'toto'; if ($b == "toto") { if(!(isset($_GET['message']) && $_GET['message'] == "5")) { header('Location: ?message=5'); exit; } } //...
Voilà comment j'ai fait les "header", mais ça me met un erreur comme quoi l'info est déjà envoyée :-/
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 $time_vote = '7200'; $time_db = time()+$time_vote; $sql = "SELECT time FROM votes WHERE ip='".$_SESSION['id']."' "; $sql = $db1->prepare($sql); $sql->execute(); $nbRow = $sql->rowCount(); if($nbRow > 0) { $data = $sql->fetch(PDO::FETCH_ASSOC); $time_wait = $data['time']; $time_now = time(); $time_calc = $time_wait-$time_now; $time_calc2 = (int)($time_calc/60); header('"<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre ".$time_calc2." minutes avant de pouvoir revoter !</p></fieldset>\n"'); } else{ $sql = "REPLACE INTO votes (ip,time) VALUES (?, ?)"; $sql = $db1->prepare($sql); $sql->execute(array($_SESSION['id'],$time_db)); $a = get_info($_SESSION['id'],'point'); $b = get_info($_SESSION['id'],'pts_vote'); $point1 = $vote + $a; $point2 = 1 + $b; $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); $sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); header('http-equiv="refresh" content="0; url='.$rpg.'); } ?> <br /> </div> <div class="borderCenterBottom"></div><br /> </div> </div> <div class="floatClear"></div> <div class="bottomCenter"></div> </div> </div> <?php header('location: inc/menu_right.php'); ?>
Salut,
A quoi ça sert que je donne un exemple complet ? L' as-tu tester dans une page séparée pour t'exercer et comprendre le fonctionnement pour renvoyer des messages ?
il me sers grandement je te promet, mais ça me grise le code à chaque fois, et me met des erreurs, je m'y planche mais IRL mon métier n'étant pas ça, le temps peut me manquer pour m'y concentrer à fond comme je voudrais.(je ne cherche pas d'excuse, je t'explique).
Le premier code d'exemple que j'ai donné est complet et peut être testé dans une page autonome distincte. Tu vois bien que tous les header de redirection commencent par LocationEn fait puisque je ne mets pas de nom de fichier et qu'il commencent tous pas "?", par défaut cela indique la page en cours et ce qui suis le point d'interrogation indique une variable $_GET et sa valeur que tu peux donc récupérer pour en faire ce que tu veux :
-> renverra sur la page en cours avec une variable $_GET['message'] = 2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 header('Location: ?message=2'); exit;
Dans mon code je fais un switch sur $_GET['message'] pour renvoyer finalement un message dans le html mais tu pourrais l'utiliser autrement. Comme déjà dit tu en fais ce que tu veux.
ah oui, effectivement :p
voilà comment j'ai procédé et ça fonctionne^^
après, il y a le haut, dont je ne suis pas sur, mais pour le coup, je suis content que ça fonctionne
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 <?php header ('Content-type: text/html; charset=UTF-8'); ?> <div class="colRight floatLeft"> <div class="titlesCenter floatLeft"><span class="title uppercase">VOTEZ</span></div> <div class="floatClear"></div> <div class="bgCenter"><span class="effect effectCenter"></span> <div class="blockContent"> <div class="borderCenterTop"></div> <div class="borderCenterMiddle"> <div class="pageTitleBg pageTitleBg"><h1>Votez pour nous.!</h1></div> <?php $time_vote = '7200'; $time_db = time()+$time_vote; $sql = "SELECT time FROM votes WHERE ip='".$_SESSION['id']."' "; $sql = $db1->prepare($sql); $sql->execute(); $nbRow = $sql->rowCount(); if($nbRow > 0) { $data = $sql->fetch(PDO::FETCH_ASSOC); $time_wait = $data['time']; $time_now = time(); $time_calc = $time_wait-$time_now; $time_calc2 = (int)($time_calc/60); header('"<fieldset class=\"erreur\"><p class=\"red\">Vous devez attendre ".$time_calc2." minutes avant de pouvoir revoter !</p></fieldset>\n"'); } else{ $sql = "REPLACE INTO votes (ip,time) VALUES (?, ?)"; $sql = $db1->prepare($sql); $sql->execute(array($_SESSION['id'],$time_db)); $a = get_info($_SESSION['id'],'point'); $b = get_info($_SESSION['id'],'pts_vote'); $point1 = $vote + $a; $point2 = 1 + $b; $sql = "UPDATE accounts SET point=$point1 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); $sql = "UPDATE accounts SET pts_vote=$point2 WHERE guid='".$_SESSION['id']."'"; $sql = $db2->prepare($sql); $sql->execute(); header('Location:'.$rpg.''); } ?>
Première ligne, le paramètre a à nouveau disparu de la requête. Je n'ai pas été plus loin.
le code est plus long cette fois, si tu parles de la première ligne par rapport à ce que je vous avez donné avant, c'est normal^^
sinon je ne vois pas de où tu parles :-/
Pardon je n'ai pas répondu au bon message
ce n'est pas grave
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager