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 :

Puis-je simplifier ce script de classement par ordre alphabétique ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut Puis-je simplifier ce script de classement par ordre alphabétique ?
    Bonjour,

    Je dois classer des articles par ordre alphabétique. Grâce à nos chers modérateurs jreaux62 et sabotage, ma première requête préparée fonctionne. Mais je dois la répéter 26 fois, pour chacune des lettres de l'alphabet.
    Et le script suivant (qui fonctionne) me parait bien lourd. En fait, après la requête initiale, que je ne réécris donc pas, je réécris tout le reste à l'identique en changeant seulement la valeur de la variable (ex : $lettre=b, puis c, etc...). Ca fait donc 26 boucles while, etc... Ne peut-on faire plus simple ?

    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
    //=================== LA LETTRE A ================
    $lettre=a;
     
    /** on définit la requete sql */
    $sql = "SELECT *
    FROM cms_custom_database_2
    WHERE field_12
    LIKE :lettre
    ORDER BY field_9
    ";
     
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */
     
    /** On prépare les paramètres */
    $params = array(':lettre' => $lettre);
     
    /** On execute la requete */
    $stmt->execute($params);
    while($lettre=$params = $stmt->fetch(PDO::FETCH_OBJ))
    {
    echo '<b>
    <a href="http://www.dictionnaire.com/definition.php/'.$lettre->record_dynamic_furl.'-r'.$lettre->primary_id_field.'">'.$lettre->field_9.'</a>
    <br></b>';
    }//ferme while
     
    //=================== LA LETTRE B ================
    $lettre=b;
     
     
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */
     
    /** On prépare les paramètres */
    $params = array(':lettre' => $lettre);
     
    /** On execute la requete */
    $stmt->execute($params);
    while($lettre=$params = $stmt->fetch(PDO::FETCH_OBJ))
    {
    echo '<b>
    <a href="http://www.dictionnaire.com/definition.php/'.$lettre->record_dynamic_furl.'-r'.$lettre->primary_id_field.'">'.$lettre->field_9.'</a>
    <br></b>';
    }//ferme while

  2. #2
    Membre confirmé
    Avatar de Jacques Beauregard
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2015
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 231
    Points : 595
    Points
    595
    Par défaut
    Bonjour,
    Si il n'y a que la variable $lettre qui change :
    Déclaration d'un tableau initial comprenant les 26 lettres de l'alphabet?
    Une boucle for sur l'index du tableau?
    Il ne faut jamais prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont...

    Le guide du débutant pour apprendre à programmer en Java - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Déjà, si c'est la même requête, inutile de la préparer plusieurs fois. C'est justement à ça que servent les requêtes préparées : on la prépare une fois et on la lance plusieurs fois avec des paramètres différents.
    A part ça, effectivement un tableau de lettres et une boucle éviteront de réécrire le code 26 fois. (tu peux même auto-générer le tableau de lettres de a à z)
    Quelque chose comme ça (non testé) :
    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
    /** on définit la requete sql */
    $sql = "SELECT *
    FROM cms_custom_database_2
    WHERE field_12
    LIKE :lettre
    ORDER BY field_9
    ";
     
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */
     
    $lettres = range('a', 'z');
     
    foreach ($lettres as $lettre) { 
    	/** On prépare les paramètres */
    	$params = array(':lettre' => $lettre);
     
    	/** On execute la requete */
    	$stmt->execute($params);
    	while($res = $stmt->fetch(PDO::FETCH_OBJ))
    	{
    	echo '<b>
    	<a href="http://www.dictionnaire.com/definition.php/'.$res->record_dynamic_furl.'-r'.$res->primary_id_field.'">'.$res->field_9.'</a>
    	<br></b>';
    	}//ferme while
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Bonjour à tous !

    Merci pour ce bout de script, Celira. Ca fonctionne, je n'avais pas pensé à la fonction range().
    Je l'ai personnalisé un peu pour ajouter des majuscules, mais il y a surtout quelque chose à faire pour embellir le truc. En fait, ce script renvoie 26 div avec à chaque fois la liste des articles commençant par une lettre de l'alphabet, ok, c'était bien le but, mais s'il n'y a pas d'article pour une lettre donnée, ça me renvoie une case vide, ce qui est moche, je trouve.

    Il faut donc que j'utilise, la fonction mysqli_num_rows(), avec une condition if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(requête > 0 résultat) {on affiche;}
    J'avoue que j'ai un peu de mal à caser ça dans le script. C'est cette ligne qui me pose un problème, en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $res = $stmt->fetch(PDO::FETCH_OBJ))
    Là, je récupère un tableau. Mais comment et à quel endroit récupérer en plus, le nombre de résultats trouvés par la requête ?

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    deux possibilités :
    Soit utiliser rowCount avant le while. Le problème de rowCount étant qu'il n'est pas vraiment fait pour les requêtes SELECT, mais plutôt pour les INSERT/UPDATE/DELETE, son comportement dépend donc du SGDB sur lequel tu es branché. Mais avec MySQL, ça devrait marcher.
    Soit ajouter une requête COUNT pour compter les lignes éligibles par la requête de sélection. Le problème étant que ça double le nombre de requêtes à faire, c'est donc un peu excessif.

    Vu ton contexte, j'utiliserais plutôt la 1ere solution.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    si je ne m'abuse, tu utilises PDO.
    Donc mysqli_num_rows() n'a rien à faire dans l'histoire.

    Tu peux utiliser ->rowCount().

    A lire :

  7. #7
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Bonjour à tous,

    Il faut que je teste ça. Mais avant tout, la fonction adéquate ne serait-elle pas plutôt fetchColumn(), si j'en crois la page indiquée par jreaux62 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     /* Récupère le nombre de lignes qui correspond à la requête SELECT */
       if ($res->fetchColumn() > 0) {

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    fetchColumn sert à lire une seule colonne dans une ligne de résultat. C'est plutôt utilisé pour lire le résultat d'une requête SELECT COUNT(*).
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    **edit**
    J'ai essayé ce qui suit, je n'ai pas d'erreur (contrairement au truc d'avant que j'ai édité), mais en fait, la condition if ne semble pas testée, comme si le résultat retourné était toujours supérieur à 0 (alors qu'il n'y a des articles que pour les lettres A et G).
    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
     
    foreach ($lettres as $lettre) { 
    /** On prépare les paramètres */
    $params = array(':lettre' => $lettre);
     
    /** On execute la requete */
    $stmt->execute($params);
     
    while($res = $stmt->fetch(PDO::FETCH_OBJ))
    {
    $stmt=$res->rowCount();
    if($total>0)
    {
    //on affiche les articles pour la lettre correspondante
    ;}
     
    ;}//ferme while
     
    {

  10. #10
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Ah si, ça fonctionne.


    Maintenant, j'aimerais faire autre chose (avant de vous poser quelques questions théoriques, si vous le voulez bien).

    J'aimerais tout simplement afficher les lettres de l'alphabet, à condition qu'il y ait des articles pour la lettre correspondante. Mais le script ci-dessus nécessite d'être modifié, car il m'affiche la chose suivante :

    A -> définition A1
    G-> définition G2
    G-> définition G3

    C'est-à-dire que s'il y a 10 articles qui commencent par la lettre G, alors ce script m'affiche dix fois la lettre G. Si vous avez une idée...

  11. #11
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Ah bah ça y'est, ça fonctionne, j'ai juste viré le while.

    Bon alors, une question si vous repassez par là :

    Ces lignes m’horripilent excessivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $stmt = $dbh->prepare ($sql);
    $res = $stmt->fetch(PDO::FETCH_OBJ))
    Quelqu'un pourrait-il me détailler son fonctionnement ?
    Si j'ai bien compris, il faut :


    1) Que je crée une variable $stmt qui contient la requête $sql exécutée grâce à la connexion $dbh.
    2) Ensuite je crée une variable $res qui continent le contenu de la variable $stmt après exécution d'une fonction fetch.

    Pfiou, n'est-ce point simplifiable ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par jreaux62 Voir le message
    A lire :
    Pour comprendre, il faut apprendre.
    Pour apprendre, il faut lire.

  13. #13
    Inactif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Salut cher jreaux62,


    Oui, j'ai déjà téléchargé le .pdf en question et l'ai survolé à maintes reprises, sans quoi je n'aurais pas même essayé de réaliser ce petit script.
    Mais les .pdf, on ne peut pas leur poser de question précise.

    C'est pourquoi j'aimerais, si possible, que quelqu'un m'explique le pourquoi du comment de ces lignes en particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = $dbh->prepare ($sql);
    $res = $stmt->fetch(PDO::FETCH_OBJ))
    Oui je comprend qu'il faut se connecter à la base de donner $dbh pour préparer la requête $sql et qu'on récupère l'ensemble dans $stmt qui génère ensuite un tableau à l'aide d'une fonction PDO, l'ensemble étant récupéré par $res. Bon bon... Mais sur le serveur, pendant ce temps-là, il se passe quoi ? Quand la requête est préparée, ça fait quoi dans les coulisses ? Et pourquoi mysql_fetch_array n'existe plus ? Pourquoi une fonction PDO ? Et peut-on utiliser autre chose ? etc... etc...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Alorslaçaprogramme Voir le message
    ... et l'ai survolé à maintes reprises,...
    A quoi ça sert, si tu ne le LIS pas...
    Ca t'éviterait de poser des questions alors que les réponses s'y trouvent.

    Donc Lindbergh, tu te poses, et tu deviens Gutenberg !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = $dbh->prepare ($sql);
    $res = $stmt->fetch(PDO::FETCH_OBJ))
    Que veux-tu qu'on te dise de plus ?
    C'est la syntaxe* à utiliser !!!
    Ensuite, tu as LA DOC pour en savoir plus sur chaque fonction PDO.

    Et peut-on utiliser autre chose ? ...
    Oui. l'extension mysqli_.


    * Concernant la syntaxe, elle est ici "orientée objet" et non "procédurale".
    Si c'est ça qui te chagrine, je veux bien le comprendre.
    LIS LA DOC, suis les instructions et la syntaxe, EXPERIMENTE et tu comprendras progressivement comment ça fonctionne.

  15. #15
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En version simplifiée : une requête préparée, c'est une requête avec des trous pour les données. Quand tu veux fabriquer le même objet dans 3 sortes de métal, tu fais un moule que tu réutilises avec tes 3 métaux.
    Donc le fonctionnement c'est
    1. préparer la requête : $stmt = $dbh->prepare ($sql);.
    2. exécuter la requête avec des données :$stmt->execute($params);.
    3. récupérer le résultat : $stmt->fetch(PDO::FETCH_OBJ).


    Pourquoi mysql_fetch_array n'existe plus : parce l'API mysql (autrement dit les fonctions mysql_quelque_chose) est obsolète et va être retirée dans une prochaine version de PHP. Donc on arrête de s'en servir et on utilise soit PDO, soit l'API mysqli à la place.

    (personnellement, je n'aime pas mysqli, donc je conseille plutôt PDO )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. [OL-2010] Script de classement des règles par ordre alphabétique
    Par gabzh dans le forum VBA Outlook
    Réponses: 10
    Dernier message: 29/06/2021, 11h13
  2. Classement par ordre alphabétique
    Par loucinev dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/02/2015, 14h38
  3. [MySQL] Classement par ordre alphabétique et données de type SET
    Par JosephC dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/10/2014, 19h19
  4. Classement par ordre alphabétique ne fonctionne plus
    Par Alixam dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 07/08/2012, 15h51
  5. Classement par ordre alphabétique
    Par crovette51101 dans le forum Access
    Réponses: 5
    Dernier message: 20/12/2006, 14h13

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