8791 sujets

Développement web côté serveur, CMS

Bonsoir a tou(te)s

Je suis en train de plancher sur un script de gestion de liens. C'est une application personnelle que je suis en train de créer pour me faire une liste de mes liens favoris en page de démarrage.

J'ai crée deux tables:
- une table "bureau" qui gère les liens


Table Create Table
------ --------------------------------------------------------------------------------------
bureau CREATE TABLE `bureau` (
`id` int(11) NOT NULL auto_increment,
`lien` varchar(100) default NULL,
`url` varchar(250) default NULL,
`favicon` varchar(250) default NULL,
`cat` int(11) default '1',
`online` enum('Y','N') default 'Y',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1


- une table "bureau_cat" qui gère les catégories


Table Create Table
---------- ---------------------------------------------
bureau_cat CREATE TABLE `bureau_cat` (
`id` smallint(8) NOT NULL auto_increment,
`nom` varchar(100) default NULL,
`cat` smallint(8) default NULL,
`online` enum('Y','N') default 'Y',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1


Je voudrais afficher dans une balise <h1> le nom de chaque catégorie
et dans une liste de type <ul> chaque lien correspondant à cette catégorie. Ce qui donnerait à l'affichage quelque chose du type :

Nom de la catégorie
-----------------------
- lien 1
- lien 2
- ...

Voici ma fonction telle que je l'ai programmé pour le moment


function affichage_des_categories2() {
  //requete
  $result = mysql_query("select * from bureau_cat inner join bureau on bureau.cat = bureau_cat.cat where bureau.online = 'Y' and bureau_cat.online='Y'");

  // stoquage des données
  $arr = array();
  while( $ligne = mysql_fetch_array( $result ) )
  {
    $arr[$ligne['nom']][] = $liens = array( $ligne['lien'] => $ligne['url'] );
  }

  //affichage
  foreach ( $arr as $ligne['nom'] => $ligne['cat'] )
  {
    echo '<div class=\'cat\'>';
    echo '<h1>'.$ligne['nom'].'</h1>';
    foreach ( $arr[$ligne['nom']] as $ligne['lien'] => $ligne['url'] )
    {
      echo '<ul><li><a href='.$ligne['url'].'>'.$ligne['lien'].'</a></li></ul>';
    }
    echo '</div>';
  }
  /**/

  echo '<div style=\'clear:both;\'></div><pre>';
  echo print_r($arr);
  echo '</pre>';
  
}


Et une page pour visualiser le résultat : voir ici

Comment faire en sorte d'afficher correctement les champs lien et url de ma base ?

merci d'avance
Modifié par Corto Maltese (07 Oct 2007 - 02:45)
Salut

Deja je ne vois pas dans ton cas precis le sens de tes deux tables jointes par un champ non unique(categorie).
La table bureau avec le champ nom en plus serait largement suffisante.

function affichage_des_categories2() {
//requete
$result = mysql_query("SELECT* FROM bureau ORDER BY cat ASC");

$sortie = "";
while( $ligne = mysql_fetch_array( $result ) )
{
$sortie .= (isset($cat_en_cours) && $cat_en_cours!=$ligne['cat']) ? "</ul></div>" : "";
$sortie .= (!$cat_en_cours || $cat_en_cours!=$ligne['cat']) ? "<div class=\"cat\"><ul>" : "<li><a href='".$ligne['url']."'>".$ligne['lien']."</a></li>";

$cat_en_cours = $ligne['cat'];
}
$sortie .= "</ul></div>";

echo $sortie;

}
Merci pour ta réponse. J'ai tout à fait conscience qu'il y a plusieurs méthodes pour arriver à mes fins.

En fait, ce script a pour but de revoir les jointures et les tableaux, les deux tables c'est donc pour cela...
Je me demande si un deuxième foreach est judicieux pour afficher mes liens ou bien si il existe une fonction php pour afficher tout ça ?

Je suis complètement bloqué, si qqn pouvait me mettre sur la voie Smiley cligne
Bonjour,

il est un peu tard, du coup je suis pas certain d'être pertinent ...

Je ne comprend pas pourquoi tu fais ceci:

  // stoquage des données
  $arr = array();
  while( $ligne = mysql_fetch_array( $result ) )
  {
    $arr[$ligne['nom']][b][][/b] = $liens = array( $ligne['lien'] => $ligne['url'] );
  }


pourquoi ne pas faire tout simplement comme ça:

  // stoquage des données
  $arr = array();
  while( $ligne = mysql_fetch_array( $result ) )
  {
    $arr[$ligne['nom']][$ligne['lien']] = $ligne['url'];
  }


De cette manière, tu devrais pouvoir parcourir ton tableau simplement.
une requête de ce genre ne serait-elle pas plus appropriée que d'utiliser une jointure ?

$query = "SELECT * 
          FROM
            bureau_cat bc,
            bureau b
          WHERE
            b.cat = bc.cat AND
            b.online = 'Y' AND
            bc.online = 'Y'";

$result = mysql_query($query);

while($row = mysql_fetch_assoc($result) {
  //Ton code
}


Je ne vois pas l'intêret de créer un tableau supplémentaire, mysql_fetch_assoc crée déjà un tableau sur $row, il suffit d'y renseigner le nom du champ voulu. Du genre $row['cat'] affiche la première catégorie, puis à la boucle suivante affichera la seconde, etc. Ou bien je n'ai pas compris ce que tu voulais faire. Smiley decu
Modifié par Rasta31 (07 Oct 2007 - 02:41)
Francois44, tu as raison, j'ai utilisé ta façon de procéder qui convient parfaitement pour ce que je voulais faire à l'origine.

Merci maestro