Affichage 1 fois et non n fois

Mammouth du PHP | 686 Messages

01 juil. 2009, 11:40

Je pense qu'il veut faire deux liste deroulantes distinctes, une avec la ville, l'autre avec l'activité
Donc deux requetes sql ca peut être pas trop mal ou alors il peut tenter de faire une requete normal avec sql et ensuite il utilise la fonction array_unique()

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 juil. 2009, 11:40

$sql = "SELECT DISTINCT 'ville', 'activite' FROM table"; 
Bien essayé ! Mais ça m'affiche "ville activite" :wink:
C'est quoi, ces apostrophes ??? :shock: :evil:

Mammouth du PHP | 686 Messages

01 juil. 2009, 11:43

$sql = "SELECT DISTINCT 'ville', 'activite' FROM table"; 
Bien essayé ! Mais ça m'affiche "ville activite" :wink:
C'est quoi, ces apostrophes ??? :shock: :evil:
Euh ba en fait je me suis planté, les apostrophe c'est pour donner une valeur a une variable, je sais pas pourquoi j'ai eu une brusque envie d'en mettre :D
$sql = "SELECT truc FROM table WHERE variable='valeur'";
Je suis bête ... excusez moi de ma grossière erreur ...

Eléphant du PHP | 440 Messages

01 juil. 2009, 11:50

l'affichage se fait sous forme d'un tableau. Voir la page :
http://www.businessclub-caz.com/recherche.php

Sans spécifier de DISTINCT ou de GROUP BY j'ai plusieurs fois la même ville et plusieurs fois les mêmes activités.

Si je mets ce code par exemple
$sql = "SELECT ville, activite FROM {$tablename} GROUP BY ville ORDER BY {$order_by} {$order_dir} ";
Chaque ville ne s'affiche qu'une fois. Et si je clique sur Antibes par exemple, je retrouve bien les 5 activités que je sais devoir y trouver et les enseignes qui vont avec.

Je voudrais avoir la même chose aussi sur la colonne Activités.
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 686 Messages

01 juil. 2009, 11:53

En gros tu veux une liste deroulante avec les villes et lorsque je selectionne l'autre ville il y a une seconde liste déroulante avec les activités qu'il y a dans cette ville ?

Eléphant du PHP | 141 Messages

01 juil. 2009, 11:54

OK alors il faut faire deux requêtes dans ce cas...
L'une avec un distinct (ou un group by) pour les villes, et l'autre pour les activités

Eléphant du PHP | 440 Messages

01 juil. 2009, 11:56

En gros tu veux une liste deroulante avec les villes et lorsque je selectionne l'autre ville il y a une seconde liste déroulante avec les activités qu'il y a dans cette ville ?
C'est ce qui est en ligne actuellement. Lorsqu'on clique sur une ville, on a un second tableau avec les activités de cette ville. Ou lorsqu'on clique sur une activité, on a un second tableau avec les villes où l'on trouve ces activités.

Dans le premier tableau, chaque ville n'apparaît qu'une fois. Je voudrais faire de même avec les activités.
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 686 Messages

01 juil. 2009, 12:03

A ok
Ba alors oui deux requetes comme j'avais dit
$sql_ville = "SELECT DISTINCT ville FROM table"; 
$sql_activite = "SELECT DISTINCT activite FROM table";
Tout simplement :D

Eléphant du PHP | 440 Messages

01 juil. 2009, 14:46

A ok
Ba alors oui deux requetes comme j'avais dit
$sql_ville = "SELECT DISTINCT ville FROM table"; 
$sql_activite = "SELECT DISTINCT activite FROM table";
Tout simplement :D
le problème est que je ne sais pas réutiliser ces 2 requêtes !
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 141 Messages

01 juil. 2009, 14:57

Tu peux les stocker dans un tableau :
$tab_ville = array();
$sql_ville = "SELECT DISTINCT ville FROM table";
$result_ville = mysql_query($sql_ville);
while ($ville = mysql_fetch_assoc($result_ville)) $tab_ville[] = $ville['ville'];

