prev | next с массивом и сессией - PullRequest
0 голосов
/ 29 июля 2011

Я хочу решить следующую проблему:

  1. На странице results.php отображается список пользователей (результаты запроса sql).На этой странице также хранятся все user_id в массиве $ _SESSION ['user_ids'].И когда я нажимаю, чтобы просмотреть подробную информацию о пользователе, user_view.php показывает подробную информацию об этом пользователе.

  2. Я хочу, чтобы информация о пользователе была изменена на странице user_view.php, когда я нажимаю на(предыдущая | следующая) ссылки.

Чего я достиг:

  1. Я использую user_view.php? prev = 1 дляprev link и user_view.php? Next = 1 для next link.
  2. Я проверяю в верхней части страницы user_view.php, чтобы узнать, $ _GET ['prev'] или $ _GET ['next '].

на странице результатов. установлены следующие переменные

$_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 не имеет никакого значения.

То, что я хочу: Измените значение $ id_view, когда я нажму на предыдущие | следующие ссылки и покажу детали на этой странице.

Можете ли вы, ребята, помочь мне ??

1 Ответ

3 голосов
/ 29 июля 2011

к нумерации страниц в целом:

Обычно при разбиении на страницы две вещи выполняются по-разному. Во-первых, вместо того, чтобы указывать серверу «идти дальше» или «назад», серверу предлагается перейти к определенному индексу. Это серверы двух целей. Во-первых, это более простая логика и проще для тестирования - 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
); 

Ваш вопрос конкретно:

next и prev не хранятся в сериализованном массиве, и именно так массивы хранятся в $ _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

Вместо next и prev вы можете рассмотреть:

$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, и я хотел избежать этого. Поэтому я сериализовал объект данных, сохранил его в базе данных и сохранил параллельную версию в сеансе индивидуума. Если сеанс существовал, разбиение на страницы работало как ниже. Если сеанс не существует, объект данных десериализуется и сохраняется в сеансе. Результат? Мне удалось сохранить 15 чрезвычайно длинных параметров, хранящихся только с search_id=1, что позволило получить параметры search_id=1&page=2. Я думал, что это умно, но я никогда не хотел за гордость ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...