problème pagination ( mysql)

Répondre
Kniva
le 28/05/2010 à 14:56
Kniva
Bonjour,
dans le cadre de mon stage de fin d'année, je suis amenée a faire une site web pour une libraire. Pour que les pages web soient plus lisibles, j'ai choisi de faire une pagination. Or, je rencontre un problème.
Voici mon code:
<HTML>
<HEAD>
<TITLE> Hon'Ya Manga DVD/CD </TITLE>
<link rel="shortcut icon" type="image/png" href="favicon.png" />
<LINK type="text/css" rel="stylesheet" href="styles.css">
<SCRIPT LANGUAGE="JavaScript">
var aujourdhui=new Date()
var heure=aujourdhui.getHours()
var minutes=aujourdhui.getMinutes()
var salutation

//De 1h du matin jusqu'à midi (non compris), c'est le matin
if (heure<=11)
{
salutation="Bonjour!"
}

//De midi à 17heures, c'est l'après midi
else if (heure > 11 && heure <18)
{
salutation="Bon après-midi!"
}

//De 18heures à 20 heures, c'est le soir
else if (heure > 17 && heure <21)
{
salutation="Bonne soirée!"
}

//De 21heures à minuit, c'est la nuit
else if (heure >20)
{
salutation="Bonne nuit!"
}

//Les minutes sont affichées sur 2chiffres. ON ajoute donc un 0 à tte valeur inférieure à 10.
if (minutes<10)
{
minutes="0"+minutes
}
document.write(salutation+"\nIl est "+ heure+"h"+minutes);

function popup(page) {
window.open(page,'popup','width=500,height=400,toolbar=false,scrollbars=false');
}
function popop(page) {
window.open(page,'popup','width=500,height=300,toolbar=false,scrollbars=false');
}
</SCRIPT>
<?php
function barre_naviguation($nb_total, $nb_affichage_par_page, $debut, $nb_liens_ds_la_barre)
{
$barre='';
/*on récupère l'URL courante munie de ses paramètres auxquels on ajoute le paramètre 'début' qui jouera le rôle du premier élément
de notre LIMIT*/
if($_SERVER['QUERY_STRING']== "")
{
$query=$_SERVER['PHP_SELF'].'?debut=';
}
else
{
$tableau=explode("debut=", $_SERVER['SUERY_STRING']);
$nb_element=count($tableau);
if($nb_element==1)
{
$query=$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut=';
}
else
{
if($tableau[0]=="")
{
$query=$_SERVER['PHP_SELF'].'?debut=';
}
else
{
$query=$_SERVER['PHP_SELF'].'?'.$tableau[0].'debut=';
}
}
}
//on calcule le numéro de la page active
$page_active=floor(($debut/$nb_affichage_par_page)+1);
//on calcule le nombre de pages totales que va prendre notre affichage
$nb_pages_tolal=ceil($nb_total/$nb_affichage_par_page);
//on calcule le premier numero qui va s'afficher, ainsi que le dernier($cpt_deb et $cpt_fin)
if($nb_liens_ds_la_barre%2==0)
{
$cpt_deb1=$page_active-($nb_liens_ds_la_barre/2)+1;
$cpt_fin1=$page_active+($nb_liens_ds_la_barre/2);
}
else
{
$cpt_deb1=$page_active-floor(($nb_liens_ds_la_barre/2));
$cpt_fin1=$page_active+floor(($nb_liens_ds_la_barre/2));
}
if($cpt_deb1<=1)
{
$cpt_deb=1;
$cpt_fin=$nb_liens_ds_la_barre;
}
elseif($cpt_deb1>1 && $cpt_fin1<$nb_pages_total)
{
$cpt_deb=$cpt_deb1;
$cpt_fin=$cpt_fin1;
}
else
{
$cpt_deb=($nb_pages_total-$nb_liens_ds_la_barre)+1;
$cpt_fin=$nb_pages_total;
}
if($nb_pages_total<=$nb_liens_ds_la_barre)
{
$cpt_deb=1;
$cpt_fin=$nb_pages_total;
}
//si les premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
if($cpt_deb!=1)
{
$cible=$query.(0);
$lien='<a href=" ' .$cible. ' ">&lt;&lt;</a>&nbsp;&nbsp;';
}
else
{
$lien='';
}
$barre .=$lien;
//on affiche ts les liens ds notre barre, tt en vérifiant de ne pas mettre de lien pr la page active
for($cpt=$cpt_deb;$cpt_fin;$cpt++)
{
if($cpt==$page_active)
{
if($cpt==$nb_pages_total)
{
$barre .=$cpt;
}
else
{
$barre .=$cpt.'&nbsp;&nbsp';
}
}
else
{
if($cpt==$cpt_fin)
{
$barre .="<a href=' ".$query.(($cpt-1)*$nb_affichage_par_page);
$barre .="'>".$cpt."</a>&nbsp;-&nbsp;";
}
}
}
$fin=($nb_total-($nb_total%$nb_affichage_par_page));
if(($nb_total%$nb_affichage_par_page)==0)
{
$fin=$fin-$nb_affichage_par_page;
}
/*si $cpt_fin ne vaut pas la dernière page de la barre de naviguation, on affiche un >> qui sera un lien vers la dernière page
de naviguation.*/
if($cpt_fin!=$nb_pages_total)
{
$cible=$query.$fin;
$lien='&nbsp;&nbsp;<a href="' .$cible. '">&gt;&gt;</a>';
}
else
{
$lien='';
}
$barre .=$lien;
return $barre;
}
?>
</HEAD>
<BODY bgcolor="#9FB6CD">
<CENTER>

<div id="conteneur">

<TABLE class="page"border="0" cellspacing="0" cellpadding="0">
<TR >
<TD><img src="avant.png"><a href="login.php"onMouseOver="document.img_7.src='sidentifier1.png';"
onMouseOut="document.img_7.src='sidentifier.png';">
<img class="img" name="img_7" src="sidentifier.png"> </a></TD>
</TR>

<TR style="background-image: url(fondbann.png)" height="192"class="bann">

<TD align="center" valign="bottom"><table border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="bottom"><img src="ideelogo.png"><IMG src="favicon1.png"><img src="bannierepersoconnu3.png"></td>
</tr>
<tr>
<td align="center" valign="bottom"><img src="adresse.png"></td>
</tr>
</table></TD>
</TR>
<TR align="center"style="background-image: url(fondmenu.png)" height="117">
<TD valign="top">
<TABLE border="0" cellspacing="0" cellpadding="0">
<TR>
<TD><a href="index.html"
onMouseOver="document.img_1.src='index1.png';"
onMouseOut="document.img_1.src='index.png';">
<img class="img" name="img_1" src="index.png"> </a></TD>
<TD><IMG src="favicon1.png"></TD>
<TD><a href="mangas.php"
onMouseOver="document.img_2.src='mangas1.png';"
onMouseOut="document.img_2.src='mangas.png';">
<img class="img" name="img_2" src="mangas.png"> </a></TD>
<TD><IMG src="favicon1.png"></TD>
<TD><a href="DVD.php"
onMouseOver="document.img_3.src='dvdcd1.png';"
onMouseOut="document.img_3.src='dvdcd.png';">
<img class="img" name="img_3" src="dvdcd.png"> </a></TD>
<TD><IMG src="favicon1.png"></TD>
<TD><a href="goodies.php"
onMouseOver="document.img_4.src='goodies1.png';"
onMouseOut="document.img_4.src='goodies.png';">
<img class="img" name="img_4" src="goodies.png"> </a></TD>
<TD><IMG src="favicon1.png"></TD>
<TD><a href="news.php"
onMouseOver="document.img_6.src='nouveautes1.png';"
onMouseOut="document.img_6.src='nouveautes.png';">
<img class="img" name="img_6" src="nouveautes.png"> </a></TD>
<TD><IMG src="favicon1.png"></TD>
<TD><a href="contact.html"
onMouseOver="document.img_5.src='contact1.png';"
onMouseOut="document.img_5.src='contact.png';">
<img class="img" name="img_5" src="contact.png"> </a></TD>
</TR>
</TABLE>
</TD>

