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 :

Problème requête SQL


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut Problème requête SQL
    Bonjour, j'aimerai avoir des précisions sur l'utilisation de requêtes SQL.

    Je m'explique: j'ai une très longue requête (qui fait des recherches dans différentes tables en fonction des données sélectionnées) et j'affiche le résultat par ordre alphabétique. Je veux ajouter la gestion de la pagination (regrouper les résultats affichés par blocs de 20, par exemple).

    Voila comment est construite ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ... 
    FROM ... 
    WHERE ... 
    AND ...
    AND UPPER ... LIKE '".$_GET["lettre"]."%'
    LIMIT '.($page * $nb).','.$nb.' ''
    ORDER BY ...
    Je pense qu'il y a un problème au niveau de l'ordre des instructions entre limit et order by, mais j'ai effectué plusieurs tests et je ne trouve pas la solution.

    Merci de votre aide!

  2. #2
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    De mes souvenir, le LIMIT, doit être placé après un ORDER BY.

    De plus quand tu fais ta requête et que tu utilises des " et des ' ces deux lignes sont incohérentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AND UPPER ... LIKE '".$_GET["lettre"]."%'
    LIMIT '.($page * $nb).','.$nb.' ''
    ne devrait pas plûtot s'écrire : ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mysql_query("....AND UPPER ... LIKE '".$_GET["lettre"]."%'
    ...
    LIMIT ".($page * $nb).", ".$nb);
    De plus pour faire ta pagination il suffirait de faire un limit comme ce-ci non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIMIT ".($page * $nb).", ".(($page * $nb) + $nb));
    ce qui donnerait pour la page 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "...LIMIT ".(3 * 20).", ".((3 * 20) + 20));
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Merci, effectivement la requête limit se place après le order by, et pour le problème de guillemets c'est moi qui avait mal copié la requête. Maintenant j'ai un nouveau problème, en fait limit m'affiche seulement les 5 premiers résultats, mais ne propose pas d'autres pages pour voir la suite.
    Quand il n'y avait pas la recherche alphabétique, la pagination fonctionnait pourtant.
    Voila un bout de mon code:

    D'abord la construction de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ... 
    FROM ... 
    WHERE ... 
    AND ...
    Et le code php utilisé pour l'alphabet et la pagination
    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
     
     
    	//alphabet pour la recherche par noms
    foreach(range('A','Z') as $lettre) {
    echo '<a href="ListeClients.php?lettre=' .  $lettre . '"> ' . $lettre . ' </a>';
    }
    $requete.="AND UPPER (NomSociete) LIKE '".$_GET["lettre"]."%' ";
     
    //modification : tri par ordre alphabetique
    $requete .="ORDER BY NomSociete ";
     
    //Pagination des recherches (X recherches par page.)
    $nb=5;
    $page = 0;
    if(isset($_GET['page'])) {
       $page = intval($_GET['page']);
    			}
    if(isset($_GET['nb'])) {
       $nb = max(intval($_GET['nb']), $nb); // Assure au moins $nb résultats par page
    			}
    $max_pg = ceil($nbClients / $nb);
    $requete .='LIMIT '.($page * $nb).','.$nb.' ';
    echo "<p>Page actuelle : $page </p>";
    echo "<p>Nb d'enregistrements par page : $nb</p>"
    ?>
     
    <p>Pages :
    <?php
    for($i = 0 ; $i < $max_pg ; $i++) {
    	echo ' <a href="?page='.$i.'&nb='.$nb.'">'.$i.'</a>';
    	}
    ?>
    </p>
    <p>Nb d'enregistrements par page :
    <a href="?page=<?= $page ?>&nb=5">5</a>
    <a href="?page=<?= $page ?>&nb=10">10</a>
    <a href="?page=<?= $page ?>&nb=20">20</a></p>

  4. #4
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Attention tu oublies de faire des échos de tes variables $pages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <p>Nb d'enregistrements par page :
    <a href="?page=<?= echo $page; ?>&nb=5">5</a>
    <a href="?page=<?= echo $page; ?>&nb=10">10</a>
    <a href="?page=<?= echo $page; ?>&nb=20">20</a></p>
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Le problème persiste en ajoutant les echo $page , je ne comprends pas...

    Mais avant que j'ajoute la recherche alphabétique, la pagination marchait bien (même sans les echo $page... ).

    Je pense que le problème se situe au niveau du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <p>Pages :
    <?php
    for($i = 0 ; $i < $max_pg ; $i++) {
            echo ' <a href="?page='.$i.'&nb='.$nb.'">'.$i.'</a>';
    }
    ?>
    </p>
    car le choix des pages ne s'affiche pas alors que le nombre de recherches par pages est disponible et fonctionne. (Seulement, il n'affiche que les 5, 10 ou 20 premiers résultats).

    Une idée?

  6. #6
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Citation Envoyé par floctc Voir le message
    Le problème persiste en ajoutant les echo $page , je ne comprends pas...
    Étonnant...

    Pourrais-tu faire un echo de la variable $requete pour la lettre A par exemple pour voir si toutes les variables sont bien prises en comptes dans ta requêtes. Et nous afficher le résultat.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Voila l'echo de ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT NumSociete, NomSociete, TypeSociete, CodeAPE, ImageSociete, NbSalaries, NbSites, SiteWebSociete, Testeur.NumTesteur, CiviliteTesteur, NomTesteur, PrenomTesteur, FonctionTesteur, NumTelTesteur, NumMobileTesteur, EmailTesteur, NbParticipations, NbSollicitations FROM societe, testeur WHERE NumSociete = SocieteTesteur AND NbSites BETWEEN 0 AND 550 AND NbSalaries BETWEEN 0 AND 16601 AND UPPER (NomSociete) LIKE 'A%' ORDER BY NomSociete LIMIT 0,5

  8. #8
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Ok.

    Je continu à dire que c'est ton LIMIT le problème car prenons cet exemple : pour la page 4.

    Avec ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete .='LIMIT '.(4 *5).','.5.' ';
    ça donnera LIMIT 20,5.... bizarre je trouve non ?

    Alors que si on reprend mon code que je t'ai indiqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIMIT ".(4 * 5).", ".((4 * 5) + 5));
    on arrive à LIMIT 20, 25. Ce qui nous donne bien 5 enregistrements par page.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Oui, normalement ton ordre limite devrait mieux fonctionner, mais quand je le rentre avec les bon noms de variables, ça ne marche pas non plus ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $requete .= "LIMIT ".($page * $nb).", ".(($page * $nb) + $nb))" ";

  10. #10
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Il a des parenthèses et des guillemets en trop

    $requete .= "LIMIT ".($page * $nb).", ".(($page * $nb) + $nb);

    Ensuite vérifie deux choses :
    - exécute ta requête dans MySQL pour voir si c'est bien les bons résultats que tu veux en sortie
    - vérifies que tes variables ne sont pas nulles

    Et peut être une dernière chose, car je ne suis plus trop sûr de moi, et que je ne peux actuellement pas tester : les calculs dans les echos... peut être qu'il faudrait les faire avant de les mettre dans ta requête.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Merci beaucoup, ça fonctionne! Concernant le calcul dans les echo, je n'ai pas de problèmes à l'affichage donc je vais laisser comme ça. Merci de votre aide, je mets le problème en résolu.

  12. #12
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 78
    Par défaut probleme de requete
    bonjour tout le monde,
    j'ai un probleme avec le script suivant:

    <?php
    // connection a la bd et execution de la requete pr remplir la table semaine

    $num_semaine = 1;
    $diff=$tsp_jour_fin_annee - $tsp_jour_deb_annee;
    //require('../conn/connexion.php');
    mysql_connect("localhost","root","") or die("Ouverture base impossible");
    mysql_select_db("planning");
    // suppression des semaines deja remplies
    mysql_query('DELETE FROM semaine');
    // remplissage de la table semaine
    $timestamp_fin = '';
    while ($timestamp_fin != $tsp_jour_fin_annee && $num_semaine <=$diff )
    {
    //432000=5 jours et 172800=2jours le week end
    $timestamp_fin = $tsp_jour_deb_annee + 432000;
    mysql_query("INSERT INTO semaine values($num_semaine, $tsp_jour_deb_annee, $timestamp_fin)");
    $tsp_jour_deb_annee = $timestamp_fin + 172800;
    $num_semaine++;
    }

    ?>


    en gros c'est un script pour l'insertion des semaines dans une table "semaine" existante dans la base de données, il y a un formulaire ou l'utilisateur selectionne le debut et la fin de l'année, et au niveau de la base je veux que ces dates s'inserent en tant que tiemstamp. mais a chaque fois que j'utilise ce script et je verifie au niveau de la base je me rend compte que toute les semaines de l'année s'inserent, ca veux dire 53 semaines. je sais plus comment faire j'ais reverifier le script, j'ais tout essayer mais en vain. je demande de l'aide et MERCI d'avance

  13. #13
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Par défaut
    Ok mais pour qu'on puisse répondre à ton problème, il serait bien de ne pas poster tes questions dans le sujet d'une autre personne. Je t'invite donc à créer un nouveau topic.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Pour info le deuxieme parametre de limit est le nombre de record a voir. Donc c'est bien limit 20,5 et non pas limit 20,25.

    Mais dans ton test un il y a un truc bizarre, c'est quoi le nbClients ?
    Car c'est evidement grace a lui que tu vas pouvoir determiner le nombre de page que tu auras (avant ton filtre, maintenant je ne sais pas comment tu l'alimentes avec le filtre)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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