Script Automatique (Système cron je pense)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2007, 15:28

bah tu y mets les critères permettant d'identifier les enregistrements à affecter... des ids, des dates, des ce que tu veux ..... l'autre solution consiste à ne faire qu'un update de tous les enregistrement d'un coup et de virer tout le code superflux.

D'où viennent tes $nombreServeurs et $nombreMaitres ? ils sont en base ?
Et SERVEUR_PRICE et MASTER_PRICE des constantes ?

Si c'est le cas, il te suffit juste de faire une requête du genre :
$db_link = mysql_connect($sql_serveur,$sql_user,$sql_passwd) or die ('Pb de connexion'); 

$sql = "UPDATE membre_gastro SET 
  argent = argent - (nombre_serveurs*".SERVER_PRICE." + nombre_maitres*".MASTER_PRICE.") ,
  derniere_paie = NOW()
  WHERE derniere_paie = DATE_SUB(NOW(), INTERVAL 1 DAY) ";

mysql_query($sql) or die(mysql_error());
NOW() correspond à la date du jour, DATE_SUB() permet d'oter des jours, mois ou autre et donc d'obtenir la date de la veille en supprimant 1 jour (1 DAY) :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 30 Messages

07 août 2007, 16:04

Merci, ton système fonctionne pour le timestamps et ne vide plus le champ argent mais ne calcul pas l'argent, voici le code:
<?php
require("conf_gastro.php");

// CONNEXION A LA BASE DE DONNEE
$db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd);
if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Vérifiez
les paramètres du fichier conf_gastro.php"; exit;}
$requete=mysql_db_query($sql_bdd,"select * from membre_gastro",$db_link) or die(mysql_error());
    
    // Fonction qui transforme un timestamp en nombre de jours
    function getDay($timestamp) {
    // On divise tout simplement les secondes pour obtenir des jours
    $day = floor($timestamp/(60*60*24)); // 60 secondes = 1 min, 60 min = 1 h, 24 h = 1 jour
    return ($day);
    }

    // On crée deux constantes contenant les salaires
    define ('serveur_sal', 32);
    define ('maitre_hotel_sal', 35);

    // Le timestamp actuel
    $actual = time();

    /* Avec la manipulation que tu souhaite (lecture d'un fichier ou d'une base de donnée), tu récupère dans la variable 

$last le timestamp qui a été stocké */

    // On convertit les secondes du timestamp en jours grâce à la fonction getDay()

    $now = getDay($actual);
    $before = getDay($last);

    if ($now > $before) // Si le jour est supérieur à celui marqué dans le timestamp
    // On actualise le timestamp et on calcule l'argent
    /* Je te laisse actualiser de la manière que tu souhaite le fichier ou la base de donnée, sachant qu'il faut que le 

contenu du timestamp soit $actual */
    {
    $depenses = ($serveur * serveur_sal) + (maitre_hotel * maitre_hotel_sal);
    $news_argent = ($argent - $depenses);
    }
$db_link = mysql_connect($sql_serveur,$sql_user,$sql_passwd) or die ('Pb de connexion'); 

$sql = "UPDATE membre_gastro SET 
  argent = $news_argent ,
  derniere_paie = NOW()
  WHERE derniere_paie = DATE_SUB(NOW(), INTERVAL 1 DAY) ";

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2007, 16:57

Tu peux soit faire une selection des données en base et plusieurs update utilisateur par utilisateur avec un WHERE, ou bien faire un update massif à partir des données qui sont en base pour tous les utilisateurs... il n'y a pas d'option moitié-moitié faire un select et tout updater.

Donc je réitère... à quoi correspondent : "$serveur" et "maitre_hotel" (qui a perdu son $ soit dit en passant) et d'où provient ta variable $argent ? qu'est ce qu'elle contient ? pour quel utilisateur ?

Essaye de bien définir ce que tu veux faire... ça ne sert à rien de coder tant que ce n'est pas clair pour toi (et ça ne l'est visiblement pas puisque tu n'arrêtes pas de changer le nom de tes variables :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 30 Messages

07 août 2007, 17:36

tu as raison j'ai oublié le $, mais même avec sa ne fonctionne pas, serveur et maitre_hotel sont des champs dans la base et argent aussi, le but de sa et de retiré le salaire de tout les employés et donc de modifié l'argent du membre.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 août 2007, 22:37

Alors regarde la requête que je t'ai proposé plus haut :)
UPDATE membre_gastro SET # met à jour la table membre_gastro
  derniere_paie = NOW(), # set le champ "derniere_paie" avec la date du jour
  argent = argent - (serveur *".SERVER_PRICE." + maitre_hotel *".MASTER_PRICE.") # set le champ "argent" avec le calcul : "argent (sous entendu argent actuel) moins le calcul (nombre de serveur * prix du serveur + nb maitre d'hotel * prix maitre)
  WHERE derniere_paie = DATE_SUB(NOW(), INTERVAL 1 DAY) # pour tous les enregistrement daté d'hier
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...