> Tous les forumsForum des Webmasters

 mise à jour d'un champ dans msql toutes les heures
Statut du sujet : NON RESOLU Imprimer
 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.

 Afficher le profil de stef59280Envoyer un message privé à stef59280
 
 
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

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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.

Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 stef59280  Posté le 18/11/2007 à 22:04  
Petit astucien

344 Messages
Vraiment personne d'autre que MALCOLM ?
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 Malcolm  Posté le 20/11/2007 à 22:00  
  Astucien


7273 Messages
Et l'exemple SQL que j'ai donné au dessus ne fonctionne pas ?
Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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

Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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 :

  1. <?php
  2. $heure_actuel = time();
  3. mysql_select_db ();
  4. $requete = mysql_query("SELECT * FROM membres WHERE login='$login'");
  5. while ($donnees = mysql_fetch_array($requete))
  6. {
  7. // Récup infos
  8. $derniere_connexion = $donnees['derniere_connexion'];
  9. }
  10. $temps = $heure_actuel - $derniere_connexion;
  11. $temps_passe = $temps /900 * 25;
  12. $requete = mysql_query("UPDATE membres SET ressources=$temps_passe WHERE login='$login'");

Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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 ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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 ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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

Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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 ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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 ?
Afficher le profil de stef59280Envoyer un message privé à stef59280
 Revenir en haut de la page
 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); )

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
Haut de la page 
Inscrivez-vous !
- Posez vos questions

- Résolvez vos problèmes

- Aidez les autres

- Participez et créez vos discussions

- Dialoguez en privé avec d'autres membres

- Suivez vos sujets préférés

- Affichez les signatures des membres

TOUT EST GRATUIT !

Je crée mon compte




Vous avez besoin d'aide ?
Des centaines d'experts sont à votre disposition sur les forums PC Astuces pour vous aider gratuitement, 24h/24, 7j/7.

Les derniers sujets résolus !
 

 > Tous les forumsForum des Webmasters

 
Forum PC Astuces© 1997-2008 WebastucesAller en haut de la page