IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Requêtes multiples et en boucle


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Par défaut Requêtes multiples et en boucle
    Salut à vous,

    je patauge depuis des années avec mon fameux script en trouvant chaque fois des solution "à peu près" et loin d'être "propres".

    Cette fois ci, je me suis décidé à braver le ridicule en vous exposant ce que j'ai pondu.Accrochez-vous, ce n'est pas joli et certains pros sensibles feraient mieux de fermer les yeux

    Une petite explication sur le but du script. Il s'agit de faire le calcul du compte annuel des clients d'un terrain de camping.

    1ère étape: Sélection des clients à l'année et insertion des leurs infos dans la table "payements".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete=mysql_db_query($sql_bdd,"INSERT INTO payements(Client_num,titre, nom,Prenom,emplacement,Adresse,Code_Postal,Ville,Pays,Type,solde_annee,langue) 
    SELECT DISTINCT num,titre, Nom, Prenom,EMPLACEMENT, Adresse, Code_postal,Ville,Pays,Type,solde_annee,Langue FROM clients WHERE Client_annee=1 AND EMPLACEMENT>0 
    ORDER BY Nom",$db_link) or die(mysql_error());
    Un header revoie vers la seconde partie (calcul.php):

    1. calcul du nombre de personnes et d'enfants de moins de 5 ans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $requetemoins5 =mysql_db_query($sql_bdd, "SELECT Enfants_Prenom FROM enfants WHERE DATEDIFF( NOW(),Date_naissance) <1825 AND Client_num=$num AND Compris = 1; ",$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 AND Compris = 1; ",$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;
    2.Calcul de la consommation électrique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $requete_compteur=mysql_db_query($sql_bdd,"select * from compteurs where Client_num='$num'",$db_link) or die(mysql_error());
    $Compteur_num=mysql_result($requete_compteur,0,"Compteur_num");
     
    $requete_index=mysql_db_query($sql_bdd,"SELECT * FROM appartenir WHERE Client_num=$num AND payed ='PAYE' AND Compteur_num='$Compteur_num' ORDER BY Annee DESC LIMIT 0,1"  
     
    ,$db_link) or die(mysql_error());
     
    $Index_last=mysql_result($requete_index,0,"releve");
    $datederniere=mysql_result($requete_index,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_index,0,"releve");
    $datenew=mysql_result($requete_index,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);
    }
    3. Recherche des tarifs en vigueur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    $requete_prix=mysql_db_query($sql_bdd,"select * from tarif_annuel where annee =$annee",$db_link) or die(mysql_error());
     
    //$Estandard=mysql_result($requete_prix,0,"standard");
    //$Eresid=mysql_result($requete_prix,0,"resid");
    //$Echalet=mysql_result($requete_prix,0,"chalet");
    $Eeau=mysql_result($requete_prix,0,"eau");
    $E2eauto=mysql_result($requete_prix,0,"2eauto");
    $Eentretien=mysql_result($requete_prix,0,"parcelle");
    $Etaxe=mysql_result($requete_prix,0,"taxe");
    $Eadulte =mysql_result($requete_prix,0,"adult_an");
    $Eenfant=mysql_result($requete_prix,0,"enf_an");
    $Eelect =mysql_result($requete_prix,0,"elect_an");
    $limite=mysql_result($requete_prix,0,"date_paiement");
     
    $request_empl=mysql_db_query($sql_bdd,"select * from clients WHERE num=$num ",$db_link) or die(mysql_error());
    $entretien=mysql_result($request_empl,0,"ENTRETIEN");
    $auto2=mysql_result($request_empl,0,"Voiture_2");
    $type=mysql_result($request_empl,0,"Type");
     
    if($type=="0")         //1er 
        { 
     $Emplac =mysql_result($requete_prix,0,"standard"); 
        } 
    elseif( $type=="1")
        { 
     $Emplac =mysql_result($requete_prix,0,"resid");
     
        } 
    elseif($type=="2")
        { 
     $Emplac =mysql_result($requete_prix,0,"chalet");
     
        }
    4.Calcul du compte et insertion des résultats dans la table "payements":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$suite=mysql_db_query($sql_bdd,"update payements set nb_enfants =$tot ,nb_adultes=$total,index_last=$Index_last,index_new=$Index_new,date_last='$date_last',date_new='$date_new',conso=$conso,cout_eau= $Eeau,cout_emplact=$Emplac,cout_adultes=(nb_adultes*$Eadulte),cout_enfant=(nb_enfants*$Eenfant),cout_elect=($conso/4),cout_auto2=($auto2*$E2eauto),cout_entretien=($entretien*$Eentretien),cout_taxe=$Etaxe,total=$totalmoney,subtotal=$subtotalmoney,tarif_adulte=$Eadulte,tarif_enfant=$Eenfant,tarif_elect=$Eelect,limite='$limite' WHERE Client_num=$num",$db_link) or die(mysql_error());
    Ce n'est pas beau mai ça fonctionne pour un client (num).
    Comme il y a une centaines de comptes à faire, j'ai trouvé ceci, qui vous plaira encore moins !!

    A la fin du premier script de sélection et d'insertion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $last= mysql_insert_id();
     
    header("Location:start.php?year=$year&number=$last")
    pour trouver le numero (auto) du premier enregistrement de l'année.
    Et ceci pour trouver le numero correspondant au dernier enregistrement:

    start.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $newKey = "select max(numero) As NKey from payements"; 
    $result = mysql_query($newKey) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){ 
    $newKey= $row['NKey']; 
    $newKey +=1; 
    }
    header("Location:start_next.php?number=$number&last=$newKey&year=$year");
    Et ensuite, pour me faire flinguer ici et permettra au script de bosser:

    start_next.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IF ($number < $last)
    {
    $requete_num=mysql_db_query($sql_bdd,"select * from payements WHERE numero = $number ",$db_link) or die(mysql_error());
    $num=mysql_result($requete_num,0,"Client_num");
    header("Location:calcul.php?num=$num&number=$number&last=$last&year=$year");
    }
    ELSEIF ($number == $last)
    {
    echo "done";
    }
    Et voilà. Je n'ai plus qu'à aller me planquer en attendant que vos esprits offensés se soient calmés
    C'est surtout la partie "boucle" de mon script que je voudrais améliorer, même si je ne suis pas fier de la partie calcul !!

    Je vous remercie de bien vouloir me mettre sur la bonne voie. Rien ne vaut un bon exemple et je suis persuadé de vous avoir fourni un beau condensé d'erreurs à ne pas commettre

    Bien amicalement.

    Camomille

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Par défaut
    C'est pas que je sois pas en dèche de rétribution en ce moment,

    mais ne viens pas proposé cela sur le forum c'est pas glop ^^ ca pourrait faire envie

    Plus concrètement, j'ai regardé en diagonal,

    Je pense que pour mieux gérer la maintenance de tes scripts, il faudrait que tu respectes les bonnes vieilles normes d'écritures:

    Mots cléfs sql en majuscule: SELECT et non pas select.

    Eviter les magic quotes ^^ !!!!

    Par exemple c'est plus clair comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Location:calcul.php?num=".$num."&number=".$number."&last=".$last."&year=".$year);
    => on voit tout de suite mieux les variables.

    Après ce qui "pique" le plus les yeux dans ton script c'est la boucle avec un header à chaque passage .

    Rien de t'empêche d'imbriquer des requêtes sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql= "SELECT * FROM payements";
    $sql=mysql_query($sql);
    while($res=mysql_fetch_assoc($sql)){
     // do traitement des données...
    }
    Ensuite à l'intérieur de tes traitements, tu peux sans doute utiliser des jointures (mysql est intelligents il peut sans doute te faire des calculs directement.)

    Si tu veux plus d'infos je te suggère de me contacter par mp. (ton cas ayant besoin d'une réponse vraiment spécifique avoir ta base complète sous les yeux ne serait sans doute pas du luxe

    Bon courage à toi dans tous les cas

Discussions similaires

  1. [Mysql] Requêtes multiples simultanées
    Par bitardo dans le forum JDBC
    Réponses: 6
    Dernier message: 02/07/2007, 11h46
  2. [MySQL] mysql requête multiple
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/05/2007, 17h20
  3. [AJAX] Requêtes multiples
    Par sbk.no.gaara dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/08/2006, 17h43
  4. [AJAX] Ajax requêtes multiples
    Par Teufboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2006, 19h23
  5. [requête] multiple count
    Par mandrake_of_mandregas dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/01/2006, 20h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo