【问题标题】:Passing $_GET (or $_POST) Variables With Pagination (SESSION not working)使用分页传递 $_GET(或 $_POST)变量(SESSION 不工作)
【发布时间】:2013-08-19 17:13:07
【问题描述】:

我知道这是一个常见问题,因为我在决定发布之前已经搜索了答案,但我似乎无法找到解决方案。

问题:我有一个分页脚本 (PHP) 用于我的搜索结果。显然很常见,第一页结果显示正常,然后在移动到第 2、3 页等时失败。

点击进入第 2、3 页等时,我在搜索中使用的每个变量都出现“未知索引”错误。

所以我从我的表单中 $_GET 这些变量:

$_SESSION['var1']= $_GET['var1'];
$_SESSION['var2']= $_GET['var2'];
$_SESSION['var3']= $_GET['var3'];

注意事项: 我的标题中已经开始了一个会话;我使用 $_GET 是因为如果用户“返回”,我不希望出现“重新提交”警告;变量都被清理了(只是没有在代码中显示,因为它已经足够长了);我必须在 WHILE 循环中使用 $_GET 变量,因为它们会计算每个结果的距离、年龄等。

我的分页脚本:

$limit = 4; 

$query = "SELECT COUNT(*) as num FROM $tableName";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages['num'];

$stages = 3;
$page = mysql_escape_string(isset($_GET['page'])) ? (int)$_GET['page'] : 1;
if($page) {
  $start = ($page - 1) * $limit; 
} else {
  $start = 0;   
}   

// Get page data
$query1 = "SELECT * FROM $tableName ORDER BY joindate DESC LIMIT $start, $limit";
$result = mysql_query($query1);

// Initial page num setup
if ($page == 0){$page = 1;}
$prev = $page - 1;  
$next = $page + 1;                          
$lastpage = ceil($total_pages/$limit);      
$LastPagem1 = $lastpage - 1;                    

$paginate = '';
if($lastpage > 1) {
$paginate .= "<div class = 'hp1col'><div class='paginate'>";
$pagetotal = $total_pages.' Results';

// Previous
if ($page > 1){
$paginate.= "<a href='$targetpage?page=$prev'>Previous</a>";
} else {
$paginate.= "<span class='disabled'>previous</span>";}

// Pages    
if ($lastpage < 7 + ($stages * 2))  // Not enough pages to breaking it up
{   
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page){
$paginate.= "<span class='current'>$counter</span>";
}else{ $paginate.= "<a href='$targetpage?page=$counter'>$counter</a>";}                 
}
}

// Next
if ($page < $counter - 1){ 
$paginate.= "<a href='$targetpage?page=$next'>Next</a>";
} else {
$paginate.= "<span class='disabled'>Next</span>";
}
$paginate.= "</div></div>";     
}

while($row = mysql_fetch_array($result))
{
if (($part1 >= $_SESSION['var1']) AND  ($part2 <= $_SESSION['var2']) AND ($part3 <= $_SESSION['var3'])) {
echo 
"[Results]  
}
}
echo $paginate;

我尝试在这个 if 语句中开始一个新会话,但没有帮助:

if ($page > 1){
$paginate.= "<a href='$targetpage?page=$prev'>Previous</a>";
} else {
$paginate.= "<span class='disabled'>previous</span>";}

我希望有人可以提供帮助。对于问题中的代码片段,我深表歉意,但我认为最好将所有内容都放入其中,以方便使用,希望有人能够提供帮助。

谢谢

【问题讨论】:

  • 请更清楚地定义问题是什么。 “搜索结果在第二页上不起作用”不是一个众所周知的问题...
  • 抱歉,马上修改。花了这么长时间格式化我忘记的代码我实际上并没有提到错误:)
  • 请注意,LIMIT XXX OFFSET YYY 子句意味着 MySQL 仍然需要计算整个结果集。相反,如果 joindate 已编入索引,请考虑使用 WHERE joindate &lt;= &lt;last join date on prev page&gt; LIMIT XXX
  • KyleWpppd - 谢谢 :) 我会试试的

标签: php pagination


【解决方案1】:

因此,您需要将这些查询参数传递到下一页。如果您的页面希望出现$_GET['var1'],但您的URL 中没有?var1=foo,那么它显然不起作用。处理这个问题的最简单方法是http_build_query:

printf('<a href="%s?%s">Next</a>',
       $targetpage,
       http_build_query(array('page' => 2) + $_GET));

这会保留$_GET 中的所有当前值,并向其中添加page=2 参数。根据您的情况进行修改。

【讨论】:

  • 谢谢你。我应该把它放在哪里?
  • 无论您在何处创建任何指向其他页面的链接。此示例输出 "Next" 链接。不过,这更像是一个例子。了解它的作用,然后应用到您的代码中。
  • deceze - 谢谢,我已经这样使用它了: $nextpage = http_build_query(array("page" => 2) + $_GET);然后在“下一步”链接中使用变量。你能告诉我以前如何使用它吗? =>2 应该适用于所有升序页面,但是降序页面呢?
  • printf 应该多用+1
  • @Dan 你已经在使用你的页码了。将2 替换为任何动态生成的页码。这只是一个例子。
猜你喜欢
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2013-01-17
  • 1970-01-01
  • 2014-12-12
  • 2013-08-05
相关资源
最近更新 更多