Page 1 sur 2

Liste alphabétique et appel à la base mysql

Posté : 05 mars 2007, 12:27
par winzip
Bonjour à tous,

Voilà, j'ai une base mysql contenant le nom de tous les pays et j'aimerais afficher sur une page la liste des pays commençant par chaque lettre. Exemple :
Sur ma page j'ai A B C D E F..... Z et j'aimerais que qd on clique sur A on affiche les pays commençant pas A et ainsi de suite
Le problème c'est que je ne sais pas quel est le lien à donner dans le menu A B C .... Z pour chaque lettre, je ne vais pas créer un fichier php qui appel la base pour chaque lettre quand même ? ( ça ferait 27 fichier php )
Je ne sais vraiment pas comment faire et j'ai potagé toute la nuit dessus. Je me suis mis depuis peu au PHP.. Si quelqu'un pouvait m'aider j'en serais très reconnaissant ....

Merci Merci ! :merci:

Posté : 05 mars 2007, 12:43
par raptor
Salut

Ben sur le lien de chaque lettre tu appelles ta page liste.php en lui passant la lettre en variable :

tapage.php?lettre=A
tapage.php?lettre=B
tapage.php?lettre=C
....

Et la requete dans ta page liste.php par exemple :

$query = "select * from pays where nom_pays like '".$_GET["lettre"]."%' order by nom_pays asc";

Après c'est un listage de résultats classique.

On peut aussi faire la requete avec un left, et il est également conseillé de faire une vérification de $_GET["lettre"] avant d'effectuer la requete.

@+

Posté : 05 mars 2007, 12:44
par charabia
Sur tes lettres tu passes une variable en lien. Par exemple :
http://www.tonsite.com/ta_page.php?alp=a (pour la lettre A)

Ensuite dans ta_page.php tu construis une requête qui prendra en compte cette variable et afficher tous les résultats en fonction (avec LIKE). Exemple :
"SELECT * FROM ta_table WHERE ton_champ LIKE '".$_GET['alp']."%'";

Posté : 05 mars 2007, 13:43
par zeus
Modération :
winzip, le multipostage est interdit sur le forum.

Merci de prendre le temps de lire les règlements.

Posté : 05 mars 2007, 14:06
par winzip
Merci beaucoup pour vos réponses, vraiment je commençais à désespérer...
Je suis assez débutant et je ne capte pas tous ... Pour l'instant j'ai une page list.php :
$requete = mysql_query("SELECT * FROM liste WHERE Pays LIKE 'lettre%'"); // demande tous les pays commençant par la lettre
while ($ligne = mysql_fetch_array($requete)) {
   print "<tr>
   <td>".$ligne["Pays"]."</td>
   <td>".$ligne["Prix"]."</td>
   </tr>"; 
Qu'est ce que je dois modifier dans ce fichier list.php ??
J'ai bien ajouté la ligne comme vous m'avez dit :
"SELECT * FROM ta_table WHERE ton_champ LIKE '".$_GET['alp']."%'";
Mais j'ai un message d'erreur, après le LIKE je pense qu'il y a une erreur

Merci pour votre aide

Posté : 05 mars 2007, 14:26
par raptor
Donne ton code et le message d'erreur

Posté : 05 mars 2007, 14:32
par winzip
Super merci pour votre aide précieuse, ça marche !!!! :D je suis trop content car vous m'avez bien aidé, je m'arrachais les cheveux :)

il est également conseillé de faire une vérification de $_GET["lettre"] avant d'effectuer la requete.
Par contre est ce que tu pourrais m'éclairer sur cette vérification car je ne vois vraiment pas ?

Merci encore

Posté : 05 mars 2007, 14:37
par raptor
$_GET["lettre"] = preg_replace("`[^a-zA-Z0-9]`"," ",$_GET["lettre"]);
Tu supprimes ainsi tous les caractères non alpha numerique de ta chaine $_GET, au cas ou.

Posté : 05 mars 2007, 14:43
par winzip
raptor je dois placer cette ligne ou dans mon fichier list.php ?
merci encore :D

P.S : j'ai lu quelque part : Je conseil de bien tester ce que tu vas recevoir dans $_GET['letter'] : un utilisateur malveillant pourrais mettre autre chose que A ou B ou C, ...

Qu'est ce ça veut dire ?

Posté : 05 mars 2007, 14:46
par raptor
Ou encore :
if (preg_match('/^[[:alnum:]]{1}$',$_GET["lettre"])) {
   ton traitement avec affichage et tout....
}

Posté : 05 mars 2007, 14:47
par raptor
raptor je dois placer cette ligne ou dans mon fichier list.php ?
merci encore :D

P.S : j'ai lu quelque part : Je conseil de bien tester ce que tu vas recevoir dans $_GET['letter'] : un utilisateur malveillant pourrais mettre autre chose que A ou B ou C, ...

Qu'est ce ça veut dire ?
Ca veut dire qu'il pourrait envoyer des portions de requetes par la variable letter de l'url, et faire ce qu'on appelle une injection SQL.

Je te conseille de lire différentes infos la dessus que tu pourras trouver via google ;)

Posté : 05 mars 2007, 15:09
par winzip
ok merci , par contre quand j'insère cette ligne :
if (preg_match('/^[[:alnum:]]{1}$',$_GET["lettre"])) {
ton traitement avec affichage et tout....
}
J'ai un message d'erreur : no ending delimiter '/' found in line...

Voici mon code :

Code : Tout sélectionner

mysql_pconnect($serveur, $utilisateur , $motDePasse) or die("Impossible de se connecter au serveur de bases de données."); mysql_select_db($base) or die("Base de données non trouvée."); if (preg_match('/^[[:alnum:]]{1}$',$_GET["lettre"])) { $requete = mysql_query("SELECT * FROM tarifs WHERE PAYS LIKE '".$_GET['lettre']."%'order by PAYS asc"); while ($ligne = mysql_fetch_array($requete)) { print "<tr> <td>".$ligne["PAYS"]."</td> <td>".$ligne["PRIX"]."</td> </tr>"; } } mysql_close(); ?>

Merci

Posté : 05 mars 2007, 15:17
par raptor
Erf oui, enleve le /, c'est une erreur de ma part.

Posté : 05 mars 2007, 15:35
par winzip
J'ai enlevé le / mais j'ai toujours un message d'erreur mais ce n'est pas grave je n'utiliserai pas cette fonction pour le moment car je n'y comprend pas grand chose :oops:

Par contre comment afficher 'aucun enregistrement trouvé' quand on clique sur la lettre x ??? :wink:

Posté : 05 mars 2007, 15:41
par raptor
Elle dit quoi l'erreur ?

Pour ton code :
mysql_pconnect($serveur, $utilisateur , $motDePasse)
    or die("Impossible de se connecter au serveur de bases de données.");
 mysql_select_db($base)
    or die("Base de données non trouvée.");     

if (preg_match('^[[:alnum:]]{1}$',$_GET["lettre"])) {

$requete = mysql_query("SELECT * FROM tarifs WHERE PAYS LIKE '".$_GET['lettre']."%'order by PAYS asc");
if (mysql_num_rows($requete)>0) {
  while ($ligne = mysql_fetch_array($requete)) {
     print "<tr>
     <td>".$ligne["PAYS"]."</td>
     <td>".$ligne["PRIX"]."</td>
     </tr>"; 
  }
} else { echo "Aucun enregistrement trouv&eacute;"; }
}

}
mysql_close();