$tab_activite = array();
$sql_activite = "SELECT DISTINCT activite FROM table";
$result_activite = mysql_query($sql_activite);
while ($activite = mysql_fetch_assoc($result_activite)) $tab_activite[] = $activite['activite'];

Mammouth du PHP | 686 Messages

01 juil. 2009, 15:01

Pourquoi pas tout simplement :
//// Liste des villes
$sql_ville = "SELECT DISTINCT ville FROM table";
while($result_ville=mysql_fetch_array($sql_ville)){
echo $result_ville['ville'];
}
//// liste des activités
$sql_activite = "SELECT DISTINCT activite FROM table";
while($result_activite=mysql_fetch_array($sql_activite)){
echo $result_activite['activite'];
}

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juil. 2009, 15:09

Bonjour,

C'est normal que tu ne puisse pas avoir les villes sans doublons dans le résultat SQL, car ta requête sélectionne au moins 2 champs. Même si tu mets un DISTINCT ou un GROUP BY cela ne changera rien car le DISTINCT est utile quand on n'a pas de détail qui distingue les lignes ayant des valeurs commune. Et le GROUP BY n'est utile que lorsqu'on veut faire des calculs.

La solution dans ton cas est d'exécuter la requête comme elle est en utilisant bien sûr un ORDER BY qui classe les lignes par ville. Puis d'afficher le résultat de cette requête dans la table HTML en évitant les doublons de villes et en affichant la ville dans une cellule qui fusionne toutes les lignes qui affichent les activités ce cette ville. Pour cela il suffit d'utiliser un ROWSPAN dans chaque cellule qui affiche une ville.

Voici comment réaliser cette solution:
<p>Voici un exemple de table HTML qui fait un regroupement de lignes autour d'une cellule fusionnée verticalement (ROWSPAN)</p>
<table border="1">

<tr><td rowspan="4">Ville 1</td></tr>
<tr><td>Activité 1</td></tr>
<tr><td>Activité 2</td></tr>
<tr><td>Activité 3</td></tr>

<tr><td rowspan="3">Ville 2</td></tr>
<tr><td>Activité 1</td></tr>
<tr><td>Activité 2</td></tr>

</table>

<p>Et voici la même table produite par PHP depuis une source de données tableau (Array)</p>
<table border="1">
<?php 
// Source de données pour affichage
$data = array(  
	'ville 1' => array('Activité 1', 'Activité 2', 'Activité 3'), // Les activités sont regroupées par ville
	'ville 2' => array('Activité 1', 'Activité 2'),
);

// Affichage des données de la source $data
foreach($data as $ville=>$tab_activités){ // ROWSPAN = le nombre de lignes à fusionner = le nombre d'activités + une ligne pour la ville
	echo sprintf('<tr><td rowspan="%d">%s</td></tr>', count($tab_activités)+1, $ville);
	foreach($tab_activités as $activité){
		echo sprintf('<tr><td>%s</td></tr>', $activité);	
	}
}
?>
</table>

<p>Et voici la même table produite par PHP depuis une source de base de données (SQL)</p>
<table border="1">
<?php 
// Source de données pour affichage
$sql = "SELECT ville, activite FROM matable ORDER BY ville"; // liste des villes et activités classée par ville -+
$result = mysql_db_query('test', $sql, mysql_connect('localhost', 'root')) or die (mysql_error());
$data = array(); //tableau de données à produire pour l'affichage
while ($result && $row = mysql_fetch_array($result)){
	$ville = $row['ville']; // le champ ville servira comme index sans doublons pour le tableau $data
	$data[$ville][] = $row['activite']; //le champ activite sera stocké dans chaque index ville comme sous-tableau
}
mysql_close();
// Affichage des données de la source $data
if (count($data)>0){
	foreach($data as $ville=>$tab_activités){
		echo sprintf('<tr><td rowspan="%d">%s</td></tr>', count($tab_activités)+1, $ville);
		if (count($tab_activités)>0){
			foreach($tab_activités as $activité){
				echo sprintf('<tr><td>%s</td></tr>', $activité);	
			}
		}
		else { echo '<tr><td>Aucune activité trouvée !</td></tr>'; }
	}
}
else { echo '<tr><td>Aucune ville trouvée !</td></tr>'; }
?>
</table>

