Forum de discussion et d'aide au php
Vous n'êtes pas identifié.
|
Regles d'utilisation des forums : pensez à toujours les respecter si vous désirez obtenir des réponses rapides. FAQ : pensez à toujours chercher dedans si la réponse à votre question est dedans. Proposez vos news : si vous avez un evenement à annoncer le chat : venez discuter de php. |
||
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 :
<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
<?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 :
<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
<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
Hors ligne
salut,
effectivement, le problème vient du fait que tes données de formulaires disparaissent de la variable $_POST
en fait, cette variable est réinitialisée à chaque appel de page. Donc à chaque fois que tu appelles une page (typiquement quand tu essaies de cliquer sur un lien de pagination, tu fais un appel en GET à une nouvelle page) tu perds le contenu de $_POST si tu ne postes rien.
je pense que tu devrais stocker les paramètres de ta recherches dans une session (qui elle va perdurer sur plusieurs pages).
Et à chaque fois que ton utilisateur lance une recherche, tu réinitialises les paramètres dans la session.
bon courage
Hors ligne
Hello lolo3129,
Je n'avais pas pensé aux session, mais il est vrai que cela permet de rendre des variables disponibles sur toutes les pages. Merci pour ta réponse. Je regarde ça et je te tiens au courant... en espérant mettre une belle étiquette "résolu" sur ce post
Bonne soirée
Hors ligne
Salut,
j avais un script du genre, mais pour une pagination ce n'est pas top' car a chaques fois que tu clique sur une autre page tu re-parcours tout les resultats qui ont dejas été parcouru, tu as des solution beaucoup plus optimal avec l'utilisation d'itérateurs et notament via PHP5 et la SPL.
Hors ligne
Bonjour,
Après moults essais, et autant de recherche, j'ai fini par trouver une solution à mon problème avec PEAR PAGER. C'est une très bonne classe, très facile à mettre en place.
Je remercie tous ceux qui se sont penchés sur ce post.
Hors ligne