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

PHP & Base de données Discussion :

Simplification de code sur double requette sql pour trier les colonnes.


Sujet :

PHP & Base de données

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut Simplification de code sur double requette sql pour trier les colonnes.
    Bonjour,

    Je cherche à afficher le résultat d'une requette et ensuite, pouvoir trier sur chacune des colonnes.

    J'execute la première requette pour récupérer les entêtes de colonnes a trier.

    Ensuite, j'affiche le résultat avec les closes order by.

    Je voudrai améliorer le code pour ne pas avoir à lancer 2 requettes à chaque évènement sur la page. Quelqu'un a-t-il une idée?


    voici mon bout de code:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    <?php
    	include "conf.php";
     
    $dbconn = pg_connect(" $host $port $dbname $user $password ") or die("Connexion impossible");
      $stat = pg_connection_status($dbconn);
      if ($stat === PGSQL_CONNECTION_OK) {
          echo "Connexion ok \n";
          echo "<br />\n";
      } else {
          echo "Connexion erronée \n";
      } 
    $sql0 = " Select * FROM matable";
     
    $result0 = pg_query($dbconn, $sql0);
    if (!$result0) {
      echo "Une erreur est survenue.\n";
     
      exit;
    }
     
    // Définit les colonnes à trier
    $i=pg_num_fields($result0);
     for ($j = 0; $j < $i; $j++) {	
    	$tri_autorises [$j] = pg_field_name($result0, $j);
     }
     
     
     
     
    // Tri sur colonne
    $order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : $tri_autorises [0];
     
    // Sens du tri
    $order_dir = isset($_GET['inverse']) ? 'DESC' : 'ASC';
     
    $sql1 = "$sql0 ORDER BY {$order_by} {$order_dir}";
    echo "sql1 = $sql1";
     
    $result1 = pg_query($dbconn, $sql1);
     
    // Notre fonction qui affiche les liens
    function sort_link($text, $order=false)
    {
        global $order_by, $order_dir;
     
       if(!$order)
            $order = $text;
     
        $link = '<a href="?order=' . $order;
        if($order_by==$order && $order_dir=='ASC')
            $link .= '&inverse=true';
        $link .= '"';
        if($order_by==$order && $order_dir=='ASC')
            $link .= ' class="order_asc"';
        elseif($order_by==$order && $order_dir=='DESC')
            $link .= ' class="order_desc"';
        $link .= '>' . $text . '</a>';
     
        return $link;
    }
     
    echo '<table border="1"><tr>';
    $i=pg_num_fields($result1);
     for ($j = 0; $j < $i; $j++) {
    	echo '<th>';
    	echo sort_link(pg_field_name($result1, $j),pg_field_name($result1, $j)) ;
    	echo '</th>';
     }
    echo '</tr>';
     
    while ($row = pg_fetch_row($result1)) {
    	echo '<tr>';
    	for	($j = 0; $j < count($row); $j++) {
    		echo '<td>';     		
    		echo ($row[$j] == NULL) ? '<i></i>' : $row[$j];
    		echo '</td>';
    	}
    	echo '</tr>';
    }
     
     
     
     
     
    ?>
    <style type="text/css">
    a.order_asc,
    a.order_desc:hover { 
        padding-right:15px;
        background:transparent url(s_asc.png) right no-repeat;
    }
    a.order_desc,
    a.order_asc:hover {
        padding-right:15px;
        background:transparent url(s_desc.png) right no-repeat;
    }
    </style>

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    J'ai pas bien compris ton code. Sur le principe si tu veux deux tris ou affichages différents à partir d'une même requête, tu peux enregistrer le résultat de ta requête dans un tableau, et ensuite tu pourras utiliser les fonctions php de tri sur les tableau pour ordonner les résultats comme tu veux.

    Au passage pour lister un tableau avec php on utilise foreach et pas for...

  3. #3
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Le petit bout de code que tu vois est mon premier code PHP, d'ou l'erreur (for au lieu de foreach).

    J'ai deux questions:

    Comment faire pour modifier le bout de code pour faire mon tri en utilisant les fonctions php de tri sur les tableaux?
    J'ai déjà trouver comment stocker le résultat de la requette dans une variable array.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $arr = pg_fetch_all($result0);
    Deuxième question:
    J'ai des requettes qui génèrent beaucoup de lignes (200 000 à 500 000 lignes). Comment faire pour que je puisse trier les résultats sans dégrader les performances?

    Cordialement,
    vandman

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et tu compte en faire quoi des requêtes qui retournent 200 000 lignes ou plus ? Tu ne compte pas faire afficher 200 000 lignes tout de même ?

  5. #5
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 370
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Les requettes lancées permettent de voir un certain nombre d'élément de paramétrage sur notre logiciel de comptabilité, cf précédent post pour construire la requette

    Le but de l’outil que je cherche à mettre en place est de pouvoir visualiser le paramétrage en cours.
    A partir de là, nous voudrions optimiser, corriger, modifier le paramétrage, ceci de manière plus automatisé.

    Ce qui génère tant de ligne est la combinaison des plans comptable (8 à terme), des groupes (8 ou plus) des sous-comptes (un cinquantaine par plan) , des codes ca (2000) et cb (500-1000), des groupes de codes (9 et plus). tous ces éléments sont lié et ont une signification.
    J'ai d'autres éléments qui génèrent beaucoup de lignes. Il faut aussi que je puisse les traiter.

    Avec le paramétrage actuel, j'arrive à peu près à 215 000 lignes sur la requette que j'ai faite (cf lien ci dessus). Ces 215 000 lignes sont très intéressantes car elles me montrent que c'est le bordel dans le paramétrage qui a été fait avant que j'arrive. je n'accuse pas mon prédécesseur car j'aurai fait pareil avec les éléments qu'il avait.

    Je dois donc corriger le tir et appliquer de manière courante le bon paramétrage.
    Je n'ai pas tout le temps besoin des 200 000 lignes mais en fin - début d'année, il me les faut.
    j'ai besoin de les visualiser pour voir la cohérence de l'ensemble.

    Cordialement,
    vandman

Discussions similaires

  1. [AC-97] code sur double clic de tous les controles d'un formulaire
    Par docjo dans le forum VBA Access
    Réponses: 7
    Dernier message: 28/05/2013, 10h43
  2. question sur une requette sql
    Par kroma23 dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/04/2012, 21h40
  3. Réponses: 18
    Dernier message: 30/01/2012, 18h41
  4. Réponses: 2
    Dernier message: 07/01/2010, 11h47
  5. besoin d'aide sur une requette sql
    Par maxidoove dans le forum Langage SQL
    Réponses: 13
    Dernier message: 10/10/2005, 18h42

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