<p>ANNEXE: Voici le code SQL de la base de données de test</p>
<pre>
-- phpMyAdmin SQL Dump
-- version 3.1.3
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mer 01 Juillet 2009 à 14:53
-- Version du serveur: 5.1.32
-- Version de PHP: 5.2.9-1

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de données: `test`
--

-- --------------------------------------------------------

--
-- Structure de la table `matable`
--

CREATE TABLE IF NOT EXISTS `matable` (
  `ville` varchar(255) NOT NULL,
  `activite` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `matable`
--

INSERT INTO `matable` (`ville`, `activite`) VALUES
('Aix-en-Provence', 'Agence de voyages d''affaires'),
('Aix-en-Provence', 'Conseil en management de l''innovation'),
('Aix-en-Provence', 'Courtage en prêt professionnel'),
('Aix-en-Provence', 'Economie d''Impôt, Création de Valeurs - Patrimoine'),
('Aix-en-Provence', 'Formation professionnelle'),
('Aix-en-Provence', 'Formation, conseil'),
('Aix-en-Provence', 'Gestion de Patrimoine, conseils et courtage assurances et financier'),
('Aix-en-Provence', 'Prestations de services informatiques pour aider les chefs d entreprises '),
('Nice', 'Agence Conseil en communication'),
('Nice', 'Agence de business development'),
('Nice', 'Agence de Voyages'),
('Tunis, Tunisie', 'Affaires internationales');
</pre>
Modifié en dernier par sadeq le 01 juil. 2009, 15:20, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 440 Messages

01 juil. 2009, 15:17

Merci Sadeq pour le travail réalisé. Mais il y a un tel décalage entre le code utilisé sur ma page et celui que tu me proposes, et il y a tant d'ignorance chez moi, que je suis bien incapable d'abord d'être sûr de comprendre tes lignes de code, ensuite de les adapter !

Finalement ce qui est en ligne fait la moitié de ce que je voulais : les villes ne sont pas en double.
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 686 Messages

01 juil. 2009, 15:29

Pourquoi pas tout simplement :
//// Liste des villes 
$sql_ville = "SELECT DISTINCT ville FROM table"; 
while($result_ville=mysql_fetch_array($sql_ville)){ 
echo $result_ville['ville']; 
} 
//// liste des activités 
$sql_activite = "SELECT DISTINCT activite FROM table"; 
while($result_activite=mysql_fetch_array($sql_activite)){ 
echo $result_activite['activite']; 
} 
Tu fais un traitement pour les villes qui ne sont donc ainsi pas en double
et un second traitement completement indépendant pour les activités

Eléphant du PHP | 440 Messages

01 juil. 2009, 15:52

Pourquoi pas tout simplement :
//// Liste des villes 
$sql_ville = "SELECT DISTINCT ville FROM table"; 
while($result_ville=mysql_fetch_array($sql_ville)){ 
echo $result_ville['ville']; 
} 
//// liste des activités 
$sql_activite = "SELECT DISTINCT activite FROM table"; 
while($result_activite=mysql_fetch_array($sql_activite)){ 
echo $result_activite['activite']; 
} 
J'ai essayé mais ça ne fonctionne pas sans doute à cause du code préexistant.

Pour info le voici :
<?php

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


// 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 ville, activite
	FROM {$tablename}
	GROUP BY ville
	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 valign="top"> 
                          <?php echo sort_link('Ville', 'ville') ?>
                        </th>
		                <th valign="top"> 
                          <?php echo sort_link('Activit&eacute;', 'activite') ?>
                        </th>
	</tr>
<?php while( $row=mysql_fetch_assoc($result) ) : ?>
	<tr>
		                <td align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><a href="http://www.businessclub-caz.com/ville.php?ville=<?php echo $row['ville'] ?>">
                          <?php echo $row['ville'] ?>
                          </a></font></td>
		<td align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><a href="http://www.businessclub-caz.com/activite.php?activite=<?php echo $row['activite'] ?>"><?php echo $row['activite'] ?></a></font></td>
	</tr>
<?php endwhile ?>
</table>              
                    
Débutant complet en php/mysql. Merci pour votre aide.