问题
I have a script with the code below and a pagination where the user can check checkboxes to narrow doen the results shown everything seems to work great the only problem is that when a user clicks the next page in the pagination the results are lost and the default results are shown. I think I may need to use sessions to store the query or statement but I am unsure how to use them. If anyone can help me or point me in the right direction I would be very greatful.
Here is my code
<?php
//get the function
include ($_SERVER['DOCUMENT_ROOT'] .'/scripts/function1.php');
$page = (int) (!isset($_GET["page"]) ? 1 : $_GET["page"]);
$limit = 14;
$startpoint = ($page * $limit) - $limit;
if(isset($_POST['muscle'])) {
// Runs mysql_real_escape_string() on every value encountered.
$clean_muscle = array_map('mysql_real_escape_string', $_REQUEST['muscle']);
// Convert the array into a string.
$muscle = implode("','", $clean_muscle);
if (!empty($_POST['muscle'])) {
$options[] = "muscle IN ('$muscle')";
} else {
$options[] = "";
}
} else {
$options[] = "allmuscle = 'all' ";
}
if(isset($_POST['equipment'])) {
// Runs mysql_real_escape_string() on every value encountered.
$clean_equipment = array_map('mysql_real_escape_string', $_REQUEST['equipment']);
// Convert the array into a string.
$equipment = implode("','", $clean_equipment);
if (!empty($_POST['equipment'])) {
$options[] = "equipment IN ('$equipment')";
} else {
$options[] = "";
}
} else {
$options[] = "allequipment = 'all'";
}
if(isset($_POST['all'])) {
$options[] = "";
}
$fullsearch = implode(' AND ', $options);
$statement = "exercise ";
if ($fullsearch <> '') {
$statement .= " WHERE " . $fullsearch;
} else {
$statement .= "";
}
if(!$query = mysql_query("SELECT * FROM {$statement} LIMIT {$startpoint} , {$limit}"))
{
echo "Cannot parse query";
}
elseif(mysql_num_rows($query) == 0) {
echo "No records found";
}
else {
while($row = mysql_fetch_assoc($query)) {
echo "".$row['name'] ."<br />
".$row['description'] ."";
}
}
echo "<div class=\"new-pagination\">";
echo pagination($statement,$limit,$page);
echo "</div>";
?>
and here is the pagination script
<?php
function pagination($query, $per_page = 10, $page = 1, $url = '?'){
$query = "SELECT COUNT(*) as `num` FROM {$query}";
$row = mysql_fetch_array(mysql_query($query));
$total = $row['num'];
$adjacents = "1";
$page = ($page == 0 ? 1 : $page);
$start = ($page - 1) * $per_page;
$firstPage = 1;
$prev = ($page == 1)?1:$page - 1;
$prev = $page - 1;
$next = $page + 1;
$lastpage = ceil($total/$per_page);
$lpm1 = $lastpage - 1;
$pagination = "";
if($lastpage > 1)
{
$pagination .= "<ul class=\"pagination1\">";
if ($page == 1)
{
$pagination.= "<li><a class=\"inactive\">First</a></li>";
$pagination.= "<li><a class=\"inactive\">Prev</a></li>";
}
else
{
$pagination.= "<li><a href=\"{$url}page=$firstPage\" >First</a></li>";
$pagination.= "<li><a href=\"{$url}page=$prev\" >Prev</a></li>";
}
$pagination .= "<li class=\"details\">Page $page of $lastpage</li>";
if ($lastpage < 7 + ($adjacents * 2))
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "<li><a class=\"current\">$counter</a></li>";
else
$pagination.= "<li><a href=\"{$url}page=$counter\" >$counter</a></li>";
}
}
elseif($lastpage > 5 + ($adjacents * 2))
{
if($page < 1 + ($adjacents * 2))
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
{
if ($counter == $page)
$pagination.= "<li><a class=\"current\">$counter</a></li>";
else
$pagination.= "<li><a href=\"{$url}page=$counter\" >$counter</a></li>";
}
$pagination.= "<li class=\"dot\">... </li>";
$pagination.= "<li><a href=\"{$url}page=$lpm1\" >$lpm1</a></li>";
$pagination.= "<li><a href=\"{$url}page=$lastpage\" >$lastpage</a></li>";
}
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination.= "<li><a href=\"{$url}page=1\" >1</a></li>";
$pagination.= "<li><a href=\"{$url}page=2\" >2</a></li>";
$pagination.= "<li class=\"dot\">...</li>";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page)
$pagination.= "<li><a class=\"current\">$counter</a></li>";
else
$pagination.= "<li><a href=\"{$url}page=$counter\" >$counter</a></li>";
}
$pagination.= "<li class=\"dot\">..</li>";
$pagination.= "<li><a href=\"{$url}page=$lpm1\" >$lpm1</a></li>";
$pagination.= "<li><a href=\"{$url}page=$lastpage\" >$lastpage</a></li>";
}
else
{
$pagination.= "<li><a href=\"{$url}page=1\" >1</a></li>";
$pagination.= "<li><a href=\"{$url}page=2\" >2</a></li>";
$pagination.= "<li class=\"dot\">..</li>";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination.= "<li><a class=\"current\">$counter</a></li>";
else
$pagination.= "<li><a href=\"{$url}page=$counter\" >$counter</a></li>";
}
}
}
if ($page < $counter - 1){
$pagination.= "<li><a href=\"{$url}page=$next\">Next</a></li>";
$pagination.= "<li><a href=\"{$url}page=$lastpage\" >Last</a></li>";
}else{
$pagination.= "<li><a class=\"inactive\">Next</a></li>";
$pagination.= "<li><a class=\"inactive\">Last</a></li>";
}
$pagination.= "</ul>\n";
}
return $pagination;
}
?>
here is my checkboxes
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="criteria">
<ul>
<li class="head">
<input type="checkbox" name="allmuscle[1]" class="remember_cb" id="allMuscles" value="selectedMuscles" >All Muscle Groups<br /></li>
<li><input type="checkbox" name="muscle[2]" class="remember_cb" id="abdominals" value="abdominals"/>Abdominals<br /></li>
<li><input type="checkbox" name="muscle[3]" class="remember_cb" id="biceps" value="biceps"/>Biceps<br /></li>
<li><input type="checkbox" name="muscle[4]" class="remember_cb" id="calves" value="calves"/>Calves<br /></li>
<li><input type="checkbox" name="muscle[5]" class="remember_cb" id="chest" value="chest" />Chest<br /></li>
<li><input type="checkbox" name="muscle[6]" class="remember_cb" id="forearms" value="forearms"/>Foreamrs<br /></li>
<li><input type="checkbox" name="muscle[7]" class="remember_cb" id="glutes" value="glutes"/>Glutes<br /></li>
<li><input type="checkbox" name="muscle[8]" class="remember_cb" id="hamstrings" value="hamstrings"/>Hamstrings<br /></li>
<li><input type="checkbox" name="muscle[9]" class="remember_cb" id="lats" value="lats"/>Lats<br /></li>
<li><input type="checkbox" name="muscle[10]" class="remember_cb" id="lower-back" value="lower-back"/>Lower Back<br /></li>
<li><input type="checkbox" name="muscle[11]" class="remember_cb" id="middle-back" value="middle-back" />Middle Back<br /></li>
<li><input type="checkbox" name="muscle[12]" class="remember_cb" id="neck" value="neck"/>Neck<br /></li>
<li><input type="checkbox" name="muscle[13]" class="remember_cb" id="quadriceps" value="quadriceps" />Quadriceps<br /></li>
<li><input type="checkbox" name="muscle[14]" class="remember_cb" id="shoulders" value="shoulders" />Shoulders<br /></li>
<li><input type="checkbox" name="muscle[15]" class="remember_cb" id="traps" value="traps" />Traps<br /></li>
<li><input type="checkbox" name="muscle[16]" class="remember_cb" id="triceps" value="triceps"/>Triceps<br /></li>
</ul>
<br /><p><strong>EQUIPMENT</strong></p>
<ul>
<li class="head"><input type="checkbox" name="allequip[]" class="remember_cb" id="allEquipment" value="selectedEquipment" >All Equipment<br /></li>
<li><input type="checkbox" name="equipment[1]" class="remember_cb" id="equipment" value="bands"/>Bands<br /></li>
<li><input type="checkbox" name="equipment[2]" class="remember_cb" id="equipment" value="barbell" />Barbell<br /></li>
<li><input type="checkbox" name="equipment[3]" class="remember_cb" id="equipment" value="body-only" />Body Only<br /></li>
<li><input type="checkbox" name="equipment[4]" class="remember_cb" id="equipment" value="cable" />Cable<br /></li>
<li><input type="checkbox" name="equipment[5]" class="remember_cb" id="equipment" value="dumbbell" />Dumbbell<br /></li>
<li><input type="checkbox" name="equipment[6]" class="remember_cb" id="equipment" value="ez-curl-bar"/>EZ Curl Bar<br /></li>
<li><input type="checkbox" name="equipment[7]" class="remember_cb" id="equipment" value="exercise-ball"/>Exercise Ball<br /></li>
<li><input type="checkbox" name="equipment[8]" class="remember_cb" id="equipment" value="foam-roll" />Foam Roll<br /></li>
<li><input type="checkbox" name="equipment[9]" class="remember_cb" id="equipment" value="kettlebell" />Kettlebell<br /></li>
<li><input type="checkbox" name="equipment[10]" class="remember_cb" id="equipment" value="machine" />Machine<br /></li>
<li><input type="checkbox" name="equipment[11]" class="remember_cb" id="equipment" value="medicine-ball"/>Medicine Ball<br /></li>
<li><input type="checkbox" name="equipment[12]" class="remember_cb" id="equipment" value="none" />None<br /></li>
<li><input type="checkbox" name="equipment[13]" class="remember_cb" id="equipment" value="other" />Other<br /></li>
The script all works fine my only problem is that once the checkboxes are checked the results are returned but only stay on the first page as soon as you click next or page 2 the results or query are lost.
回答1:
For sessions, just store the search parameters to $_SESSION
array. Don't forget to overwrite the stored parameters when the request comes from the initial search form.
$_SESSION['muscle'] = ...
Another way without using user session would be to re-post the search parameters in your results list. You could put them in a hidden form element or add manually to the URL of the page forward/backward link:
"<form action=\"...\" id=\"page_prev\">".
"<input type=\"hidden\" name=\"muscle\" value=\"$_POST['muscle']\" .
"<input type=\"hidden\" name=\"page\" value=\"$prev\";
or
"<a href=\"{$url}page=$prev&muscle=$_POST['muscle']\"
For the form variant you also need some JS code to submit the form as a link to click on:
<a href="#" onclick="document.getElementById('page_prev').submit()">Prev</a>;
回答2:
Since you want to do it using session .. here is the way you can do it
//Your first part of the code
<?php
session_start(); // this should be in the beginning of your page
//get the function
include ($_SERVER['DOCUMENT_ROOT'] .'/scripts/function1.php');
.
.. //code in between
...
if(isset($_POST['muscle'])) {
// Runs mysql_real_escape_string() on every value encountered.
$clean_muscle = array_map('mysql_real_escape_string', $_REQUEST['muscle']);
//since you had a post request you can save it in session now
// you can either save it as an array or string depending on what exactly you want to do with it.
// if you want to do more complex work like db quering save ie in array like this
foreach($clean_muscle as $cm){
$_SESSION["muscle"][] = $cm;
}
// or if you just want to display the clean_muscle string do it this way after your implode
$muscle = implode("','", $clean_muscle);
$_SESSION["muscle"] = $muscle;
now whenever a page is loaded you just have to check if the session is set
//check if session is set
if(isset($_SESSION["muscle"]) && !empty($_SESSION["muscle"])){
// do whatever you want to do with your variable
}
Use the same process for your equipment. Personally this whole code can be written in much better way.. but its your choice and your code.. Hope this helps.
Dins
来源:https://stackoverflow.com/questions/16126001/how-to-maintain-checkbox-query-through-pagination