Plusieurs requêtes sur 100 enregistrements. Votre avis svp

Eléphanteau du PHP | 25 Messages

18 oct. 2005, 23:41

Bonjour,

Il s'agit à la fois de logique et de connaissances en php.

Dans une table de 300 clients (caravaniers), je dois selectionner, ceux qui répondent à deux critères.(ça m'en fait 97) Il faut ensuite:
1.calculer leur consommation électrique de l'année.
2. calculer l'age des enfants pour savoir de combien d'adultes et
d'enfants se compose la famille.
3. calculer le cout de leur emplacement en fonction du type de caravane,
mobilhome ou chalet.
4.tenir compte d'eventuels petits soldes de compte!

J'ai déjà réalisé tous les scripts php qui calculent tout cela pour un seul client, en tenant compte de tous les cas de figure possible pour la consommation électrique( déjà payé, le compteur a fait le tour et affiche un index inférieur ). La 1ère requête appelle la suivante et ainsi de suite jusqu'à ce que tous les compte d'un seul num (id) soient faits


J'aimerais savoir comment vous feriez pour les calculs se fassent pour tous les clients concernés. J'avais d'abord pensé à faire exécuter toutes ces requêtes pour un premier client avec, à la fin, un petit code qui recherchait le num du suivant et renvoyait la 1ère requête à ce num.

Pour info, mon premier script recherche les clients concernés et inscrit leur num (et +) dans une nouvelle table.

J'espère ne pas avoir été trop confus :!: :!:

Mille mercis pour votre aide, vos conseils et avis.

Bien amicalement

Camomille

Mammouth du PHP | 19672 Messages

19 oct. 2005, 09:24

À première vue, il n'est pas impossible de faire une requête en un seul tour pour tout le monde, mais ça dépend de la structure de ta base de données.

Peux-tu nous illustrer ton propos avec un exemple de deux ou trois personnes par exemple (tu transposeras facilement ensuite sur 100 ou 25000.)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 25 Messages

19 oct. 2005, 11:42

Merci pour ta réponse Cyrano,

Je donne ici un aperçu de mes scripts (Vous verrez que je ne suis pas un pro !!)

première page qui sélectionne les clients et les inscrit dans une table avec un numero auto incrémenté:
$requete=mysql_db_query($sql_bdd,"INSERT INTO forfaits(Client_num, nom) 
SELECT DISTINCT num, Nom FROM clients WHERE Client_annee=1 AND EMPLACEMENT>0 
ORDER BY Nom",$db_link) or die(mysql_error());
header("Location:choix_client.php?number=0"); 
***********choix_client.php*************************************
$requetenum1=mysql_db_query($sql_bdd,"select * from forfaits where numero=$number+1",$db_link) or die(mysql_error());
$num1=mysql_result($requetenum1,0,"Client_num");
header("Location:personnes.php?num=$num1");
*********personnes.php************************
$requetemoins5 =mysql_db_query($sql_bdd, "SELECT Enfants_Prenom FROM enfants WHERE DATEDIFF( NOW(),Date_naissance) <1825 AND Client_num=$num ; ",$db_link) or die(mysql_error());
$tot=mysql_num_rows($requetemoins5);

$requete5 =mysql_db_query($sql_bdd, "SELECT Enfants_Prenom FROM enfants WHERE DATEDIFF( NOW(),Date_naissance) >1825 AND Client_num=$num ; ",$db_link) or die(mysql_error());
$tot5=mysql_num_rows($requete5);

$requete =mysql_db_query($sql_bdd, "SELECT adulte_num FROM adultes WHERE Client_num=$num ; ",$db_link) or die(mysql_error());

$totadultes=mysql_num_rows($requete);

$total=$totadultes+$tot5;

$suite=mysql_db_query($sql_bdd,"update forfaits set nb_enfants =$tot ,nb_adultes=$total where Client_num=$num",$db_link) or die(mysql_error());  
header("Location:indexes.php?num=$num");
************indexes.php***************************
$requete=mysql_db_query($sql_bdd,"SELECT * FROM appartenir WHERE Client_num=$num AND payed ='PAYE' ORDER BY Annee DESC LIMIT 0,1"  ,$db_link) or die(mysql_error());

$Index_last=mysql_result($requete,0,"releve");
$datederniere=mysql_result($requete,0,"Annee");
list($date, $time) = explode(" ", $datederniere);
list($year, $month, $day) = explode("-", $date);
$date_last = "$day-$month-$year";


$requetenew=mysql_db_query($sql_bdd,"SELECT * FROM appartenir WHERE Client_num=$num AND payed =0 ORDER BY Annee DESC LIMIT 0,1" ,$db_link) or die(mysql_error());

if(mysql_num_rows($requetenew)==0) {

$Index_new=mysql_result($requete,0,"releve");
$datenew=mysql_result($requete,0,"Annee");
list($date, $time) = explode(" ", $datenew);
list($year, $month, $day) = explode("-", $date);
$date_new = "$day-$month-$year";

} else {
$Index_new=mysql_result($requetenew,0,"releve");
$datenew=mysql_result($requetenew,0,"Annee");
list($date, $time) = explode(" ", $datenew);
list($year, $month, $day) = explode("-", $date);
$date_new = "$day-$month-$year";
}

if ($Index_new < $Index_last) {
   $conso=((10000-$Index_last)+$Index_new);
} else {
   $conso=($Index_new-$Index_last);
}

$suite=mysql_db_query($sql_bdd,"update forfaits set index_last=$Index_last,index_new=$Index_new,date_last='$date_last',date_new='$date_new',conso=$conso WHERE Client_num=$num",$db_link) or die(mysql_error());  

//header("Location:options.php?num=$num");
*********options.php***********************************
$request=mysql_db_query($sql_bdd,"select * from clients where num='$num'",$db_link) or die(mysql_error());


$solde_annee=mysql_result($request,0,"solde_annee");
$Eau=mysql_result($request,0,"Eau");
$Langue=mysql_result($request,0,"Langue");
$Type=mysql_result($request,0,"Type");
$Voiture=mysql_result($request,0,"Voiture_2");
$entretien=mysql_result($request,0,"ENTRETIEN");


$nomeau = '1';
$string_eau = "$Eau";
$string_eau = ereg_replace('-1', $nomeau, $string_eau);

$nomauto = '1';
$string_auto = "$Voiture";
$string_auto = ereg_replace('-1', $nomauto, $string_auto);


$nomentret = '1';
$string_entret = "$entretien";
$string_entret = ereg_replace('-1', $nomentret, $string_entret);


$nomtype0 = '1';
$string_type0 = "$Type";
$string_type0 = ereg_replace('0', $nomtype0, $string_type0);

$nomtype1 = '1';
$string_type1 = "$Type";
$string_type1 = ereg_replace('1', $nomtype1, $string_type1);

$nomtype2 = '1';
$string_type2 = "$Type";
$string_type2 = ereg_replace('2', $nomtype2, $string_type2);

$suite=mysql_db_query($sql_bdd,"update forfaits set standard=$string_type0,resid=$string_type1,chalet=$string_type2,eau=$string_eau,entretien=$string_entret,auto2=$string_auto WHERE Client_num=$num",$db_link) or die(mysql_error());  

mysql_close($db_link);

header("Location:next_client.php?num=$num");
************next_client.php***********************************
$requetenum1=mysql_db_query($sql_bdd,"select * from forfaits where Client_num=$num",$db_link) or die(mysql_error());

$number_next=mysql_result($requetenum1,0,"numero");

header("Location:choix_client.php?number=$number_next");
**************************************************
En haut de toutes ces pages, sauf la 1er et dernière, j'ai
$num=@$_GET["num"];
require "conf.php3" ;
Et voilà le travail! Désolé pour la tartine mais rien ne vaut un exemple!

Mille mercis pour vos conseils.

Bien amicalement

Camomille
Modifié en dernier par Camomille le 19 oct. 2005, 18:59, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 oct. 2005, 11:45

Modération : utilise les balise
 et [CODE] lorsque tu poses du code.
Cette fois çi, je le fait pour toi mais pense y la prochaine fois[/color]
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
pjl
ViPHP | 2119 Messages

19 oct. 2005, 12:14

pas la peine de mettre la charue avant les boeufs.

tant que tes requêtes ne sont pas au point, ce n'est pas la peine de les intégrer dans le php.

Eléphanteau du PHP | 25 Messages

19 oct. 2005, 19:17

OK Pjl,

je reconnais que ce n'est pas 100% au point.

Sans vouloir être prétentieux, je confirme que les deux premières requêtes(personnes.php et indexes.php) fonctionnent.
J'ai fait un essai en créant un lien pour effectuer les calculs pour le client suivant après "options.php"
$requetenum2=mysql_db_query($sql_bdd,"select * from forfaits where numero=($number+1)",$db_link) or die(mysql_error());
$number_next=mysql_result($requetenum2,0,"Client_num");
echo"<a href='personnes.php?num=$number_next'>$number_next to do>"; 
J'ai pu faire manuellement les 97 "calculs" en cliquant chaque fois sur ce lien. Il n'y a que "options.php" qui pose problème au niveau du "type". Je vais essayer de règler ça!!

Encore mille mercis pour vos avis ou conseils. Je ne demande qu'à apprendre et reconnais que ce que je vous ai présenté témoigne de mon "amateurisme" :oops: :oops:

Bien amicalement

Camomille

ViPHP
pjl
ViPHP | 2119 Messages

19 oct. 2005, 22:23

Tu mets les requêtes,
ca fait 10 lignes à lire alors que là, il faut aller les chercher dans le code.

Ensuite, pour tes 97 clients, tu dois sortir un listing unique ou 97 fiches récapitulatves ?

Eléphanteau du PHP | 25 Messages

20 oct. 2005, 01:18

Tu mets les requêtes,
ca fait 10 lignes à lire alors que là, il faut aller les chercher dans le code.
Tu ne veux pas m'en dire un peu plus svp ? J'imagine que ça fait ramer le processeur!!! Je viens de faire une serie d'essais en appelant automatiquement la requête pour le client suivant. Ca bloque toujours quelqe part. Jamais à la même place et en moyenne, après une vingtaine de clients.

Je me contenterai d'une table qui contient toutes les informations. Dans le pire des cas, je la récupère par obdc. Le but est de faire 17 lettres avec entête adresse et détail du compte au verso. Je le faisais avec Access jusqu'à présent.

Je te remercie très sincèrement pour ton aide.

Bien amicalement

Camomille