Probleme de requete sql et pagination
Bonjour,
je travaille actuellement sur un guide pratique qui fonctionne sur un moteur de recherche interne qui se présente ainsi sur toutes les pages :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
<div id="barre">
<div style="text-align:center;">
<table align="center" class="moteur">
<tr>
<td class="align" colspan="3">
<p class="size" style="text-align:center;">
<div class="float">
Rechercher par :
</div>
<div class="float">
/ Prix
<form method="post" action="prix.php" onchange="submit()">
<select size="1" name="prix">
<option value="-1">Votre Choix</option>
<option value="cher">+ cher</option>
<option value="pascher">- cher</option>
</select>
</form>
</div>
<div class="float">
/ Ambiance
<?php
$query = "SELECT * FROM ambiance";
$donnees = mysql_query($query);
echo '<form action="ambiance.php" method="post" onchange="submit()">';
echo '<select size="1" name="ambiance"><option value="-1">Votre Choix</option>',"\n";
while($ambiance = mysql_fetch_row($donnees))
{
echo '<option value="'.$ambiance[1].'">'.$ambiance[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
/ Luminosité
<?php
$query = "SELECT * FROM luminosite";
$donnees = mysql_query($query);
echo '<form action="lumiere.php" method="post" onchange="submit()">';
echo '<select size="1" name="luminosite"><option value="-1">Votre Choix</option>',"\n";
while($luminosite = mysql_fetch_row($donnees))
{
echo '<option value="'.$luminosite[1].'">'.$luminosite[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
/ Station de Métro
<?php
$query = "SELECT * FROM metro";
$donnees = mysql_query($query);
echo '<form action="metro.php" method="post" onchange="submit()">';
echo '<select size="1" name="metro" onchange="submit()"><option value="-1">Votre Choix</option>',"\n";
while($metro = mysql_fetch_row($donnees))
{
echo '<option value="'.$metro[1].'">'.$metro[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
/ arrêt de bus
<?php
$query = "SELECT * FROM bus";
$donnees = mysql_query($query);
echo '<form action="bus.php" method="post" onchange="submit()">';
echo '<select size="1" name="bus"><option value="-1">Votre Choix</option>',"\n";
while($bus = mysql_fetch_row($donnees))
{
echo '<option value="'.$bus[1].'">'.$bus[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo'</form>';
?>
</div>
<div class="float">
/ WC <i>(Hygiène)</i>
<?php
$query = "SELECT * FROM wc_hygiene";
$donnees = mysql_query($query);
echo '<form action="hygiene.php" method="post" onchange="submit()">';
echo '<select size="1" name="hygiene"><option value="-1">Votre Choix</option>',"\n";
while($hygiene = mysql_fetch_row($donnees))
{
echo '<option value="'.$hygiene[1].'">'.$hygiene[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
/ WC <i>(Type)</i>
<?php
$query = "SELECT * FROM wc_type";
$donnees = mysql_query($query);
echo '<form action="type.php" method="post" onchange="submit()">';
echo '<select size="1" name="type"><option value="-1">Votre Choix</option>',"\n";
while($type = mysql_fetch_row($donnees))
{
echo '<option value="'.$type[1].'">'.$type[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
/ Rue
<form><input type="text" size="20" /></form>
</div>
</p>
</td>
</tr>
</table>
</div>
</div>
<div style="clear:both;"></div> |
Il est également présent sur la page index.php avec cette fonction de pagination
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
<?php
$ambiance = $_POST['ambiance'];
global $ambiance;
$hygiene = $_POST['hygiene'];
global $hygiene;
$type = $_POST['type'];
global $type;
function pagination($total,$courante)
{
/* on définit quelques variables dont on aura besoin */
$prec = $courante - 1; // numéro de la page précédente
$suiv = $courante + 1; // numéro de la page suivante
$avder = $total - 1; // avant dernière page
$adjacentes = 3; // nombre de pages à afficher de chaque côté de la page courante
$url = $_SERVER['RESQUEST_URI'];
/*
On commence la pagination que l'on stocke dans la variable à retourner
pagination() pourra ainsi être appelée plusieurs fois, en haut et en bas d'une page par exemple
*/
$pagination = ""; // s'il n'ya pas au moins deux pages, on n'affiche rien
if($total > 1) // il y a au moins deux pages
{
// on commence par stocker dans $pagination le <div> d'ouverture
$pagination .= "<div class=\"pagination\">\n";
// on affiche d'abord le bouton précédent
if ($courante == 2) // si on est sur la page 2, le bouton précédent renvoit sur la page initiale, il est inutile de mettre ?page=1 sinon on se retrouve avec un duplicate content
$pagination.= "<a href=\"$url\">« préc</a>";
elseif ($courante > 2) // si la page actuelle est supérieure à 2 le bouton précédent renvoit sur la page dont le numéro est immédiatement inférieur
$pagination.= "<a href=\"$url?page=$prec\">« préc</a>";
else // sinon on est sur la page 1 : on désactive le bouton précédent. on est nécessairement sur la page 1 car on a fait le traitement des pages dans index.php, pas besoin de mettre elseif ($courante==1)
$pagination.= "<span class=\"desactive\">« préc</span>";
/**
On affiche maintenant les pages. On cherchera à afficher au maximum 11 numéros de page en général, et 12 dans le cas 1 où il n'y a pas de troncature :
- dans un 1er cas, il n'y a pas assez de pages pour "tronquer la pagination" : on affiche toutes les pages
- dans le 2ème cas, il y a trop de pages : la troncature s'effectue selon la page sur laquelle on est positionnée
*/
// CAS 1 : il n'y a pas assez de pages pour tronquer, on les affiche toutes (voir figure 1)
if ($total < 7 + ($adjacentes * 2))
{
/*
on AJOUTE la page 1. On la traite séparément pour avoir index.php au lieu de index.php?page=1 et ainsi éviter le duplicate content
cette ligne équivaut à :
if ($courante == 1)
$pagination.= "<span class=\"courante\">1</span>";
else
$pagination.= "<a href=\"index.php\">1</a>";
*/
$pagination.= ($courante == 1) ? "<span class=\"courante\">1</span>" : "<a href=\"$url\">1</a>";
// pour les pages restantes on utilise une simple boucle for
for ($compteur = 2; $compteur <= $total; $compteur++)
{
if ($compteur == $courante) // on affiche la page courante différemment pour la mettre en évidence
$pagination.= "<span class=\"courante\">$compteur</span>";
else
$pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
}
}
// CAS 2 : on a assez de pages pour tronquer en fonction de la page actuelle
elseif($total > 5 + ($adjacentes * 2))
{
/*
on est placé dans la partie proche des premières pages, on tronque donc la fin de la pagination.
l'affichage sera 9 pages à gauche ... 2 pages à droite (voir figure 2)
*/
if($courante < 1 + ($adjacentes * 2))
{
// on affiche la page 1 comme vu précédemment
$pagination.= ($courante == 1) ? "<span class=\"courante\">1</span>" : "<a href=\"$url\">1</a>";
// puis les huit pages suivantes
for ($compteur = 2; $compteur < 4 + ($adjacentes * 2); $compteur++)
{
if ($compteur == $courante)
$pagination.= "<span class=\"courante\">$compteur</span>";
else
$pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
}
// les ... pour marquer la troncature
$pagination.= " ... ";
// et enfin les deux dernières pages
$pagination.= "<a href=\"$url?page=$avder\">$avder</a>";
$pagination.= "<a href=\"$url?page=$total\">$total</a>";
}
/*
on est placé dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
l'affichage sera 2 pages à gauche ... 7 pages au centre ... 2 pages à droite (voir figure 3)
*/
elseif($total - ($adjacentes * 2) > $courante && $courante > ($adjacentes * 2))
{
// on affiche les deux premières pages
$pagination.= "<a href=\"$url\">1</a>";
$pagination.= "<a href=\"$url?page=2\">2</a>";
// les ... pour marquer la troncature
$pagination.= " ... ";
// puis sept pages : les trois précédent la page courante, la page courante, puis les trois lui succédant
for ($compteur = $courante - $adjacentes; $compteur <= $courante + $adjacentes; $compteur++)
{
if ($compteur == $courante)
$pagination.= "<span class=\"courante\">$compteur</span>";
else
$pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
}
// les ... pour marquer la troncature
$pagination.= " ... ";
// et enfin les deux dernière spages
$pagination.= "<a href=\"$url?page=$avder\">$avder</a>";
$pagination.= "<a href=\"$url?page=$total\">$total</a>";
}
/*
sinon on est placé dans la partie de droite, on tronque donc le début de la pagination.
l'affichage sera 2 pages à gauche ... 9 pages à droite (voir figure 4)
*/
else
{
// on affiche les deux premières pages
$pagination.= "<a href=\"$url\">1</a>";
$pagination.= "<a href=\"$url?page=2\">2</a>";
// les ... pour marquer la troncature
$pagination.= " ... ";
// et enfin les neuf dernières pages
for ($compteur = $total - (2 + ($adjacentes * 2)); $compteur <= $total; $compteur++)
{
if ($compteur == $courante)
$pagination.= "<span class=\"courante\">$compteur</span>";
else
$pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
}
}
}
// pour finir on affiche le bouton suivant
if ($courante < $compteur - 1)
$pagination.= "<a href=\"$url?page=$suiv\">suiv »</a>\n";
else
$pagination.= "<span class=\"desactive\">suiv »</span>\n";
$pagination.= "</div>\n";
}
// et on retourne $pagination au programme appelant la fonction
return ($pagination);
}
?> |
Et le tout s'affiche (joliment) avec :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
<div id="mainContent">
<h1>Guide Pratique des Cafés de la Ville de Rennes</h1>
<?php
$max = mysql_query ("SELECT COUNT(*) FROM cafe");
$donnees = mysql_fetch_row($max);
?>
<h2>Actuellement <?php echo "<span class='color'>$donnees[0]</span>";?> lieux rennais référencés</h2>
<?php include ('inc/moteur.inc.php');?>
<hr />
<h3>Les dernières trouvailles :</h3>
<?php
include ('fonctions/pagination.php');
$query = mysql_query("SELECT COUNT(*) FROM cafe WHERE publie='oui'") or die(mysql_error());
$nb_entrees = mysql_result($query,0,0);
$entrees_par_page = 2;
$total_pages = ceil($nb_entrees/$entrees_par_page);
if(!isset($_GET['page'])){
$page_courante = 1;
} else {
$page = $_GET['page'];
if ($page<1) $page_courante=1;
elseif ($page>$total_pages) $page_courante=$total_pages;
else $page_courante=$page;
}
$start = ($page_courante * $entrees_par_page - $entrees_par_page);
$query = "SELECT * FROM cafe WHERE publie = 'oui' ORDER BY ajout DESC LIMIT $start, $entrees_par_page";
$resultat = mysql_query($query);
while($data = mysql_fetch_array($resultat))
{
echo "<table align='left' class='table'>\n";
echo "<tr>\n";
echo "<td colspan='3' class='td'>\n";
echo "<div class='titre'>".$data['nom']."</div>";
echo "</td>\n";
echo "<tr>\n";
echo "<td class='td'>\n";
echo "<img class ='img' src='admin/upload/".$data['image'].".jpg'>";
echo "</td>\n";
echo "<td colspan='2' rowspan='2' class='td'>\n";
echo "<p class='p'>Adresse : <span class='color'>".$data['adresse']."</span></p>\n";
echo "<p class='p'>Horaires : <span class='color'>".$data['horaires']."</span> - Fermé le : <span class='color'>".$data['fermeture']."</span></p>\n";
echo "<p class='p'>Visité le : <span class='color'>".$data['visite']."</span></p>\n";
$total = $data['prix_cafe']+$data['deca'];
echo "<p class='p'>Prix total : <span class='color'>".$total."€ </span> <i>(Café = <span class='color'>".$data['prix_cafe']."€ </span> Déca = <span class='color'>".$data['deca']."€</span>)</i></p>\n";
echo "<p class='p'>Ambiance : <span class='color'>".$data['ambiance']." ".$data['descriptif']."</span></p>\n";
echo "<p class='p'>Lumière : <span class='color'>".$data['luminosite']."</span> WC : <span class='color'>".$data['type']."</span> Hygiène : <span class='color'>".$data['hygiene']."</span></p>\n";
echo "</td>\n";
echo "</tr>\n";
echo "<tr>\n";
echo "<td class='td'>\n";
echo "<p class='p'>Metro : <span class='color'>".$data['station']."</span></p>\n";
echo "<p class='p'>Bus : <span class='color'>".$data['arret']."</span></p>\n";
echo "</td>\n";
echo "</tr>\n";
echo "</table>\n";
}
echo "<div style='text-align:center;clear:both;'>";
echo "<p> </p>\n";
echo pagination($total_pages,$page_courante);
echo "</div>";
echo "<p style='text-align:center;font-weight:bold;'>Il y a " .$nb_entrees. " cafés</p>";
?>
</body>
</html> |
Jusque là tout va bien... le couac vient de l'affichage après selection dans le moteur de recherche. La première page s'affiche correctement, mais lorsque l'on clic sur les autres numéros de pages (et bouton suivant), j'ai cette erreur qui apparait :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/cigam/www/uncafeundecacreme/hygiene.php on line 41
Pour être plus clair, le code de la page hygiene.php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
<h1>Guide Pratique des Cafés de la Ville de Rennes</h1>
<?php
$max = mysql_query ("SELECT COUNT(*) FROM cafe");
$donnees = mysql_fetch_row($max);
?>
<h2>Actuellement <?php echo "<span class='color'>$donnees[0]</span>";?> lieux rennais référencés</h2>
<?php include ('inc/moteur.inc.php');?>
<hr />
<?php
include ('fonctions/pagination.php');
echo "<h3>Résultat de votre recherche : <span class='color'>Hygiene ".$hygiene."</span></h3>";
$query = mysql_query("SELECT COUNT(*) FROM cafe WHERE hygiene LIKE '$hygiene' AND publie = 'oui'") or die(mysql_error());
$nb_entrees = mysql_result($query,0,0);
$entrees_par_page = 2;
$total_pages = ceil($nb_entrees/$entrees_par_page);
if(!isset($_GET['page'])){
$page_courante = 1;
} else {
$page = $_GET['page'];
if ($page<1) $page_courante=1;
elseif ($page>$total_pages) $page_courante=$total_pages;
else $page_courante=$page;
}
$start = ($page_courante * $entrees_par_page - $entrees_par_page);
$query = "SELECT * FROM cafe WHERE hygiene LIKE '$hygiene' AND publie = 'oui' ORDER BY nom DESC LIMIT $start, $entrees_par_page" or die(mysql_error());
$resultat = mysql_query($query);
while($data = mysql_fetch_array($resultat))
{
include ('inc/resultat.inc.php');
}
echo "<div style='text-align:center;clear:both;'>";
echo "<p> </p>\n";
echo pagination($total_pages,$page_courante);
echo "</div>";
echo "<p style='text-align:center;font-weight:bold;'>Il y a " .$nb_entrees. " cafés</p>";
?>
<p> </p> |
j'ai l'impression que ma variable de formulaire se volatilise après la page une... d'ou ma tentative avec une variable globale.
Désolé pour le pavé que je laisse, mais j'espère que vous pourrez m'aider à résoudre ce problème.
Par avance, merci beaucoup à ceux qui vont se pencher sur le problème