|
| stef59280 | Posté le 15/11/2007 @ 18:50 |
Petit astucien
344 Messages
| Bonjour, Je voudrais faire un système qui ajoute une valeur toutes les heures ; j'explique : Dans ma table j'ai un champ "argent" je voudrais que ce champ soit mis à jour toutes heures de 100€. Je ne vois vraiment pas comment faire. Je voudrais que ceci ce fasse même quand l'utilisateur est déconnecté c'est à dire que le temps est compté même si l'utilisateur à sa session de fermé. Merci d'avance pour vos réponses. Ps; je ne sais pas si ça peut vous servir mais sachez que j'ai créé un champ dans ma table qui enregistre la dernière heure de connexion du visiteur.
|
| |
| |
| Publicité |
|
|
| Malcolm | Posté le 15/11/2007 à 20:01 |
Astucien
7273 Messages
| Salut, il y a je pense 2 façons de faire, de la plus "crade" à la moins crade : 1) sur toutes les pages (ou au moins une, celle d'ouverture de session), tu mets des requêtes qui liront pour le visiteurs l'heure de dernière connexion et l'heure courante, et tu mets à jour le montant en conséquence. Avantage : calcul effectué dès qu'un utilisateur se connecte. Inconvénient : peut être gourmand en ressources. Ne s'effectue pas s'il n'y a personne de connecté, mais s'effectue lorsque la personne se connecte (ainsi on "rattrape le temps perdu"). 2) une tâche Cron sur un serveur automatique qui ira exécuter un fichier PHP à heures fixe, avec un délai que tu fixes |
| |
|
| stef59280 | Posté le 15/11/2007 à 21:34 |
Petit astucien
344 Messages
| Salut merci Donc il faudrais que je fasse un truc du genre $heure_connexion = time(); mysql_connect("***","***","***"); mysql_select_db("*****"); $requete = mysql_query ('SELECT derniere_connexion FROM membre WHERE login = '".$_SESSION['login'].'" '); while($donnees = mysql_fetch_array ($requete)) { $last_connexion = donnees['derniere_connexion']; } $derniere_connexion = $last_connexion; //donc là j'ai l'heure actuelle et aussi l'heure de dernière connexion mais je ne vois pas en quoi sa pourrait m'aider pour que 100 soit ajouté toutes les heures dans mon champ argent de ma table mysql ? Après je suis bloqué je vois pas comment faire pour ajouter 100 toutes les heures ? UPDATE argent SET = $argent +100 WHERE login = "'$_SESSION['login']; ? La méthode avec le système CRON je pense serait la meilleure mais je ne sais pas comment faire. A vrai dire je connais à peine. Modifié par stef59280 le 15/11/2007 21:38 |
| |
|
| Malcolm | Posté le 15/11/2007 à 22:16 |
Astucien
7273 Messages
| Les 2 méthodes sont exactement pareilles, si ce n'est que l'une fait les UPDATE toute seule (le Cron) alors que l'autre fait l'PDATE uniquement sur action de l'utilisateur. Elle n'est pas "crade" à ce point d'ailleurs, j'aurais du employer un autre mot. En clair, supposons un champ "argent" INT (numérique) et un champ "dateheure" au format MM/DD/YYYY HH:ii:ss par exemple. Ensuite, supposons un fichier PHP qui contient cette requête : $req_upd_argent = "UPDATE la_table SET (argent = argent + 100) WHERE login='".$login."';";
Par Cron, le serveur Cron devra rapatrier tous les utilisateurs à chaque heure, et, pour chaque login, effectuer cette requête. Sinon, à l'activation de l'utilisateur, il faudra rattrapper le temps perdu. Supposons un utilisateur qui se connecte à midi et à 20h. (argent vide à midi) avec Cron, son "compte" sera à 0 à midi. A 13h, il ajoute 100. L'utilisateur est toujours off-line. A 14h, idem. 15h, idem ... jusqu'à 20h. Si on interroge le compte à n'importe quelle heure, on trouvera toujours la somme mise dans le dernier palier, c.à.d. 500 si 17h p.ex. Sans cron, c'est l'utilisateur, qui, à sa connexion, met à jour son compte. Concrètement, il se connecte à midi : argent = 0. 13h, 15h...20h toujours zéro. Il revient à 20h, le serveur calcule la différence d'heures (8) et ajoute la somme correspondante : 800. Il faut bien entendu gérer les jours, s'il se connecte le lundi à 10h et le mardi à 9h, ça ne fait pas "-1h" mais "23h". Après, l'exécution de cette requête est exactement la même quelle que soit la méthode utilisée. |
| |
|
| stef59280 | Posté le 16/11/2007 à 19:03 |
Petit astucien
344 Messages
| Merci pour la méthode. Maintenant il faut que je trouve la traduction en php et là c'est une autre paire de manche. Je vient d'essayer mais ça ne marche pas. J'avais pensé à utiliser mktime mais bon apparrement ça ne doit pas être ça. Si quelqu'un pourrait me donner le morceau de code php qui traiterai le système de mise à jour d'un champ toutes les heures. Cela serai très gracieux de sa part. Modifié par stef59280 le 16/11/2007 20:51 |
| |
|
| stef59280 | Posté le 17/11/2007 à 17:08 |
Petit astucien
344 Messages
| UP! Ps: Je ne sais pas comment on fait pour faire un système CRON. Enfin bon je ne sais déjà pas faire le principe même c'est à dire ajouter 100 toutes les heures. Si vous pouviez m'aider merci. |
| |
|
| stef59280 | Posté le 18/11/2007 à 22:04 |
Petit astucien
344 Messages
| Vraiment personne d'autre que MALCOLM ? |
| |
|
| stef59280 | Posté le 20/11/2007 à 21:56 |
Petit astucien
344 Messages
| Bon et bien je vais aller voir sur d'autres sites, forums pour me renseigner à ce sujet car içi je n'ai plus aucune réponse. Je suis toujours ouvert à des solutions venant de votre part. Merci |
| |
|
| Malcolm | Posté le 20/11/2007 à 22:00 |
Astucien
7273 Messages
| Et l'exemple SQL que j'ai donné au dessus ne fonctionne pas ? |
| |
|
| stef59280 | Posté le 21/11/2007 à 18:28 |
Petit astucien
344 Messages
| Salut malcolm J'ai essayé plein de choses mais ça ne marche pas. Il ne se met pas à jour toutes les heures comme je le souhaite. C'est pour ça je désespère un peu et j'attendais avec impatience vos réponses. Donc toi qui est très bon en PHP (personne ne dira le contraire) est-ce que tu pourrais me présenter un petit morceau de code qui permettrait de faire ce que je souhaite. Merci d'avance |
| |
|
| Malcolm | Posté le 21/11/2007 à 21:19 |
Astucien
7273 Messages
| Bin pourtant, c'est *relativement* simple ... Voilà l'exemple de script à faire par un Cron : <?php include('connexion.php'); // faut-il expliquer ce que c'est ? $req_liste_utilisateurs = "SELECT id FROM table_utilisateurs ORDER BY id ASC;"; $liste_utilisateurs = mysql_query($req_liste_utilisateurs) or die($req_liste_utilisateurs."<br />\n".mysql_error());
// pour chacun des utilisateurs, passer son compte à + 100 while($u = mysql_fetch_array($liste_utilisateurs)) { $id = $u['id'];
// préparation de la requête mise à jour du champ 'argent' : $req_upd_argent = "UPDATE table_utilisateurs SET argent=(argent+100) WHERE id='".$id."';"; mysql_query($req_upd_argent) or die($req_upd_argent."<br />\n".mysql_error()); } ?>
Et tu t'inscris sur un site style http://webcron.org/ pour y placer ton URL. En clair, tuuploades ce fichier sur ton hébergement (attention à lui donner un nom très difficile à trouver, histoire qu'un petit malin ne te pourrisse pas tout - mieux : protégé par un mot de passe, soit en php, soit en htaccess et sur un site Cron, tu tecrées un compte, tu indiques à quelle(s) heure(s) il doit visiter l'URL ... qui correspond à cette page bien entendu. Sinon il te reste la possibilité de le faire à la main. |
| |
|
| stef59280 | Posté le 23/11/2007 à 21:22 |
Petit astucien
344 Messages
| Ah merci, entre temps, j'ai cherché une autre solution avec les timestamps mais je ne pense pas que c'est bon regardes : <?php mysql_select_db (); $requete = mysql_query("SELECT * FROM membres WHERE login='$login'"); { // Récup infos $derniere_connexion = $donnees['derniere_connexion']; } $temps = $heure_actuel - $derniere_connexion; $temps_passe = $temps /900 * 25; $requete = mysql_query("UPDATE membres SET ressources=$temps_passe WHERE login='$login'");
|
| |
|
| Malcolm | Posté le 23/11/2007 à 22:01 |
Astucien
7273 Messages
| Yahoo on va droit à la cata  plus sérieusement, ton code souffre de manque de rigueur AMHA. Rien que cette ligne : $requete = mysql_query("SELECT * FROM membres WHERE login='$login'"); contient 2 point discutables. Le premier : $login n'est pas concaténé no protégé. Si jamais tu as un utilisateur dont le login contient une apostrophe, ça va planter. (pareil pour l'UPDATE en dessous) Le second : SELECT * ... Explication sur SQL SELECT (lis le paragraphe sur le SELECT *) Une fois ceci ok,sous quelle forme est enregistré la date de dernière connexion ? |
| |
|
| stef59280 | Posté le 23/11/2007 à 23:18 |
Petit astucien
344 Messages
| Salut, Merci pour tes remarques. Ma dernière connexion est enregistrée sous forme de timestamp. J'ai créé une variable derniere_connexion = time(); et ensuite j'ai fais un UPDATE quand le membre se connecte du champ dernière connexion présent dans ma table.
Modifié par stef59280 le 23/11/2007 23:24 |
| |
|
| Malcolm | Posté le 24/11/2007 à 16:09 |
Astucien
7273 Messages
| le timestamp est donc un entier non signé d'une dizaine de chiffres ? A quoi correspond l'opération /900 *25 ? |
| |
|
| stef59280 | Posté le 24/11/2007 à 18:57 |
Petit astucien
344 Messages
| Salut, Oui mon timestamp est bien enregistré sous cette forme; il fait bien 10 chiffres. Pour ce qui en est de l'opération : Prenant 100$ = 60min, on a 1min = 100/60, soit environ 1,66666666666......... Sauf erreur. L'idéal est donc de faire en tranche de quart d'heure: 15min = 100/4 = 25$ Donc, au lieu de diviser par 3600, je divise par 900 (60*15), et je multiplie par 25, pour obtenir le nombre de (monnaie) obtenue pour ce temps |
| |
|
| Malcolm | Posté le 25/11/2007 à 00:33 |
Astucien
7273 Messages
| Ok. J'avais pas fait attention à un truc, mais tu fermes ton while (accolade fermante) juste avant l'opération, donc si tu n'as qu'un seul membre, tu ne verras pas la différence, mais si tu as plus d'1 membre (2... 3... 1000) alors le while s'exécutera X fois et $dernier_connexion prendra la valeur du dernier membre ... Donc tu ne mettras à jour qu'un seul membre. Est-ce cela que tu as prévu ? |
| |
|
| stef59280 | Posté le 25/11/2007 à 13:53 |
Petit astucien
344 Messages
| Non, tu as raison l'incolade doit être après le calcul, merci. Donc logiquement mon code devrait fonctionner non ? En modifiant le SELECT *, en mettant l'incolade après le calcul logiquement mon champ devrait se mettre à jour pour tout les membres ? |
| |
|
| Malcolm | Posté le 25/11/2007 à 23:11 |
Astucien
7273 Messages
| fais l'essai ... et tu verras  Si ça ne marche pas comme prévu : - affiche les messages d'erreurs (die mysql_error()); - affiche les requêtes qui ont provoqué les erreurs en vue de les analyser ... - affiche le contenu de variables importantes (par exemple print_r($donnees); ) |
| |
|
|
| Haut de la page |