</TD>
</TR>
<TR style="background-image: url(fondreste.png)" height="671" valign="top">
<TD>
<TAble border="0" cellspacing="0" cellpadding="0" align="center">
<TR valign="top">

<TD align="left"><a href="DVD.php"><IMG src="dvd.png"></a></TD>
<TD align="right"><a href="CD.php"><IMG src="cd.png"></a></TD>
</TR>
<TR >
<TD>
<?php
include("inf.php");
//on se connecte à notre base
$base=mysql_connect(SERVER,LOGIN,MDP);
mysql_select_db(BDD,$base);
/*on prépare une requête permettant de calculer le nbre total d'éléments qu'il faudra afficher sur
nos différentes pages*/
$sql='SELECT dvdTitre, dvdDate,dvdEditeur, dvdImage, dvdDescription FROM DVD';
//on exécute cette requête
$resultat=mysql_query($sql,$base) or die ('Erreur SQL!<br/>'.$sql.'<br/>'.mysql_errror());
//on récupère le nombre d'élements à afficher
$nb_total=mysql_fetch_array($resultat);
//on teste si ce nombre ne vaut pas 0
if(($nb_total=$nb_total[0])==0)
{
echo"Aucune réponse trouvée";
}
else
{
echo'<table>
<tr><td>dvdTitre</td><td rowspan="4">dvdImage</td></tr>
<tr><td>dvdDate</td></tr>
<tr><td>dvdEditeur</td></tr>
<tr><td>dvdDescription</td></tr>
</table>';
}
/*sinon, on regarde si la variable $debut ( le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on
l'initialise à 0.*/
if(!isset ($_GET['debut']))
{
$_GET['debut']=0;
$nb_affichage_par_page=1;
//preparation de la requete avec le LIMIT
$sql='SELECT dvdTitre, dvdDate, dvdEditeur, dvdDescription, dvdImage FROM DVD ORDER BY dvdDate DESC'
. $_GET['debut'] . ','. $nb_affichage_par_page;
//on exécute la requete
$req=mysql_query($sql) or die ('Erreur SQL!<br/>' .$sql. '<br/>'. mysql_error());
//on va scanner tous les tuples un par un
while($data=mysql_fetch_array($req))
{
//on affiche les résultats ds la <table>
echo'<tr><td>'. htmlentities (trim($data['dvdTitre'])).'</td></tr>';
echo'<tr><td>'. htmlentities (trim($data['dvdImage'])).'</td></tr>';
echo'<tr><td>' . htmlentities (trim($data['dvdDate'])) .'</td></tr>';
echo'<tr><td>' . htmlentities (trim($data['dvdEditeur'])). '</td></tr>';
echo'<tr><td>' . htmlentities (trim($data['dvdDescription'])). '</td></tr>';
}
//on libere l'espace memoire alloué pour cette requete
mysql_free_result($req);
echo'</table><br/>';
//on affiche enfin notre barre
echo'<span class="gras">' . barre_naviguation($nb_total,$nb_affichage_par_page, $_GET['debut'], 5) . '</span>';
}
//on libère l'espace memoire alloué pour cette reuqête
mysql_free_result($resultat);
echo'</table><br/>';
?>
</TD>
</TR>
</Table>
</TD>
</TR>
<TR>
<TD align="center"><A HREF='javascript:popup("mentions legalesdvd.html")'class="type1">Mentions l&eacute;gales</A>-
<A HREF='javascript:popop("credit.html")'class="type1">Cr&eacute;dit</A></TD>

</TR>
</TABLE>

</div>
</BODY>
</HTML>


