Liste de membres triés par ordre alphabétique

Résolu/Fermé
Angecorse Messages postés 37 Date d'inscription samedi 25 avril 2015 Statut Membre Dernière intervention 3 novembre 2016 - 25 avril 2015 à 07:59
Angecorse Messages postés 37 Date d'inscription samedi 25 avril 2015 Statut Membre Dernière intervention 3 novembre 2016 - 27 avril 2015 à 21:29
Bonjour,

J'ai une liste de membres en BDD dans la table "membres" avec nom, prénom, adresse,...

J'aimerais 2 choses:

1/ Qu'en haut de ma page web s'affiche les lettres de l'alphabet (dans l'ordre alphabétique bien sûr) uniquement si au moins un membre, dont le nom commence par cette lettre, est trouvé dans la BDD.
EX: A - B - C - E - G - I - K - L - N - P...

2/ Que lorsqu'une de ces lettres est cliquée, tous les membres, dont le nom commence par cette lettre, s'affichent dans l'ordre alphabétique

Voici le code que j'ai, à savoir que je travaille avec le framework "foundation":


<?php
include_once ('includes/dbconnect.php');

$nbmembre = NBMEMBRESDISPLAY;
$membres = $db->query("SELECT id, titre, firstname, lastname, adress, resume FROM membres ORDER BY JE NE SAIS PAS QUOI METTRE ICI LIMIT $nbmembre");
?>

<h3>Derniers membres inscrits</h3>

<ul class="medium-block-grid-2 small-block-grid-1" data-equalizer>
<?php foreach ($membres as $membre): ?>
<li data-equalizer-watch>
<div class="lastMembre">
<a class="block" href="membre.php?id=<?php echo $membre->JE_NE_SAIS_PAS_QUOI_METTRE_ICI; ?> ">

<p>
<span><?php echo $membre->titre & $membre->lastname & $membre->firstname; ?></span>
<br />
<span class="adress"><?php echo $membre->adress; ?></span>
<br />
<?php echo text::limit($membre->resume, NBCARACTERESDISPLAY); ?>
</p>
</a>
</div>
</li>
<?php endforeach; ?>
</ul>

1 réponse

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
27 avril 2015 à 15:08
Salut,

Quelques pistes de solutions possibles :

1. Tu peux utiliser la requête suivante pour récupérer la première lettre des noms de ta table membres :
SELECT DISTINCT LEFT(firstname, 1) AS lettre FROM membres ORDER BY lettre


Il suffit alors de parcourir les résultats pour générer la liste des lettres, par exemple :
<a href="liste-membres.php?lettre=A">A</a>
<a href="liste-membres.php?lettre=B">B</a>
<a href="liste-membres.php?lettre=C">C</a>


2. Il faut modifier la requête de sélection des membres pour prendre en compte le paramètre 'lettre' si celui-ci existe :
if (!empty($_GET['lettre'])) {
    $membres = $db->query("SELECT id, titre, firstname, lastname, adress, resume FROM membres WHERE LEFT(firstname, 1) = '" . $_GET['lettre']) . "' ORDER BY firstname LIMIT $nbmembre");
} else {
    $membres = $db->query("SELECT id, titre, firstname, lastname, adress, resume FROM membres ORDER BY firstname LIMIT $nbmembre");
}


Attention aux injections sql ! Dans l'exemple ci-dessus le paramètre $_GET['lettre'] est concaténé directement dans la requête sql (faille). Tu dois échapper ce paramètre avant la concaténation avec une des méthodes suivantes selon l'API utilisé :
- requête préparée ou PDO::quote() pour l'API PDO
- mysqli_real_escape_string() pour l'API Mysqli

Bon dév
1
Angecorse Messages postés 37 Date d'inscription samedi 25 avril 2015 Statut Membre Dernière intervention 3 novembre 2016
27 avril 2015 à 21:29
Thanks pour cette info, en effet c'est une très bonne piste.

Oui, en règle générale j'encapsule les $_GET ;)

Je vais le mettre en oeuvre et reviens posté la solution si et quand tout sera ok ;)

See ya !
0