上一页|下一页有数组和会话

时间:2011-07-29 03:09:37

标签: php arrays session

我希望解决以下问题:

  1. page results.php显示用户列表(sql查询结果)。此页面还将所有user_id存储到数组$ _SESSION ['user_ids']。当我点击查看用户的详细信息时,user_view.php会显示该用户的详细信息。

  2. 我希望在点击(上一页|下一页)链接时在user_view.php页面中更改用户详细信息。

  3. 我取得的成就:

    1. 我正在使用user_view.php?prev = 1用于prev link和user_view.php?next = 1用于next链接。
    2. 我在user_view.php页面上查看是否设置了$ _GET ['prev']或$ _GET ['next']。
    3. 在results.php页面中设置了以下变量

      $_SESSION['user_ids']=$user_ids; // $user_ids is an array with ids
      $_SESSION['first_value']=reset($user_ids);
      $_SESSION['last_value']=end($user_ids);
      
      正在执行检查后的user_view.php页面中的

      $id_view=$_SESSION['user_id']; // This is to view the first user details and is set after clicking "view" for a user in results.php page
      
      $user_ids=$_SESSION['user_ids']; // array
      if (isset($_GET['prev']))
      {
          if ($_GET['prev'] == "1")
          {
              if (current($_SESSION['user_ids'])==$_SESSION['first_value'])
              {
                  $id_view = $_SESSION['user_value'];
              }
              else
              {
                  $id_view = prev($_SESSION['user_ids']);
              }
          }
      }
      if (isset($_GET['next']))
      {
          if ($_GET['next'] == "1")
          {
              if (current($_SESSION['user_ids'])==$_SESSION['last_value'])
              {
                  $id_view = $_SESSION['user_value'];
              }
              else
              {
                  $id_view = next($_SESSION['user_ids']);
              }
          }
      }
      
      // GET THE DETAILS OF THE USER WITH ID $id_view
      $result=mysql_query("SELECT * FROM $tbl_name WHERE user_id='$id_view'",$db);
      

      上面的代码根本不起作用...当我点击prev时,数组被清除,$ id_view没有任何值。

      我想要的是什么: 当我点击prev | next链接并在该页面中显示详细信息时,更改$ id_view值。

      你们能帮助我吗?

1 个答案:

答案 0 :(得分:3)

一般的分页:

通常,在分页时,两件事情的做法不同。首先,服务器被告知转到某个索引,而不是告诉服务器“下一步”或“返回”。这有两个目的。首先,它更简单,更容易测试 - is it going to the right index? Then it works.。其次,它允许用户在分页中为当前位置添加书签。

接下来,大多数情况下,除非有充分的理由(例如,每次运行时查询需要半分钟),页面通常会根据使用情况显示DB中的LIMIT(或等效)。它可能会使查询稍微复杂一些,但总体上更简单。

您的查询可能如下所示:

SELECT * FROM $tbl_name WHERE user_id IN (
    SELECT USER_ID FROM SOME_OTHER_TABLE LIMIT $index, 1
); 

具体问题:

nextprev未存储在序列化数组中,这正是数组在刷新之间存储在$ _SESSION中的方式。

// serialization loses index!
$a = array(1,2,3); 
echo next($a);    // 2
echo current($a); // 2
// !! resets the index !!
echo current(unserialize(serialize($a))); // 1

而不是nextprev,您可能需要考虑:

$index = $_SESSION['paginatino_index'];
if (isset($_GET['prev']))
{
    if ($_GET['prev'] == "1")
    {
        $index = ( $index > 1 )? $index - 1: 0;
    }
}
// this will never exist simultaneously with $_GET['prev'] unless the user 
// does something very bad.
elseif (isset($_GET['next']))
{
    if ($_GET['next'] == "1")
    {
        $count = count( $_SESSION['user_ids'] ) - 1;
        $index = ( $index < $count - 1 )? $index + 1: $count;
    }
}

// caution! will not work with associative arrays.
$id_view = $_SESSION['user_ids'][ $index ];

漫长而无聊的故事时间

有一段时间我想保持每个页面都有书签,但这导致了一个非常复杂的URL,我想避免这种情况。所以我序列化了一个数据对象并将其存储在数据库中,并在个人会话中存储了一个并行版本。如果会话存在,分页工作如下。如果会话不存在,则将数据对象反序列化并存储在会话中。结果?我只能使用search_id=1存储十五个极长参数,从而生成参数search_id=1&page=2。我觉得这很聪明,但我从未想要过骄傲......