Modifier la valeur existante d'un champ par une fonction de cette valeur [Résolu]

Signaler
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009
-
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009
-
Bonjour à tous ,


Voilà mon problème :


Je fais tourner un petit script en php afin que la valeur d'une donnée d'un de mes champs soit modifiée à une date précise :


<?php


$timestamp= mktime( 18,00,00,date("m"),date("d"),date("Y"))-time();


if ( $timestamp <= 0 ) {


echo $row_Recordset1['prix_ttc'] * 0.99 ;
}
else  {
echo $row_Recordset1['prix_ttc'];
}


?>


En l'occurence , le prix passe de x à x*0.99 à 18H .


Je souhaite alors que cette nouvelle valeur de prix ( x*0.99 ) remplace l'ancienne ( x ) dans le champ pvc_ttc de ma table shop_monnaies ( pour tous les id ) .


J'ai vu que pour remplacer une donnée il fallait utiliser :
UPDATE ; mais il faut alors préciser une valeur et là , je bloque ...


Quelqu'un peut-il m'aider ?


 

33 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Re Habroc,

Que veux dire browser ?
= > navigateur (Internet explorer, firefox, ...)

Je fais fausse route ?...
=> dans le code non, mais pour que ce code soit exécuté il faut qu'il soit appelé.
En somme il faut que quelqu'un appelle la page entre 23h59:59:000 et 23h59:59:999 pour que ta condition "$timestamp" soit valide, autant dire que c'est impossible.

Je pense, et c'est pour cela que je te posais des questions, qu'il y a un problème de conception et de méthode.
Il y a sans aucun doute une autre logique a adopter, mais sans réponse à mes questions je ne peux pas t'aider plus.

La requête que je t'ai donnée doit fonctionner mais ce n'est pas pour autant que ton pb sera règlé.

Kohntark -
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

J'ai tenté ceci , mais tous les prix sont mis à zéro dans phpmyadmin ; de meme si je fais l'update après echo $newPrice et de meme si j'enlève les ' qui encadre pvc_ttc*0.99 . Que puis-je tenter d'autre ? De quoi exactement as-tu besoin pour m'aider davantage ? Remarque : J'utilise Internet Explorer pour observer le résultat de mon script ( réalisé avec dreamweaver ) .
 

<?php


$timestamp= mktime( 23,59,59,date("m"),date("d"),date("Y"))-time();




if ( $timestamp > 0) {
$newPrice = $row_Recordset1['prix_ttc'];


} else  {
$newPrice = $row_Recordset1['prix_ttc']*0.99;


mysql_query("UPDATE shop_monnaies SET prix_ttc = 'pvc_ttc*0.99' ");
}


echo $newPrice ;




?>
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Je ne fais que passer.
Ce n'est pas mysql_query("UPDATE shop_monnaies SET prix_ttc = ' pvc_ttc *0.99' ");
mais
mysql_query("UPDATE shop_monnaies SET prix_ttc = prix_ttc*0.99");

Kohntark -
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Voilà ce qui arrive quand on ne fait pas la sieste ...Je ré-essaye ce soir ...
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Merci , merci beaucoup ... ça marche ...et donc le problème : Modifer la veur existante d'un champ par une fonction de cette valeur , est résolu .

Pourtant , tu avais encore raison quand tu disais :

Je fais fausse route ?...
=> dans le code non, mais pour que ce code soit exécuté il faut qu'il soit appelé.
En somme il faut que quelqu'un appelle la page entre 23h59:59:000 et 23h59:59:999 pour que ta condition "$timestamp" soit valide, autant dire que c'est impossible.

En effet , j'ai  bien essayé de mettre :
<<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??><st1:place>
META
</st1:place>
 HTTP-EQUIV=REFRESH CONTENT=5>

dans le HEAD , mais alors que la page est effectivement rafraichie , le script qui fonctionne sans cette consigne , ne fonctionne plus . 

Y-a-t-il , par conséquent , une méthode pour insérer dans le script , ce que je fais en cliquant sur les flèches vertes inversées ( actualiser ) de Internet Explorer ?
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Je me répète : la méthode que tu souhaites utilisée n'est pas bonne

Tu pourrais toujours faire un truc du genre :
while(true) {
    $timestamp = ....;
    if ($timestamp === 0) update de la table
}
> pas beau, oblige a laisser le browser ouvert sur la page, prend énormément de ressources, bugs mutiples en vue puisque ça dépends de la vitesse de ton pc : pc fortement occupé > pas d'update; pc rapide => plusieurs update, etc ... etc ...

Une solution, fiable celle là, serait de créer une tâche automatique (comme pour le planificateur de tâches windows) qui lance ton update tous les jours à minuit.
=> le problème est que certains hébergeurs ne proposent pas cette fonctionnatité.

Si c'est le cas tu peux essayer de faire ça :
Tu ajoutes un champ "ttc_last_update" de type CHAR (2) à ta table shop_monnaies qui contiendra le jour de la dernière maj.
Il reste ensuite à exécuter cette requête :

UPDATE shop_monnaies SET price = price*0.99, ttc_last_update=DATE_FORMAT(CURDATE(),'%d')
WHERE ttc_last_update <> DATE_FORMAT(CURDATE(),'%d')

