Pas mal de requêtes et plantage !!

cs_Camomille Messages postés 7 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 5 avril 2008 - 3 avril 2008 à 23:43
Axe971 Messages postés 75 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 9 janvier 2009 - 5 avril 2008 à 01:27
salut à vous,

  sans en être certain, je crois que la " boucle" pourrait m'aider à faire ce que je veux. J'ai toujours négligé cette méconnaissance et finis par m'en mordre les doigts !!

  Je vous explique par l'exemple ce que je veux en caricaturant quelque peu :

Une table contient une centaine de clients avec le montant de leur ardoise au 1er janvier, la somme déjà payée, une majoration mensuelle forfaitaire qui peut varier d'un client à l'autre! J'aimerais tous les mois, exécuter une suite de requêtes qui ajouterait la majoration (personalisée) aux clients qui n'ont pas règlé leur ardoise ( solde > 0 )

voici mes premières portions de code:
============================================================================================
// TROUVER LES CLIENTS CONCERNES ET LE MONTANT DE LEURS MAJORATIONS
$mois=date("m");
$requete=mysql_db_query($sql_bdd,"select * from payements where maj <$mois AND solde > 0 ORDER BY numero",$db_link) or die(mysql_error());
$retard=mysql_result($requete,0,"retard");
$penalty=mysql_result($requete,0,"penalty");
===================================================================================================
# mise à jour de la table via un autre fichier:
===================================================================================================
$mois= date("m");


 $newpenalty= $penalty + $retard;
$suite=mysql_db_query($sql_bdd,"update payements set penalty =$newpenalty, maj=$mois  where Client_num=$num",$db_link) or die(mysql_error()); 
=================================================================================================
"retard" est le montant personalisé de la majoration, "penalty" est les montant actuel des majorations des retard des mois précédents et maj est le mois de la dernière mise à jour de cette majorations.

  J'ai déjà fait des tas d'essais dont je ne suis pas fier !! #^==""--!! ] . Quen pensez-vous, vous qui avez l'habitude de jouer avec ces requêtes ???
  Je ne demande pas de m'écrire mon code mais quelques bons conseils et indications. Je bricole à tatons sans trop savoir quelle est la meilleure orientation à suivre !!

  Chaque client est identifié par son 'Client_num". Comme cette table a été crée par un  "INSERT INTO payements(Client_num,nom,Prenom,ardoise,.................)
SELECT DISTINCT FROM.... " , une numerotation continue a été générée!

  Mille mercis pour votre patience, compassion ou bonne volonté d'aider un débutant ;)
 
 
Bien amicalement.

Camomille

6 réponses

Axe971 Messages postés 75 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 9 janvier 2009 2
4 avril 2008 à 00:33
Salut,

Je pense que tu peux faire ceci avec une seule requête :

"UPDATE payements SET penalty = penalty + retard WHERE maj <$mois AND solde > 0;"

Bonne chance,
0
cs_Camomille Messages postés 7 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 5 avril 2008
4 avril 2008 à 21:19
Merci pour ta réponse!

   Ton update fonctionnerait sans problème si tous les clients avaient le même "$retard" !!

  J'ai continué mes recherches avec mon manque d'exercice et ma tendance à faire compliqué. Je vous soumets mes portions de script qui fonctionne en calant après une trentaine d'updates. Ne riez pas trop svp !!!

1° pour compter les enregistrements:
<?php

$numero=@$_GET["numero"];

require "connect.php3" ;

$requete=mysql_db_query($sql_bdd,"select * from payements ",$db_link) or die(mysql_error());

$max=mysql_num_rows($requete);

header("Location:newmensuel.php?numero=$numero&max=$max+1");

 

?>

==================================================================================================
2° Sélection des clients concernés (newmensuel.php)  :

<?
$numero=@$_GET["numero"];

$max=@$_GET["max"];

require("connect.php3");

$next=($numero + 1);

$mois=date("m");

if ($numero < $max)

{

$requete=mysql_db_query($sql_bdd,"select * from payements where numero =$numero",$db_link) or die(mysql_error());

$solde=mysql_result($requete,0,"solde");

$retard=mysql_result($requete,0,"retard");

$penalty=mysql_result($requete,0,"penalty");

$maj=mysql_result($requete,0,"maj");

$newpenalty=$penalty + $retard;

if ($solde > "0" AND $maj < "$mois")

header("Location:mensuel_valide.php?numero=$numero&newpenalty=$newpenalty&maj=$mois&max=$max");

else

header("Location:newmensuel.php?numero=$next&max=$max ");

}