Quand je vais sur le site, car il est en ligne, je tombe sur ce message d'erreur:

Aucune réponse trouvéeErreur SQL!
SELECT dvdTitre, dvdDate, dvdEditeur, dvdDescription, dvdImage FROM DVD ORDER BY dvdDate DESC0,1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC0,1' at line 1


Je suis presque sûr que mon erreur vient de cette ligne
$sql='SELECT dvdTitre, dvdDate, dvdEditeur, dvdDescription, dvdImage FROM DVD ORDER BY dvdDate DESC'
. $_GET['debut'] . ','. $nb_affichage_par_page;

mais je ne vois pas ce qu'il faut changer.
Pourriez vous m'éclairer? Merci beaucoup
Kniva
le 28/05/2010 à 15:52
Kniva
Mais il y a déjà un espace entre le DESC et le 0, j'ai même fait un saut à la ligne pour avoir tout de visible sur mon écran
LA GLOBULE
le 28/05/2010 à 16:25
LA GLOBULE
Je voulais dire un espace dans le "code SQL qui sera généré", pas directement dans le code PHP.

Bref, met un espace avant le ' qui suit ton DESC.
Kniva
le 28/05/2010 à 16:47
Kniva
C'est fait, mais ça ne change rien.
Je sais que j'avais retirer ce qui suivait mon DESC, tout ce qui était dans ma base de données s'affichait, mais je n'avait aucune pagination
LA GLOBULE
le 28/05/2010 à 17:08
LA GLOBULE
Pourtant, l'erreur, c'est ca.
Remontre nous ton code modifié.

Et oui, c'est sur, si tu vires les LIMIT, c'est normal que tout soit retourné par la requete SQL.
Kniva
le 28/05/2010 à 17:18
Kniva
je ne remontre pas toute la page de code, juste les lignes qui posent problème

<?php
if(!isset ($_GET['debut']))
{
$_GET['debut']=0;
$nb_affichage_par_page=1;
//preparation de la requete avec le LIMIT
$sql='SELECT dvdTitre, dvdDate, dvdEditeur, dvdDescription, dvdImage FROM DVD ORDER BY dvdDate DESC ' . $_GET['debut'] . ','. $nb_affichage_par_page;
//on exécute la requete
$req=mysql_query($sql) or die ('Erreur SQL!<br/>' .$sql. '<br/>'. mysql_error());
//on va scanner tous les tuples un par un
while($data=mysql_fetch_array($req))?>


Et j'ai toujours la même erreur

Aucune réponse trouvéeErreur SQL!
SELECT dvdTitre, dvdDate, dvdEditeur, dvdDescription, dvdImage FROM DVD ORDER BY dvdDate DESC 0,1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0,1' at line 1
LA GLOBULE
le 28/05/2010 à 17:24
LA GLOBULE
Arf, je n'ai pas les yeux en face des trous.

Donc excepté le bug de l'espace manquant que tu as fixé, il te manque aussi le mot clé LIMIT à ta requete SQL.

Ex : ORDER BY dvdDate DESC LIMIT 0,1
Kniva
le 28/05/2010 à 17:33
Kniva
Je t'embrasserais presque ( pardon, je m'emporte, mais ça fait 24h que je bosse la dessus, et à la fin, on ne vois même plus les lignes justes des lignes fausses).

Bon c'est mieux que tout à l'heure, j 'ai quelque chose qui s'affiche, mais pas comme je voudrais. J'ai:

Aucune réponse trouvée
.....
Et ensuite le nom, la date la description du premier article, mais pas la suite, alors qu'il y a plusieurs articles
LA GLOBULE
le 28/05/2010 à 17:38
LA GLOBULE
Pour cela, fait varier les chiffres de tes LIMIT.
Augmente la valeur de $nb_affichage_par_page.

Et le "Aucune réponse trouvée", c'est parce que tu n'as pas fais la bonne requete à la ligne 249.
Il faut faire un select count(*) from DVD
Répondre
LoadingChargement en cours