Pour boucle pour raccourcir mon script

Eléphanteau du PHP | 13 Messages

03 août 2006, 17:17

Bonjour,

Je travaille sur une application de répertoire et j'aimerais avoir un coup de main. Je vous explique mon problème.

J'ai conçu un système de page par lettre et je voudrais qu'en cliquant sur cette lettre on arrive à la page concernée (bon cette partie est déjà faite) mais je voudrais aussi que sur cette page figure les coordonnées de toutes les personnes dont justement le nom commence par cette lettre. Et ainsi de suite pour chacune des lettres de l'alphabet.

J'ai déjà écris un script qui donne le résultat que je veux mais comme vous pourrez le voir je dois tester chaque lettre et écrire la partie du script à chaque fois. Dans mon code actuel, je n'ai fait que les 2 premières lettres de l'alphabet car je pense qu'il doit y avoir moyen d'utiliser un sytème de boucle pour raccourcir mon code.

mon 1er code où je teste chaque lettre
<a href='repertoire.php?action=afficher&choix=lettre'> Par lettre&nbsp;</a> <br /

<?php
// connection au serveur MySQL
$connexion = mysql_connect("localhost" , "root" , "") or die ("Connection à MySQL impossible".mysql_error());
	
// connection à la base de données
$base = mysql_select_db("espace_perso" , $connexion) or die ("Accès à la base impossible" .mysql_error());	

if (isset($_GET['action']) AND isset($_GET['choix']))
{
	$action = $_GET['action'];
	$choix = $_GET['choix'];
}

// Afficher en SELECTIONNANT UNE INITIALE
if ($action == 'afficher')
{
	if ($choix == 'lettre')
	{
		// création d'un tableau à 1 dimension pour mettre l'alphabet
		$lettres = array (1 => "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
		for ($a = 1 ; $a <= 26 ; $a++)
		{
			// affichage dans une nouvelle page
			echo "<a href='repertoire.php?action=afficher&choix=$lettres[$a]'> $lettres[$a]</a> &nbsp;";
		}
	}
	elseif ($choix == "A")
	{
		echo "<font size='7' font color='red'>   $choix  </font> <br> <br>";
		$req_tout = "SELECT * FROM repertoire WHERE nom LIKE '$choix%'";
		$result_tout = mysql_query($req_tout) or die ("Rechercher tout : impossible");
		while ($tout = mysql_fetch_array($result_tout))
		{
			$nom = strtoupper($tout['nom']);		// met directement les minucules en Majuscules
			$prenom = strtoupper($tout['prenom']);	// idem
			$adresse = $tout['adresse'];
			$ville = $tout['ville'];
			$code_postal = $tout['code_postal'];
			$tel_bureau = $tout['tel_bureau'];
			$tel_fixe = $tout['tel_fixe'];
			$categorie = $tout['categorie'];
			$tel_port_1 = $tout['tel_port_1'];
			$tel_port_2 = $tout['tel_port_2'];
			$mail_1 = $tout['mail_1'];
			$mail_2 = $tout['mail_2'];
			$mail_3 = $tout['mail_3'];
					
		echo "<font size=5> <b> $nom &nbsp; $prenom </b> </font> <br>
				Adresse : <b>$adresse</b> &nbsp; &nbsp; &nbsp;  Ville : <b>$ville</b> &nbsp; &nbsp; &nbsp; Code postal : <b>$code_postal</b> <br>
				Catégorie : <b>$categorie</b> <br>
				Téléphone fixe :  <b>$tel_fixe</b>  &nbsp; &nbsp; &nbsp;  De bureau : <b>$tel_bureau</b> <br>
				Téléphone portable : <b>$tel_port_1</b> &nbsp; &nbsp; &nbsp;&nbsp; <b>$tel_port_2</b> <br>
				Email : <b>$mail_1</b> &nbsp; &nbsp; &nbsp; &nbsp;	<b>$mail_2</b> &nbsp; &nbsp; &nbsp; &nbsp; <b>$mail_3</b> <br> <br>";
		}
	}
	elseif ($choix == "B")
	{
		echo "<font size='7' font color='red'>   $choix  </font> <br> <br>";
		$req_tout = "SELECT * FROM repertoire WHERE nom LIKE '$choix%'";
		$result_tout = mysql_query($req_tout) or die ("Rechercher tout : impossible");
		while ($tout = mysql_fetch_array($result_tout))
		{
			$nom = strtoupper($tout['nom']);		// met directement les minucules en Majuscules
			$prenom = strtoupper($tout['prenom']);	// idem
			$adresse = $tout['adresse'];
			$ville = $tout['ville'];
			$code_postal = $tout['code_postal'];
			$tel_bureau = $tout['tel_bureau'];
			$tel_fixe = $tout['tel_fixe'];
			$categorie = $tout['categorie'];
			$tel_port_1 = $tout['tel_port_1'];
			$tel_port_2 = $tout['tel_port_2'];
			$mail_1 = $tout['mail_1'];
			$mail_2 = $tout['mail_2'];
			$mail_3 = $tout['mail_3'];
					
		echo "<font size=5> <b> $nom &nbsp; $prenom </b> </font> <br>
				Adresse : <b>$adresse</b> &nbsp; &nbsp; &nbsp;  Ville : <b>$ville</b> &nbsp; &nbsp; &nbsp; Code postal : <b>$code_postal</b> <br>
				Catégorie : <b>$categorie</b> <br>
				Téléphone fixe :  <b>$tel_fixe</b>  &nbsp; &nbsp; &nbsp;  De bureau : <b>$tel_bureau</b> <br>
				Téléphone portable : <b>$tel_port_1</b> &nbsp; &nbsp; &nbsp;&nbsp; <b>$tel_port_2</b> <br>
				Email : <b>$mail_1</b> &nbsp; &nbsp; &nbsp; &nbsp;	<b>$mail_2</b> &nbsp; &nbsp; &nbsp; &nbsp; <b>$mail_3</b> <br> <br>";
		}
	}
}// FIN afficher en SELECTIONNANT UNE LETTRE
?>
J'ai bien sûr fait déjà pal mal d'essais de mon côté mais je n'arrive pas à obtenir ce que je veux (j'ai essayé des while, for et foreach) , voici d'ailleurs un exemple de ce que j'ai testé. Le problème est que ça ne m'affiche pas les noms dans les pages correpondantes mais tous les noms sont listés les uns en dessous des autres sur la même page.