else

header("Location:apercu_forfaits.php ");

?>

=================================================================================================

3° mon "mensuel_valide.php" :

<?php

$numero=@$_GET["numero"];

$max=@$_GET["max"];

$newpenalty=@$_GET["newpenalty"];

$maj=@$_GET["maj"];

$next=($numero + 1);

require "connect.php3" ;

 

$request=mysql_db_query($sql_bdd,"update payements set penalty =$newpenalty, maj=$maj where numero=$numero",$db_link) or die(mysql_error());

header("Location:newmensuel.php?numero=$next&max=$max ");

?>

   Que pensez-vous de mon "bricolage" ? Ca marche sur une trentaine d'enregistrements sans problème mais pas sur les 98 enregistrements actuellements présents!

J'aimerais vraiment apprendre à coder plus proprement. A force de tester dans son coin sans vrai prof, on continue à faire les mêmes erreurs. Les livres ne remplacent jamais un bon prof non plus. Si vous pouvez me conseiller une bonne méthode d'apprentissage, je suis preneur!!

Merci pour vos bons conseils .

Bien amicalement.

Camomille
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 21:21
Hello,

je n'interviens pas pour grand chose : parce que j'approuve totalement la réponse d'Axe971. Et cela sera sûrement la solution à tes problèmes. Tu peux résuler en 1 requête ce que tu fais en X requêtes.
Non, mon intervention n'a qu'un seul but : te dire merci, Camomille. Parce qu'en ces temps troubles, il est très agréable de trouver sur PHPCS un message clair, écrit en BON français, et dégageant une bonne humeur reposante.  Voilà tout.
Merci aussi à Axe, hein...dont la réponse est polie, directe, et apporte la solution. Mais avouons qu'il était facile de répondre cor'rectement à une question posée de cette manière :-) Ceci dit : merci aussi Axe :-)
Voilà c'est tout, il s'agissait du message d'un admin fatigué... ;-)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 21:23
Ah, tu as répondu, Camomille, mais tu n'as pas vraiment tenu compte de la réponse : tu continues à faire un SELECT quand ton UPDATE pourrait contenir ses conditions (les conditions du SELECT). A mon sens, tes header() sont en trop : fais ton update directement. OU alors, je n'ai pas compris la finalité du bin's.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Camomille Messages postés 7 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 5 avril 2008
5 avril 2008 à 00:01
Vous êtes formidables!!
  Je viens polluer votre forum avec des lignes de code inutiles et au lieu de me répondre d'aller apprendre à coder, c'est un flot de gentillesse et d'amabilité que vous m'envoyez! Croyez bien que cela m'a touché et fait grand plaisir!!
 Je me sens de mieux en mieux "chez vous" et je tâcherai de venir plus souvent, sans attendre qu'un problème me pousse à demander de l'aide !!!

  Voyant votre insistance, j'ai oublié mes premières intuitions pour appliquer la réponse de Axe. Incroyable ce qu'on peut faire en une ligne ! J'essayerai de comprendre cette logique et de l'appliquer aux autres scripts tortueux que j'ai  déjà pu pondre!

  Rien que pour se faire plaisir, voici ce que sont devenues ma trentaine de lignes de code:

<?php

require "connect.php3" ;

$mois=date("m");

$request=mysql_db_query($sql_bdd,"UPDATE payements SET maj=$mois,penalty = penalty + retard WHERE maj <$mois AND solde > 0",$db_link) or die(mysql_error());

header("Location:apercu_forfaits.php");

?>

  Merci à toi l'Admin pour ton amabilité et à toi, Axe pour m'avoir sérieusement ouvert les yeux  ;)

Bien amicalement.

Camomille
0
Axe971 Messages postés 75 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 9 janvier 2009 2
5 avril 2008 à 01:27
Merci merci, de tant de remerciements. C'est toujours un plaisir d'aider. Et de plus quand c'est clair effectivement c'est plus facile


 


Allez bon dév messieurs
0