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 :

Afficher une selection d'enregistrement sur plusieurs pages [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Afficher une selection d'enregistrement sur plusieurs pages
    Bonjour tout le monde,
    je suis en train de faire quelque chose de courant j'imagine avec php et j'aimerais m'assurer que ma méthode est la bonne. Pour cela je préfere demander a des personnes qui ont plus d'expérience que moi .

    Ce que je veux faire :
    J'ai enregistré dans ma base de donnée de nombreux articles que l'utilisateur va pouvoir consulter Les articles sont très nombreux il me faut donc limiter le nombre d'articles pour une page. Pour cela j'envoi une requete SELECT avec la fonction LIMIT.
    Ensuite il faut que l'utilisateur puisse accéder aux autres pages, donc il faut que je détermine combien de page il y aura en tout. Pour ce faire je fais une requête SELECT * puis je demande combien de lignes me sont retourné.

    Ce qui me gêne c'est d'utiliser 2 requêtes c'est peut etre maladroit de ma part ...

    En outre je pense qu'il est maladroit de faire un SELECT *, j'ai peur qu'avec un noçmbre d'article grandissant chaque jour, la requête ne soit de plus en plus lente. Qu'en est il réellement ?

    Merci pour vos conseils

  2. #2
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $strSQL_count = "SELECT COUNT(*) AS nb_enregistrements FROM matable";
    :

    il me semble avoir vu dans un post il y a quelques temps que c'était plus rapide ...
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #3
    Membre averti Avatar de hisy
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 377
    Points : 353
    Points
    353
    Par défaut
    Je crois que le mysql_affected_rows() te donnera le nombre complet d'enregistrement pour ton SELECT sans tenir compte du LIMIT ...

    Ca te donne le nombre d'enregistrements ... En une seule requete ...

    Mais de manière générale ... évite les SELECT * ... si tu peux ... Surtout si c'est juste pour compter le nombre de retour ...

    Un SELECT maclé FROM matable est moins RessourssoPhage ... (!?)
    Take it HiSy

  4. #4
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Citation Envoyé par hisy
    Je crois que le mysql_affected_rows() te donnera le nombre complet d'enregistrement pour ton SELECT sans tenir compte du LIMIT ...
    Perdu !

    Sinon pour faire de la pagination sans faire plusieures requêtes, tu peux enregistrer dans une variable de session le résultat de ta requête sous la forme d'un tableau, puis un simple count() dessus te renverras le nombre de tupple concernés.
    Consultant idéaliste.

  5. #5
    Membre habitué
    Avatar de Amnesiak
    Profil pro
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 151
    Points
    151
    Par défaut
    Tu peux obtenir le nombre réel d'enregistrements trouvés par la requête SELECT sans tenir compte de la clause LIMIT à l'aide de l'option SQL_CALC_FOUND_ROWS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SQL_CALC_FOUND_ROWS *
    FROM `maTable`
    WHERE ...
    LIMIT ...
    Qui te renvoie le jeu d'enregistrements limité que tu souhaites afficher sur une seule page (selon la valeur de LIMIT). Ensuite, il suffit d'appeler la fonction MySQL FOUND_ROWS() qui t'indique le nombre réel d'enregistrements qui auraient été trouvés sans la clause LIMIT.
    Je pense que c'est une solution plus rapide que de faire un COUNT() de tous les enregistements de la table sans clause LIMIT

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je pense que je vais appliquer la fonction SQL_CALC_FOUND ROWS, ca semble etre exactement ce que je recherchais . Merci pour la rapidité de vos réactions a tous et pour votre aide.
    A bientot !!

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par hisy
    Je crois que le mysql_affected_rows() te donnera le nombre complet d'enregistrement pour ton SELECT sans tenir compte du LIMIT ...
    C'est faux. mysql_affected_rows() renvoie le nombre de lignes modifiées par une requête (donc soit par UPDATE ou par DELETE), pas par SELECT.
    Pour un SELECT, c'est mysql_num_rows() qu'il faut utiliser, et il tient bien entendu compte du LIMIT puisqu'il compte le nombre de lignes renvoyées par la requête.

  8. #8
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Citation Envoyé par vg33
    C'est faux. mysql_affected_rows() renvoie le nombre de lignes modifiées par une requête (donc soit par UPDATE ou par DELETE), pas par SELECT.
    Pour un SELECT, c'est mysql_num_rows() qu'il faut utiliser, et il tient bien entendu compte du LIMIT puisqu'il compte le nombre de lignes renvoyées par la requête.
    Encore perdu !

    mysql_affected_rows() retourne également le nombre de lignes concernés par un SELECT.

    D'après la doc :

    Citation Envoyé par php.net
    Requêtes SELECT : Pour obtenir le nombre de lignes retournées par un SELECT, il est possible d'utiliser mysql_num_rows().
    Ce serait donc plutôt le contraire de préconisé.


    http://fr.php.net/manual/fr/function.mysql-affected-rows.php
    Consultant idéaliste.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par macbook
    mysql_affected_rows() retourne également le nombre de lignes concernés par un SELECT.
    Désolé, mais c'est toi qui a tout faux
    Dans le lien même que tu cites :
    Citation Envoyé par php.net
    mysql_affected_rows

    (PHP 3, PHP 4, PHP 5)
    mysql_affected_rows -- Retourne le nombre de lignes affectées lors de la dernière opération MySQL
    Description
    int mysql_affected_rows ( [resource link_identifier] )

    Retourne le nombre de lignes affectées lors de la dernière requête INSERT, UPDATE ou DELETE avec link_identifier.
    Je persiste, et tu le dis toi-même (tu lis ce que tu écris ?), c'est mysql_num_rows() qu'il faut utiliser pour récupérer le nombre de résultats d'un select :

    Citation Envoyé par macbook
    D'après la doc :

    php.net a écrit:
    Requêtes SELECT : Pour obtenir le nombre de lignes retournées par un SELECT, il est possible d'utiliser mysql_num_rows().
    Comme tu peux le lire, c'est mysql_num_rows() qui est écrit, pas mysql_affected_rows().

  10. #10
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Citation Envoyé par vg33
    C'est faux. mysql_affected_rows() renvoie le nombre de lignes modifiées par une requête (donc soit par UPDATE ou par DELETE), pas par SELECT.
    Décidément il y en a qui ont la tête dure ici.

    Toi tu prétends que mysql_affected_rows() ne marche pas pour un select. As-tu seulement fais le test ? As-tu pris le temps de faire des tests de rapidité d'execution sur les deux méthodes ? Moi oui et je préconise mysql_affected_rows() pour compter le nombres de tupple d'une requête même lorsqu'il s'agit d'un SELECT.

    Maintenant je ne vais pas t'apprendre à lire mais si on lit bien ce qui suit :
    Requêtes SELECT : Pour obtenir le nombre de lignes retournées par un SELECT, il est possible d'utiliser mysql_num_rows().
    Cela signifie pour moi que les deux fonctions marchent pour compter après un SELECT. Il est POSSIBLE != Il FAUT.

    Chacun sa lecture.
    Consultant idéaliste.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Dans le manuel php version chm téléchargé sur le site officiel :
    mysql_affected_rows() n'est pas possible après un SELECT, car elle ne fonctionne qu'après des commandes qui modifient les enregistrements. Pour connaître le nombre de lignes retournées par un SELECT, utilisez mysql_num_rows().
    Est-ce une erreur ?

  12. #12
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Ce qui démontre que tu n'as pas essayé.

    <?php
    &#160;$sql&#160;
    =&#160;"SELECT&#160;name&#160;FROM&#160;ma_table"&#160;;
    &#160;
    mysql_query&#160;(&#160;$sql&#160;)&#160;;
    &#160;echo&#160;
    mysql_affected_rows()&#160;;
    ?>

    Phpsyntaxcolor powered by decabodi.com
    Ce snippet est plus rapide qu'avec un mysql_num_rows(). Le chm n'est pas à jour ou bien différent de ce qui se fait en ligne.
    Consultant idéaliste.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Pour revenir a la fonction SQL_CALC_FOUND ROWS, j'ai du mal a obtenir des résultats satisfaisant...

    J'envoi ma premiere requete qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM `maTable` LIMIT 10;";
    $rqp = mysqli->prepare($sql);
     
    $rqp = bind_result($var1, $var2);
    $rqp->execute();
    Je pensais pouvoir accéder au résultat avec cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $rqp->found_rows();
    mais je suis confronté a ce message :
    unexpect T_OBJECT_OPERATOR

    Je pourrais executer une seconde requete et y placer le
    Mais a ce moment la je reviens sur mon probleme de départ qui était d'éviter d'utiliser 2 requetes ...

    A moins que cette seconde requête ne nuise pas a la rapidité de mon script ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/11/2013, 19h34
  2. [PHP 5.3] Affichage du résultat d'une requête multi-table sur plusieurs pages
    Par leaston dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2011, 16h19
  3. Réponses: 2
    Dernier message: 16/01/2010, 11h52
  4. [AJAX] Afficher une image non enregistrée sur le serveur
    Par magicbisous-nours dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/01/2009, 09h19
  5. Réponses: 9
    Dernier message: 19/12/2006, 12h02

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