voici un essai avec une boucle foreach
 // Afficher en SELECTIONNANT UNE INITIALE
	elseif ($choix == 'lettre')
	{
		// création d'un tableau à 1 dimension pour mettre l'alphabet
		$lettres = array (1 => "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
		for ($a = 1 ; $a <= 26 ; $a++)
		{
			// affichage dans une nouvelle page
			echo "<a href='repertoire.php?action=afficher&choix=$lettres[$a]'> $lettres[$a]</a> &nbsp;";
			
		}
	}
	else
	{
		$lettres = array (1 => "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
		foreach ($lettres as $value)
		{			
			echo "<font size='7' font color='red'>   $value  </font> <br> <br>";
			$req_tout = "SELECT * FROM repertoire WHERE nom LIKE '$value%'";
			$result_tout = mysql_query($req_tout) or die ("Rechercher tout : impossible");
			while ($tout = mysql_fetch_array($result_tout))
			{
				$nom = strtoupper($tout['nom']);		// met directement les minucules en Majuscules
				$prenom = strtoupper($tout['prenom']);	// idem
				$adresse = $tout['adresse'];
				$ville = $tout['ville'];
				$code_postal = $tout['code_postal'];
				$tel_bureau = $tout['tel_bureau'];
				$tel_fixe = $tout['tel_fixe'];
				$categorie = $tout['categorie'];
				$tel_port_1 = $tout['tel_port_1'];
				$tel_port_2 = $tout['tel_port_2'];
				$mail_1 = $tout['mail_1'];
				$mail_2 = $tout['mail_2'];
				$mail_3 = $tout['mail_3'];
					
			echo "<font size=5> <b> $nom &nbsp; $prenom </b> </font> <br>
					Adresse : <b>$adresse</b> &nbsp; &nbsp; &nbsp;  Ville : <b>$ville</b> &nbsp; &nbsp; &nbsp; Code postal : <b>$code_postal</b> <br>
					Catégorie : <b>$categorie</b> <br>
					Téléphone fixe :  <b>$tel_fixe</b>  &nbsp; &nbsp; &nbsp;  De bureau : <b>$tel_bureau</b> <br>
					Téléphone portable : <b>$tel_port_1</b> &nbsp; &nbsp; &nbsp;&nbsp; <b>$tel_port_2</b> <br>
					Email : <b>$mail_1</b> &nbsp; &nbsp; &nbsp; &nbsp;	<b>$mail_2</b> &nbsp; &nbsp; &nbsp; &nbsp; <b>$mail_3</b> <br> <br>";
			}
		
		
		}	
		
	}// FIN afficher en SELECTIONNANT UNE LETTRE 
Si quelqu'un parmis vous pouvait m'aider ce serait bien car là je suis un peu perdue, je dois bien l'avouer.

A bientôt et merci à ceux qui se pencheront sur mon problème.
Calinette[/b]

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

03 août 2006, 17:23

Le principe est là mais si tu fais un "echo" tes données vont être écrites dans la page courante c'est normal...

Pour ce que tu veux faire si j'ai bien compris :

- chaque tour de boucle affiche dans la page un lien vers la page2 avec transmission du paramètre lettre dans l'url

- c'est dans page2 que tu mets ton code : requête SQL, affichage des infos

Eléphant du PHP | 88 Messages

03 août 2006, 17:57

Bonjour,

je ne comprends pas pourquoi tu veux faire ton code pour chaque lettre sachant que la lettre 'A' par exemple n'intervient pas dans le reste du code?

Pourquoi ne pas faire :
if ($action == 'afficher') 
{ 
    if ($choix == 'lettre') 
    { 
        // création d'un tableau à 1 dimension pour mettre l'alphabet 
        $lettres = array (1 => "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
        for ($a = 1 ; $a <= 26 ; $a++) 
        { 
            // affichage dans une nouvelle page 
            echo "<a href='repertoire.php?action=afficher&choix=$lettres[$a]'> $lettres[$a]</a> &nbsp;"; 
        } 
    } 
    else
    { 
        echo "<font size='7' font color='red'>   $choix  </font> <br> <br>"; 
        $req_tout = "SELECT * FROM repertoire WHERE nom LIKE '$choix%'"; 
        $result_tout = mysql_query($req_tout) or die ("Rechercher tout : impossible"); 
        while ($tout = mysql_fetch_array($result_tout)) 
        { 
            $nom = strtoupper($tout['nom']);        // met directement les minucules en Majuscules 
            $prenom = strtoupper($tout['prenom']);    // idem 
            $adresse = $tout['adresse']; 
            $ville = $tout['ville']; 
            $code_postal = $tout['code_postal']; 
            $tel_bureau = $tout['tel_bureau']; 
            $tel_fixe = $tout['tel_fixe']; 
            $categorie = $tout['categorie']; 
            $tel_port_1 = $tout['tel_port_1']; 
            $tel_port_2 = $tout['tel_port_2']; 
            $mail_1 = $tout['mail_1']; 
            $mail_2 = $tout['mail_2']; 
            $mail_3 = $tout['mail_3']; 
                     
        echo "<font size=5> <b> $nom &nbsp; $prenom </b> </font> <br> 
                Adresse : <b>$adresse</b> &nbsp; &nbsp; &nbsp;  Ville : <b>$ville</b> &nbsp; &nbsp; &nbsp; Code postal : <b>$code_postal</b> <br> 
                Catégorie : <b>$categorie</b> <br> 
                Téléphone fixe :  <b>$tel_fixe</b>  &nbsp; &nbsp; &nbsp;  De bureau : <b>$tel_bureau</b> <br> 
                Téléphone portable : <b>$tel_port_1</b> &nbsp; &nbsp; &nbsp;&nbsp; <b>$tel_port_2</b> <br> 
                Email : <b>$mail_1</b> &nbsp; &nbsp; &nbsp; &nbsp;    <b>$mail_2</b> &nbsp; &nbsp; &nbsp; &nbsp; <b>$mail_3</b> <br> <br>"; 
        } 
    }
}// FIN 
@+

Invité
Invité n'ayant pas de compte PHPfrance

03 août 2006, 18:13

Je n'ai pas tout bien saisis alors je vais essayer d'expliquer conrètement ce que je désire faire.

J'ai une page principale que j'ai appelé Repertoire.php.
Dans cette page, j'ai déjà fait plusieurs développements qui ne figure pas dans mon code présenté là (mon code fait 479 lignes).
Bon dans cette page repertoire.php j'ai créé 2 pages qui sont en fait issues de cette 1ere page repertoire.php concernant le mode d'affichage.
Il y a donc ma page d'acceuil repertoire qui s'appelle repertoire.php. sur cette page j'ai 2 liens :
- l'un envoie vers la page reperoire.php?action=afficher&choix=tout (là ça m'affiche les données de ma bdd dans l'ordre d'inserteion, c'était mon choix);
-ensuite la page repertoire.php?action=afficher&choix=lettre (ici je voulais que cette page m'affiche toutes les lettres de l'alphabet sous forme de lien et c'est tout).

Ensuite en cliquant sur une des lettre de l'alphabet, ça doit m'envoyer vers une nouvelle page sur laquelle doit apparaître tous les noms et les coordonnées commençant par cette même lettre.

Mon problème est que je n'arrive pas à trouver comment faire pour dire que pour chaque page, il faut inscrire les noms concernés. J'ai essayé de rajouter un 3èeme paramètre dans mon url (initiale=$lettres[$a]) mais je ne suis pas plus avancée. Mais peut être qu'on ne peut pas le faire ? (à mon niveau).

Pour le echo je sais que ça affiche dans la page courante mais je pensais trouver un système de boucle pour dire qu'il faut faire la recherche pour chaque lettre.

Je ne sais pas si j'ai été assez clair mais je vous remercie beaucoup. Je vais réfléchir à ce que vous m'avez dit et si vous avez d'autres idées, merci à vous.

calinette

Eléphant du PHP | 88 Messages

04 août 2006, 09:11

Salut.

Voici un petit bout de code que tu devras adapter à ta page. IL permet d'afficher une liste de client en fonction de la lettre choisie. Ici il y a 3 possibilités :
- tous les clients
- les clients commencants par un chiffre
- les clients commencants par la lettre A par exemple


Ce code permet de récuperer le choix de l'utilisateur (si il a cliqué sur A par exemple) et ensuite on affiche la liste de choix : Tous 0-9 A B C D E F ....
// on récupere les valeurs des variables du GET
$lettre = isset($_GET["lettre"]) ? $_GET["lettre"]: 0;
$chiffre = isset($_GET["chiffre"]) ? $_GET["chiffre"]: 0;
$tous = isset($_GET["tous"]) ? $_GET["tous"]: 0;

// affichage de la liste de choix : Tous 0-9 A B C D E F ....
$a = "97"; //caractere a en ascii
print "<a href=\"".$_SERVER['PHP_SELF']."?tous=1\"> Tous - </a>";
print "<a href=\"".$_SERVER['PHP_SELF']."?chiffre=1\"> 0-9 - </a>";
while ( $a <= 122 )
{
	print "<a href=\"".$_SERVER['PHP_SELF']."?lettre=".chr($a)."\"> ".chr($a-32)." - </a>";
	$a = $a+1;
}
Ensuite il faut faire la requête pour afficher les clients:
if (isset($_GET["chiffre"]) || isset($_GET["lettre"]) || isset($_GET["tous"])){
                // si c'est un chiffre
	if (isset($_GET["chiffre"]) && $_GET["chiffre"]==1){
		list($qh,$num) = dbQuery("select * from $CLIENT_TABLE WHERE organisation REGEXP \"^[0-9]\" order by organisation");
	}
                // si c'est une lettre
	elseif (isset($_GET["lettre"])){
		$query="select * from $CLIENT_TABLE WHERE organisation LIKE '".$lettre."%' order by organisation";
		list($qh,$num) = dbQuery($query);
	}
                // si c'est tous
	else{
		$query="select * from $CLIENT_TABLE order by organisation";
		list($qh,$num) = dbQuery($query);
	}
	// si aucun résultat
	if ($num == 0) {
		print "<tr><td align=\"center\" colspan=\"5\"><br>Il n'y a aucun client.<br><br></td></tr>";
	}
Bon courage

Eléphanteau du PHP | 13 Messages

04 août 2006, 17:41

Bonjour,

Alors voilà, j'ai fini par réussir mon code et en fait c'était beaucoup plus simple que je ne le pensais (je me compliquais le code, quoi) :)

Donc voilà, maintenant tout fonctionne et je le met sur le post :
/ Afficher en SELECTIONNANT UNE INITIALE
	elseif ($choix == 'lettre')  // on créé une page sur laquelle va figurer tous les liens qui vont envoyer vers les pages alphabétiques
	{
		// création d'un tableau à 1 dimension pour mettre l'alphabet
		$lettres = array (1 => "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
		for ($a = 1 ; $a <= 26 ; $a++)
		{
			// affichage dans une nouvelle page avec la liste des différents liens
			echo "<a href='repertoire.php?action=afficher&choix=$lettres[$a]'> $lettres[$a]</a> &nbsp;";
		}
	}
	
	else // on ne boucle pas car la variable $choix va être sélectionnée et transmise au code par l'action de cliquer dessus
	{
			echo "<font size='7' font color='red'>   $choix  </font> <br> <br>";
			$req_tout = "SELECT * FROM repertoire WHERE nom LIKE '$choix%'";
			$result_tout = mysql_query($req_tout) or die ("Rechercher tout : impossible");
			
		// on boucle pour prendre les infos de la bdd qui vont servir à l'affichage		
		while ($tout = mysql_fetch_array($result_tout))
		{
			$nom = strtoupper($tout['nom']);
			$prenom = ucfirst($tout['prenom']);
			echo "<font size=5> <b> $nom &nbsp; $prenom </b> </font> <br>
				Adresse : <b>{$tout['adresse']}</b> &nbsp; &nbsp; &nbsp;  Ville : <b>{$tout['ville']}</b> &nbsp; &nbsp; &nbsp; Code postal : <b>{$tout['code_postal']}</b> <br>
				Catégorie : <b>{$tout['categorie']}</b> <br>
				Téléphone fixe :  <b>{$tout['tel_fixe']}</b>  &nbsp; &nbsp; &nbsp;  De bureau : <b>{$tout['tel_bureau']}</b> <br>
				Téléphone portable : <b>{$tout['tel_port_1']}</b> &nbsp; &nbsp; &nbsp;&nbsp; <b>{$tout['tel_port_2']}</b> <br>
				Email : <b>{$tout['mail_1']}</b> &nbsp; &nbsp; &nbsp; &nbsp;	<b>{$tout['mail_2']}</b> &nbsp; &nbsp; &nbsp; &nbsp; <b>{$tout['mail_3']}</b> <br> <br>";
		} // fin boucle while
	} // fin boucle else
}// FIN afficher en SELECTIONNANT UNE LETTRE
J'avais rajouté une boucle qui ne servait strictement à rien :oops:

Merci à leakcim51 pour son morceau de code mais je n'ai pas dû l'utiliser. Mais rassure-toi, je vais le tester et cela m'a permit d'apprendre quelque chose de nouveau : la fonction chr().

Merci à tous ceux qui ont essayé de m'aider.
Au revoir
calinette