### Liste des éditeurs

Reprenez l'exemple de la liste des auteurs et présentez une liste des éditeurs conçue sur le même principe.

liste des éditeurs

- La liste est triée alplhabétiquement sur le nom de l'éditeur.
- edWeb doit être un lien réel sur le site de l'éditeur.
- Schéma de la base de données

Une solution possible

Exercice : Exercice : liste des éditeurs
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Liste des éditeurs', 'bd.css'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT edNom, edWeb FROM editeurs ORDER BY edNom'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- htmlTable(array('Nom', 'Site web'), 'tab-bd'); while ($enr = mysqli_fetch_assoc($r)) { $enr['edWeb'] = trim($enr['edWeb']); htmlProteger($enr); $enr['edWeb'] = '<a href="http://'.$enr['edWeb'].'">' .$enr['edWeb'].'</a>'; htmlLigne($enr); } echo '</table>'; // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

### Liste des livres simple

Reprenez l'exemple de la liste des auteurs et présentez une liste des livres conçue sur le même principe.

liste des livres

- La liste est triée alplhabétiquement sur le titre.
- Quand le livre est écrit en français (liLangue = 'FR'), le prix doit être affiché comme 123.45 € (le symbole € est l'entité HTML &euro;). Sinon le prix doit être affiché comme $123.45.
- Le nom de l'éditeur est un lien vers son site web.
- Schéma de la base de données

Une solution possible

Exercice : Exercice : liste des livres simple
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Liste des livres', 'bd.css'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT liTitre, liAnnee, liPages, liPrix, edNom, liLangue, edWeb FROM livres, editeurs WHERE edID = liIDEditeur ORDER BY liTitre'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- htmlTable(array('Titre', 'Année', 'Pages', 'Prix', 'Editeur'), 'tab-bd'); while ($enr = mysqli_fetch_assoc($r)) { htmlProteger($enr); // Mise en forme du prix if ($enr['liLangue'] == 'FR') { $enr['liPrix'] .= ' &euro;'; } else { $enr['liPrix'] = '$'.$enr['liPrix']; } // Le nom de l'éditeur est un lien vers son site Web $enr['edNom'] = '<a href="http://'.trim($enr['edWeb']).'">' .$enr['edNom'].'</a>'; // Suppression des éléments non affichés unset($enr['liLangue'], $enr['edWeb']); htmlLigne($enr); } echo '</table>'; // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

### Liste des livres par catégorie

Présentez la liste des livres par catégorie (liCat).

liste des livres par catégories

- On utilise une seule requête SQL, triée alplhabétiquement sur la catégorie puis le titre.
- On utilise une seule table HTML pour tout l'affichage. La table fait 700 pixels de large.
- Il faut ajouter des CSS pour la table. Par exemple :

      .tab-bd-700 {
      	border-collapse: collapse;
      	border-spacing: 0;
      	margin: 0 auto;
      	width: 700px;
      	}
      .tab-bd-700 .tr-titre {
      	background: #eff9a7;
      	font-weight: bold;
      	}
      .tab-bd-700 .tr-sous-titre {
      	background: #ccc;
      	font-weight: bold;
      	}
      .tab-bd-700 .tr-fonce {
      	background: #eee;
      	}
      .tab-bd-700 td {
      	border: 1px solid #ddd;
      	padding: 2px;
      	vertical-align: top;
      	}

- Vous pouvez bien sûr modifier une ou des fonctions de la bibliothéque bib_fonctions.php
- Schéma de la base de données

Une solution possible

Exercice : Exercice : liste des livres par catégorie
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Livres par catégorie', 'bd.css'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT liTitre, liAnnee, liPages, edNom, liCat FROM livres, editeurs WHERE edID = liIDEditeur ORDER BY liCat, liTitre'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $cat = ''; $nb = 0; echo '<table class="tab-bd-700">'; while ($enr = mysqli_fetch_assoc($r)) { // Rupture catégorie : on fait le titre catégorie // et le nouvel en-tête de table if ($cat != $enr['liCat']) { $cat = $enr['liCat']; $nb = 0; htmlLigne(array(htmlentities($cat, ENT_COMPAT, 'ISO-8859-1'), '', '', ''), 'tr-titre'); htmlLigne(array('Titre', 'Année', 'Pages', 'Editeur'), 'tr-sous-titre'); } // Affichage des lignes unset($enr['liCat']); // Suppression élt non affiché htmlProteger($enr); htmlLigne($enr, ($nb++ % 2) ? 'tr-fonce' : ''); } echo '</table>'; // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

La fonction htmlLigne() est modifiée pour accepter un paramètre supplémentaire : une classe CSS pour la ligne.

    /**
     * Envoie à la sortie standard une ligne d'une table HTML
     *
     * @param array		$elts	Elements à afficher dans les colonnes
     * @param string	$css	Classe CSS éventuelle de la ligne
     */
    function htmlLigne($elts, $css = '') {
    	echo '<tr', ($css == '') ? '>' : " class='$css'>";

    	foreach ($elts as $elt) {
    		echo '<td>', $elt, '</td>';
    	}

    	echo '</tr>';
    }

### Liste des livres et de leur(s) auteur(s)

Présentez la liste des livres et de leur(s) auteur(s).

liste des livres par auteur

- La liste est triée alplhabétiquement sur le titre puis sur le nom / prénom de(s) l'auteur(s).
- On utilise une seule requête SQL.
- Schéma de la base de données

Une solution possible

Exercice : Exercice : liste des livres et de leur(s) auteur(s)
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Livres avec les auteurs', 'bd.css'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT liID, liTitre, liAnnee, liPages, auNom, auPrenom FROM livres, auteurs, aut_livre WHERE al_IDLivre = liID AND auID = al_IDAuteur ORDER BY liTitre, auNom, auPrenom'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $livreID = -1; $livre = array(); // stockage livre avant affichage htmlTable(array('Titre', 'Année', 'Pages', 'Auteur(s)'), 'tab-bd'); while ($enr = mysqli_fetch_assoc($r)) { // Même livre : il a donc plusieurs auteurs if ($livreID == $enr['liID']) { $livre['aut'] .= '<br>' .htmlentities($enr['auPrenom'] .' '.$enr['auNom'], ENT_COMPAT, 'ISO-8859-1'); continue; } // Affichage d'un livre if ($livreID != -1) { htmlLigne($livre); } // Stockage des éléments du livre $livre['titre'] = $enr['liTitre']; $livre['an'] = $enr['liAnnee']; $livre['pages'] = $enr['liPages']; $livre['aut'] = $enr['auPrenom'].' '.$enr['auNom']; htmlProteger($livre); $livreID = $enr['liID']; } if ($livreID != -1) { htmlLigne($livre); } echo '</table>'; // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>