Liste alphabétique et appel à la base mysql

Petit nouveau ! | 9 Messages

05 mars 2007, 12:27

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:

Mammouth du PHP | 543 Messages

05 mars 2007, 12:43

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.

@+

Avatar du membre
ViPHP
ViPHP | 3008 Messages

05 mars 2007, 12:44

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']."%'";

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 mars 2007, 13:43

Modération :
winzip, le multipostage est interdit sur le forum.

Merci de prendre le temps de lire les règlements.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

05 mars 2007, 14:06

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

Mammouth du PHP | 543 Messages

05 mars 2007, 14:26

Donne ton code et le message d'erreur

Petit nouveau ! | 9 Messages

05 mars 2007, 14:32

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

Mammouth du PHP | 543 Messages

05 mars 2007, 14:37

$_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.

Petit nouveau ! | 9 Messages

05 mars 2007, 14:43

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 ?

Mammouth du PHP | 543 Messages

05 mars 2007, 14:46

Ou encore :
if (preg_match('/^[[:alnum:]]{1}$',$_GET["lettre"])) {
   ton traitement avec affichage et tout....
}

Mammouth du PHP | 543 Messages

05 mars 2007, 14:47

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 ;)

Petit nouveau ! | 9 Messages

05 mars 2007, 15:09

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

Mammouth du PHP | 543 Messages

05 mars 2007, 15:17

Erf oui, enleve le /, c'est une erreur de ma part.

Petit nouveau ! | 9 Messages

05 mars 2007, 15:35

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:

Mammouth du PHP | 543 Messages

05 mars 2007, 15:41

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();