par
angelus@diver » 09 juil. 2012, 11:47
Merci pour tes réponses Mazarini. J'ai trouvé le problème. Deux choses n'allaient pas. Tout d'abord, je m'excuse de vous avoir induit en erreur.
Après une vérification sur ma base de données, il y avait non pas 4 livres pour l'auteur en question mais trois.
Cependant la page m'affiche un lien supposé vers un autre livre.
En ajoutant un print_r après la première requête, sur la variable $data qui compte le nombre de livres par auteur, j'avais "quatre" comme résultat ! pour trois livres dans la base de données!!!
Le constat est que ma requête SQL n'était pas bonne. J'étais tellement obnubilé par la navigation que j'en ai oublié la requête

.
En fait tu avais raison, en aucun cas auteurs.id = à livres.id. Quelle stupidité!!!
La clé secondaire (table auteurs, auteurs=id = table livres, livres.auteur_id) dans ma table livres est livres.auteur_id, qui doit être égal à id dans where. Pour établir le compte, je n'ai plus besoin de jointure .
Cependant je me retrouve avec un problème identique :
je continue à avoir des liens qui s'affiche même quand tout les livres sont affichés. Et en cliquant sur ce lien une page sans données s'affiche !
Je ne comprends pas pourquoi sur un print_r($data), j'ai toujours un 4 qui s'affiche quelque soit l'id de l'auteur entré en paramètre !
Si le problème vient de l'offset, je ne vois pas quoi afficher d'autre si je veux que les pages s'affichent à compter du premier enregistrement sur la page 1. C'est d'ailleurs le cas.
<?php
include_once('connections/connect.inc.php') ;
class Pagination{
public static function getPagerData($nb_pages, $limit, $page){
$nb_pages = ceil($nb_pages / $limit);
$page = max($page, 1);
$page = min($page, $nb_pages);
$offset = ($page - 1) * $limit;
$ret = new stdClass;
$ret->offset = $offset;
$ret->limit = $limit;
$ret->nb_pages = $nb_pages;
$ret->page = $page;
return $ret;
}
}
$nom_page = htmlentities($_SERVER['PHP_SELF']);
$limit = 2;
if(!isset($_data))
{
try
{
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "
SELECT
count(livres.id)
AS total
FROM livres
WHERE livres.auteur_id=id";
$req = $bdd->prepare($query);
try {
$req->execute();
}
catch(PDOException $e) {
die('Erreur MySQL : ' . $e->errorInfo[2]);
}
$data = $req->fetch(PDO::FETCH_COLUMN);
}
catch (Exception $e)
{
$data = 0;
}
}
if( filter_has_var(INPUT_GET, "page") == false)
{
$page = 1;
}
elseif(filter_var($_GET['page'], FILTER_VALIDATE_INT, array("min_range"=>1, "max_range"=>$data)) == false)
{
$page = 1;
}
else
{
$page = (int)$_GET['page'];
}
if($data == 0)
{
$content = 'Il n\'y a pas de données.';
}
else
{
$pagination = Pagination::getPagerData($data, $limit, $page);
$offset = $pagination->offset;
$limit = $pagination->limit;
$page = $pagination->page;
$menu_pagination = '';
if($page != 1)
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.($page - 1).'"><< précédent </a></li>';
}
for ($i = 1; $i <= $pagination->nb_pages; $i++)
{
if ($i == $pagination->page)
{
$menu_pagination .= '<li class="selected">'.$i.'</li>';
}
else
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.$i.'">'.$i.'</a></li>'."\n";
}
}
if ($page < $pagination->nb_pages)
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.($page + 1).'"> suivant >></a></li>';
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = <<<EOQ
SELECT
livres.id,
livres.titre,
livres.sous_titre,
livres.lien_img,
livres.parution,
livres.resume,
livres.prix,
auteurs.prenom_nom AS auteur_nom,
auteurs.id AS auteur_id,
auteurs.lien_img AS auteur_img,
auteurs.biographie
FROM livres
INNER JOIN auteurs
ON auteurs.id = livres.auteur_id
WHERE auteurs.id = :id
LIMIT :limit
OFFSET :offset
EOQ;
$req = $bdd->prepare($query);
$req->bindParam(':limit', $limit, PDO::PARAM_INT);
$req->bindParam(':offset', $offset, PDO::PARAM_INT);
$req->bindValue(':id', (int)$_GET['id'], PDO::PARAM_INT);
try {
$req->execute();
}
catch(PDOException $e) {
die('Erreur MySQL : ' . $e->errorInfo[2]);
}
$res = $req->fetchAll(PDO::FETCH_ASSOC);
$content = '';
foreach ($res as $row)
{
$content .= '
<article id="content2">
<img src="img/cover_img/'.$row['lien_img'].'.png" alt="" id="cover">
<h2 class="titre"><a href="livre_numerique.php?id='.$row['id'].'">'.$row['titre'].'</a></h2>
<h3 class="titre">'.$row['sous_titre'].'</h3>
<p>Paru le : '.$row['parution'].'
</p>
<p>Description : '.$row['resume'].'</p>
<p class="prix">À partir de : '.$row['prix'].' €</p>
</article>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="stylesheet/basestyle.css" />
<link rel="stylesheet" href="stylesheet/auteurs.css" />
<title>DeemSoom : livre jeunesse par auteur</title>
</head>
<body>
<div id="bloc_page">
<header>
<img src="img/basestyle_img/logo.png" alt="logo DeemSoom" id="logo"/>
<div id="open_it">
<img src="img/basestyle_img/squirrel_log.png" alt="zèbre" id="img_log">
</div>
<nav id="nav_1">
<ul>
<li><a href="categories.php?id=1" class="0/3">0/3</a><span class="0/3ans">ans</span></li>
<li><a href="categories.php?id=2" class="3/6">3/6</a><span class="3/6ans">ans</span></li>
<li><a href="categories.php?id=3" class="6/9">6/9</a><span class="6/9ans">ans</span></li>
<li><a href="categories.php?id=4" class="9/13">9/13</a><span class="9/13ans">ans</span></li>
<li><a href="categories.php?id=5" class="13/+">13</a><span class="13ans/+">ans/+</span></li>
</ul>
</nav>
</header>
<?php include("navigation.php"); ?>
<?php include("recherche.php"); ?>
<section id="section1">
<article id="content1">
<img src="img/auteurs_img/<?php echo $row['auteur_img']; ?>.png" alt="" id="content1_cover">
<h1><?php echo $row['auteur_nom']; ?></h1>
<p><?php echo $row['biographie']; ?></p>
</article>
<?php echo $content; ?>
<ul id="page">
<?php echo$menu_pagination; ?>
</ul>
</section>
<?php include("pied.php"); ?>
</div>
</body>
</html>
<?php
$bdd=NULL;
?>
Merci pour tes réponses Mazarini. J'ai trouvé le problème. Deux choses n'allaient pas. Tout d'abord, je m'excuse de vous avoir induit en erreur.
Après une vérification sur ma base de données, il y avait non pas 4 livres pour l'auteur en question mais trois.
Cependant la page m'affiche un lien supposé vers un autre livre.
En ajoutant un print_r après la première requête, sur la variable $data qui compte le nombre de livres par auteur, j'avais "quatre" comme résultat ! pour trois livres dans la base de données!!!
Le constat est que ma requête SQL n'était pas bonne. J'étais tellement obnubilé par la navigation que j'en ai oublié la requête :oops: .
En fait tu avais raison, en aucun cas auteurs.id = à livres.id. Quelle stupidité!!!
La clé secondaire (table auteurs, auteurs=id = table livres, livres.auteur_id) dans ma table livres est livres.auteur_id, qui doit être égal à id dans where. Pour établir le compte, je n'ai plus besoin de jointure .
Cependant je me retrouve avec un problème identique :
je continue à avoir des liens qui s'affiche même quand tout les livres sont affichés. Et en cliquant sur ce lien une page sans données s'affiche !
Je ne comprends pas pourquoi sur un print_r($data), j'ai toujours un 4 qui s'affiche quelque soit l'id de l'auteur entré en paramètre ! :(
Si le problème vient de l'offset, je ne vois pas quoi afficher d'autre si je veux que les pages s'affichent à compter du premier enregistrement sur la page 1. C'est d'ailleurs le cas.
[php]<?php
include_once('connections/connect.inc.php') ;
class Pagination{
public static function getPagerData($nb_pages, $limit, $page){
$nb_pages = ceil($nb_pages / $limit);
$page = max($page, 1);
$page = min($page, $nb_pages);
$offset = ($page - 1) * $limit;
$ret = new stdClass;
$ret->offset = $offset;
$ret->limit = $limit;
$ret->nb_pages = $nb_pages;
$ret->page = $page;
return $ret;
}
}
$nom_page = htmlentities($_SERVER['PHP_SELF']);
$limit = 2;
if(!isset($_data))
{
try
{
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = "
SELECT
count(livres.id)
AS total
FROM livres
WHERE livres.auteur_id=id";
$req = $bdd->prepare($query);
try {
$req->execute();
}
catch(PDOException $e) {
die('Erreur MySQL : ' . $e->errorInfo[2]);
}
$data = $req->fetch(PDO::FETCH_COLUMN);
}
catch (Exception $e)
{
$data = 0;
}
}
if( filter_has_var(INPUT_GET, "page") == false)
{
$page = 1;
}
elseif(filter_var($_GET['page'], FILTER_VALIDATE_INT, array("min_range"=>1, "max_range"=>$data)) == false)
{
$page = 1;
}
else
{
$page = (int)$_GET['page'];
}
if($data == 0)
{
$content = 'Il n\'y a pas de données.';
}
else
{
$pagination = Pagination::getPagerData($data, $limit, $page);
$offset = $pagination->offset;
$limit = $pagination->limit;
$page = $pagination->page;
$menu_pagination = '';
if($page != 1)
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.($page - 1).'"><< précédent </a></li>';
}
for ($i = 1; $i <= $pagination->nb_pages; $i++)
{
if ($i == $pagination->page)
{
$menu_pagination .= '<li class="selected">'.$i.'</li>';
}
else
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.$i.'">'.$i.'</a></li>'."\n";
}
}
if ($page < $pagination->nb_pages)
{
$menu_pagination .= '<li><a href="'.$nom_page.'?id=' . (int)$_GET['id'] . '&page='.($page + 1).'"> suivant >></a></li>';
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = <<<EOQ
SELECT
livres.id,
livres.titre,
livres.sous_titre,
livres.lien_img,
livres.parution,
livres.resume,
livres.prix,
auteurs.prenom_nom AS auteur_nom,
auteurs.id AS auteur_id,
auteurs.lien_img AS auteur_img,
auteurs.biographie
FROM livres
INNER JOIN auteurs
ON auteurs.id = livres.auteur_id
WHERE auteurs.id = :id
LIMIT :limit
OFFSET :offset
EOQ;
$req = $bdd->prepare($query);
$req->bindParam(':limit', $limit, PDO::PARAM_INT);
$req->bindParam(':offset', $offset, PDO::PARAM_INT);
$req->bindValue(':id', (int)$_GET['id'], PDO::PARAM_INT);
try {
$req->execute();
}
catch(PDOException $e) {
die('Erreur MySQL : ' . $e->errorInfo[2]);
}
$res = $req->fetchAll(PDO::FETCH_ASSOC);
$content = '';
foreach ($res as $row)
{
$content .= '
<article id="content2">
<img src="img/cover_img/'.$row['lien_img'].'.png" alt="" id="cover">
<h2 class="titre"><a href="livre_numerique.php?id='.$row['id'].'">'.$row['titre'].'</a></h2>
<h3 class="titre">'.$row['sous_titre'].'</h3>
<p>Paru le : '.$row['parution'].'
</p>
<p>Description : '.$row['resume'].'</p>
<p class="prix">À partir de : '.$row['prix'].' €</p>
</article>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="stylesheet/basestyle.css" />
<link rel="stylesheet" href="stylesheet/auteurs.css" />
<title>DeemSoom : livre jeunesse par auteur</title>
</head>
<body>
<div id="bloc_page">
<header>
<img src="img/basestyle_img/logo.png" alt="logo DeemSoom" id="logo"/>
<div id="open_it">
<img src="img/basestyle_img/squirrel_log.png" alt="zèbre" id="img_log">
</div>
<nav id="nav_1">
<ul>
<li><a href="categories.php?id=1" class="0/3">0/3</a><span class="0/3ans">ans</span></li>
<li><a href="categories.php?id=2" class="3/6">3/6</a><span class="3/6ans">ans</span></li>
<li><a href="categories.php?id=3" class="6/9">6/9</a><span class="6/9ans">ans</span></li>
<li><a href="categories.php?id=4" class="9/13">9/13</a><span class="9/13ans">ans</span></li>
<li><a href="categories.php?id=5" class="13/+">13</a><span class="13ans/+">ans/+</span></li>
</ul>
</nav>
</header>
<?php include("navigation.php"); ?>
<?php include("recherche.php"); ?>
<section id="section1">
<article id="content1">
<img src="img/auteurs_img/<?php echo $row['auteur_img']; ?>.png" alt="" id="content1_cover">
<h1><?php echo $row['auteur_nom']; ?></h1>
<p><?php echo $row['biographie']; ?></p>
</article>
<?php echo $content; ?>
<ul id="page">
<?php echo$menu_pagination; ?>
</ul>
</section>
<?php include("pied.php"); ?>
</div>
</body>
</html>
<?php
$bdd=NULL;
?>[/php]