tri sur colonnes : à améliorer

Eléphant du PHP | 440 Messages

09 juin 2009, 11:07

Bonjour,

j'ai ce code qui fonctionne très bien mais pour lequel je voudrais 2 améliorations :
<?php

// Le nom de notre table
$tablename = 'table';


// Tri sur colonne
$tri_autorises = array('ville','activite');
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'ville';


// Sens du tri
$order_dir = isset($_GET['inverse']) ? 'DESC' : 'ASC';


// Préparation de la requête
$sql = "
	SELECT *
	FROM {$tablename}
	ORDER BY {$order_by} {$order_dir}
";
$result = mysql_query($sql);


// Notre fonction qui affiche les liens
function sort_link($text, $order=false)
{
	global $order_by, $order_dir;

	if(!$order)
		$order = $text;
	
	$link = '<a href="?order=' . $order;
	if($order_by==$order && $order_dir=='ASC')
		$link .= '&inverse=true';
	$link .= '"';
	if($order_by==$order && $order_dir=='ASC')
		$link .= ' class="order_asc"';
	elseif($order_by==$order && $order_dir=='DESC')
		$link .= ' class="order_desc"';
	$link .= '>' . $text . '</a>';
	
	return $link;
}


// Affichage
?>
<style type="text/css">
a.order_asc,
a.order_desc:hover { 
	padding-right:15px;
	background:transparent url(images/s_asc.png) right no-repeat;
}
a.order_desc,
a.order_asc:hover {
	padding-right:15px;
	background:transparent url(images/s_desc.png) right no-repeat;
}
</style>

                  <table>
                    <tr bgcolor="#FF9900"> 
                      <th> 
                        <?php echo sort_link('Ville', 'ville') ?>
                      </th>
		              <th> 
                        <?php echo sort_link('Activité', 'activite') ?>
                      </th>
	</tr>
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['ville'] ?></font></td>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['activite'] ?></font></td>
	</tr>
<?php endwhile ?>
</table>
D'abord je voudrais mettre une condition sur Ville pour dire que si le champ est vide, on n'affiche rien.

Ensuite, je voudrais que chaque ville et chaque activité soit cliquable. Si l'on clique sur une ville, on obtient un tableau avec toutes les activités de cette ville. Si l'on clique sur une activité, on obtient un tableau avec toutes les villes où l'on trouve cette activité.

Merci pour les pistes d'étude.
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 11:14

La condition est simple : si différent de vide alors...
if(!empty($ville))
	 echo $ville;
Ensuite pour ta seconde demande, il te suffit de passer dans l'URL une variable correspondant à l'ID. Cet ID va te permettre de récupérer toutes les données nécessaires de la ville ou de l'activité, et ensuite d'en faire ce que tu veux.

Eléphant du PHP | 440 Messages

09 juin 2009, 11:23

La condition est simple : si différent de vide alors...
if(!empty($ville))
	 echo $ville;
J'ai essayé un bête copier/coller. Effectivement, c'est bête puisqu'il ne se passe rien !
$ville n'existe pas dans le code, j'ai voulu mettre $_GET['order'] : 'ville' à la place, c'est pire.
Autre question, où le placer dans le code ?
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 11:30

Heu...j'ai juste mis $ville pour que tu saches que c'est la ville. Mais dans ton code c'est plutôt $row['ville'] non ?

Où le placer ? Là où tu affiches la ville.

Eléphant du PHP | 440 Messages

09 juin 2009, 11:40

j'ai plusieurs essais, je l'ai mis là où ça me semble logique :
// Tri sur colonne
$tri_autorises = array('ville','activite');
$order_by = in_array($_GET['order'],$tri_autorises) ? $_GET['order'] : 'ville';
if(!empty($row['ville']))
     echo $row['ville']; 
mais aucune solution ne fonctionne.
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 11:53

Dans ton code au-dessus, où affiches-tu "visuellement" la ville ?

Eléphant du PHP | 440 Messages

09 juin 2009, 12:54

Finalement, j'abandonne cette idée de condition qui n'est pas bonne puisque cela enlèverait certaines activités.

2e sujet : tu me dis :
"Ensuite pour ta seconde demande, il te suffit de passer dans l'URL une variable correspondant à l'ID. Cet ID va te permettre de récupérer toutes les données nécessaires de la ville ou de l'activité, et ensuite d'en faire ce que tu veux."

il faudrait être plus clair s'il te plaît.
il faut une variable $id = ??
dans l'url ??
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 14:02

Tu parles d'un clic sur ville ou activité. Donc qui dit clic dit lien. Pour moi l'URL c'est le lien en question qui sera sur ville et activité.

exemple :
<a href="ta_page.php?id=xxx" title="">ville</a>
Avec ce code, tu pourras récupérer l'ID de la ville avec $_GET. Et à partir de là tu peux en faire ce que tu veux grâce à la clause WHERE de ta requête.

Eléphant du PHP | 440 Messages

09 juin 2009, 14:13

mais avec id je vais obtenir 1 enregistrement dans ma table. Par exemple Paris peut apparaître 10 fois dans ma table. Je voudrais qu'en cliquant sur Paris, j'obtienne toutes les activités enregistrées sur Paris.

A l'inverse, je peux avoir Assurance. En cliquant dessus, j'ai toutes les villes où l'assurance est enregistrée comme activité.

Avec page.php?id=...., je ne pense avoir ce résultat.
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 14:18

Comment est constituée ta table ?
page.php?ville=paris
ne ferait pas l'affaire ? J'imagine que tu as un champ "ville" dans ta table non ?

Eléphant du PHP | 440 Messages

09 juin 2009, 14:31

dans la table, il y a un champ ville et un champ activite.

Comment on inclut une url là-dedans ?
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['ville'] ?></font></td>
		<td><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><?php echo $row['activite'] ?></font></td>
	</tr>
<?php endwhile ?>
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 14:39

Eh bien si tu as un champ ville et activité je ne vois d'où vient le problème. Avec page.php?ville=xxxxx tu peux récupérer tous les enregistrements dont ville correspond à xxxxx et après tu en fais ce que tu veux.

Pour l'URL c'est de l'HTML pur là.
<a href=""><?php echo $row['ville'] ?></a>

Eléphant du PHP | 440 Messages

09 juin 2009, 14:42

je dois mal comprendre quelque chose .... si j'écris sous cette forme page.php?ville=xxxxx, c'est moi qui entre le nom de la ville
Le principe est de cliquer sur le nom de la ville affiché.
Débutant complet en php/mysql. Merci pour votre aide.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 14:52

Si tu récupères dynamiquement le nom de la ville, tu mets juste le résultat récupéré à la place des xxxxx. Ce n'est pas toi qui va mettre un par un.

Par exemple
page.php?ville=<?php echo $row['ville']; ?>

Eléphant du PHP | 440 Messages

09 juin 2009, 14:59

ok,
ville.php?ville=<?php echo $row['ville'] ?>"><?php echo $row['ville'] ?></a>
a l'air de fonctionner, sauf que la page ville.php ne s'ouvre pas.

Mais ça doit être normal, elle est vide pour l'instant ![/php][/quote]
Débutant complet en php/mysql. Merci pour votre aide.