【问题标题】:prev|next with array and sessionprev|next 与数组和会话
【发布时间】:2011-07-29 03:09:37
【问题描述】:

我希望解决以下问题:

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

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

我所取得的成就:

  1. 我将 user_view.php?prev=1 用于prev 链接,将 user_view.php?next=1 用于next 链接。
  2. 我正在查看 user_view.php 页面顶部是否设置了 $_GET['prev'] 或 $_GET['next']。

在 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 值。

你们能帮帮我吗?

【问题讨论】:

    标签: php arrays session


    【解决方案1】:

    到一般分页:

    通常,在分页时,有两件事以不同的方式完成。首先,不是告诉服务器“下一步”或“返回”,而是告诉服务器去某个索引。这有两个目的。首先,它的逻辑更简单,更容易测试——is it going to the right index? Then it works.。其次,它可以让用户在分页中为他们当前的位置添加书签。

    接下来,大多数时候,除非有充分的理由(例如,查询每次运行都需要半分钟),否则页面通常会根据使用数据库中的 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&amp;page=2。我认为很聪明,但我从来没有想要骄傲......

    【讨论】:

    • 感谢您的意见。你真的很有帮助。键()怎么样。这会在我目前的方法中取得任何进展吗?
    • 无论您需要向会话添加一些额外数据以使其正常工作。 PHP 的原生数组函数都无法管理这个。
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多