Le défaut de cette solution est qu'elle est exécutée à chaque appel de la page, ce qui ralenti les performances. En même temps, sur 1000 enregistrements elle ne prends que 0.0013 sec si aucun update n'est nécessaire. Il est cependant possible de limiter son appel (sessions, cookies ...)

Cordialement,

Kohntark -
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Bonjour Kohntark ,


J'ai du raté quelque chose ...


Voilà le script , après que j'ai créé le champ ttc_last_update ( CHAR(2) dans ma table shop_monnaies ..

<?php


$timestamp= mktime( 23,59,59,date("m"),date("d"),date("Y"))-time();




if ( $timestamp > 0) {
$newPrice = $row_Recordset1['prix_ttc'];


} else  {
$newPrice = $row_Recordset1['prix_ttc']*0.99;


mysql_query("UPDATE shop_monnaies SET prix_ttc = prix_ttc*0.99, ttc_last_update=DATE_FORMAT(CURDATE(),'%d')
WHERE ttc_last_update <> DATE_FORMAT(CURDATE(),'%d') ");


}


echo $newPrice ;




?>

Malheusement , si je n'actualise pas la page moi-meme , il ne se passe rien ...
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Je me suis mal exprimé.
Tu n'as que la requête à mettre, et rien d'autre (pas de $timestamp, de $newprice, de condition etc ...), uniquement  :

mysql_query("UPDATE shop_monnaies SET prix_ttc = prix_ttc*0.99, ttc_last_update=DATE_FORMAT(CURDATE(),'%d')
WHERE ttc_last_update <> DATE_FORMAT(CURDATE(),'%d') ");

Pour expliquer un peu la requête :
SET prix_ttc = prix_ttc*0.99, ttc_last_update=DATE_FORMAT(CURDATE(),'%d')
=> multiplie par 0.99 les enregistrements et modifie le champ ttc_last_update à la date du jour

WHERE ttc_last_update <> DATE_FORMAT(CURDATE(),'%d')
=> modifie uniquement les enregistrements pour lesquels la valeur de ttc_last_update est différente du jour en cours ('05' pour aujourd'hui)

Ainsi tous les enregistrements sont mis à jour 1 seul fois par jour dès que le premier utilisateur appelle la page.

Kohntark -
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Merci , merci beaucoup ! C'est top !

Je vais juste essayer de rajouter un event scheduler pour etre sur que le script soit exécuter quotidiennement à minuit . Je n'en ai encore jamais fait , mais je suis en train de lire la procédure ...

Encore merci pour cette approche différente mais tellement plus simple de ce que je voulais obtenir .

Habroc
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Je vais juste essayer de rajouter un event scheduler pour etre sur que le script soit exécuter quotidiennement à minuit

=>
Le seul risque qu'il y a avec ma requête est qu'il n'y ait aucun visiteur pendant 24 heures (ou plus), l'update ne se fera alors pas. Après, le fait que cet update se fasse à minuit ou à 14 heures n'a aucune importance dès lors qu'il sera fait avant l'affichage de la page du premier visiteur de la journée.
Si tu n'optes pas pour le scheduler il est simple de modifier la requête pour qu'elle mette à jour correctement les prix même en l'absence de visiteur (ds ce cas il suffit de l'éxécuter autant de fois qu'il y a de jours depuis le dernier update)

Si tu passes par un scheduler tu peux supprimer la colonne ajoutée et faire s'éxécuter cette requête:
mysql_query("UPDATE shop_monnaies SET prix_ttc = prix_ttc*0.99");

Bon courage,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Puis j'y pense, tu devrais modifier ta requête ainsi :
UPDATE shop_monnaies SET prix_ttc = ROUND(prix_ttc*0.99, 2), ttc_last_update=DATE_FORMAT(CURDATE(),'%d')
WHERE ttc_last_update <> DATE_FORMAT(CURDATE(),'%d')

Ca te permettra de ne pas te trimballer des dizaines de chiffres après la virgule.
Par contre vérifie que les arrondis effectués te conviennent, sauf erreur de ma part ils peuvent qqfois varier d'une machine à l'autre.

Kohntark -
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Je veux bien la requete simple sans passer par un scheduler qui permette de mettre à jour les prix meme en l'absence de visiteurs ...Au moins , je serais sur de ne pas avoir de problème avec mon hébergeur . Et c'est trés exactement ce que je cherche à faire ...

Habroc
Messages postés
31
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
21 septembre 2009

Encore moi ,


Faute de maitriser le php ( je ne sais pas cmment faire pour que l'update ait lieu avant l'affichage de la page du premier visiteur de la journée.), j'ai tenté un schedule dans mysql ...mais là rien ...


Voilà ce que j'ai fait :


mysql > USE facevspileun  ( c'est le nom de ma base )  
             CREATE EVENT prix_en_baisse ON SCHEDULE EVERY 1 DAY STARTS CURRENT_DATE+ INTERVAL 1 DAY + INTERVAL 1 SECOND DO UPDATE shop_monnaies SET prix_ttc = prix_ttc * 0.99 ;

A priori , j'étais content ...

Dans mon script php , il y a
<?php echo $row_Recordset1['prix_ttc'];
?>

Mais lorsque je me place sur internet explorer après minuit , rien ...pas de changement dans le champ prix_ttc ...
Je suppose qu'il y a une astuce avec l'évènement prix_en_baisse ...
SVP , encore un peu d'aide ...

habroc