(PHP) Как передавать массив от страницы к странице?

Ledokol
Дата: 30.10.2006 17:07:30
Народ, помогите!
Пока не очень силен в PHP и HTML поэтому вопрос может показаться для ассов глупым. Но не сочтите за трудность помогите раобраться.

Задча в следующем:
На 1 странице имеется форма
<form action="search_result.php" method = "get">
         <select size=4 name="Number[]" multiple>
                <option value="1">один</option>
                <option value="2">два</option>
                <option value="3">три</option>
                <option value="4">четыре</option>
         </select>
        <input type="hidden" name="p" value="0">
        <input type="hidden" name="n" value="30">
        <INPUT type="SUBMIT" value="ИСКАТЬ">
    </form>

в этой форме выбираются несколько значений (может быть корректнее использовать checkbox?)

В файле search_result.php идет обработка переменных: Number[], p и n
для выборки данных из базы.

Проблема в том, что данных много и я хочу разбить их для вывода постранично.
С помощью метода "Get" переменные p и n g передаю без проблем, а вот с массивом Number[] никак не совладаю.

Опишите пожалуйста технологию передачи массива в адресной строке.
Перепробовал все и serialize и session_start ..., но явно чего-то не допонимаю.
*
Дата: 30.10.2006 20:52:21
Ledokol
Перепробовал все и serialize и session_start ..., но явно чего-то не допонимаю.
Как пробовали?
http://phpfaq.ru/session
Ledokol
Дата: 31.10.2006 04:08:38
В файле search_result.php делаю следующее:

if(!session_is_registered("newRegion"))
{
     session_start();
     session_register("newRegion");
     $newRegion = $Region;
}
echo "<p>".print_r($newRegion)."</p>";

echo "<a href=?&p=".$p."&n=".$n.">след. станица</a>";

Но при переходе по ссылке массив в сессии уже не сохраняется.
*
Дата: 31.10.2006 07:23:30
Ledokol
В файле search_result.php делаю следующее:

if(!session_is_registered("newRegion"))
{
     session_start();
     session_register("newRegion");
     $newRegion = $Region;
}
echo "<p>".print_r($newRegion)."</p>";

echo "<a href=?&p=".$p."&n=".$n.">след. станица</a>";

Но при переходе по ссылке массив в сессии уже не сохраняется.
Во-первых, с сессиями так не работают. Как работают с сессиями - написано по сссылке выше, во-вторых - там же описаны наиболее частые проблемы, возникающие с сессиями, в-третьих - SID передаётся на следующую страницу? На следующей странице Вы стартуете сессию? Не надо кидаться огрызками кода (хотя простынями кода тоже кидаться ненадо), давать надо минимальный код, достаточный для видения картины.
http://phpfaq.ru/debug
http://phpfaq.ru/na_tanke#headers
*
Дата: 31.10.2006 09:25:37
*
Не надо кидаться огрызками кода (хотя простынями кода тоже кидаться ненадо), давать надо минимальный код, достаточный для видения картины.
Пардон, тут я несколько погорячился.
Ledokol
Дата: 01.11.2006 03:15:17
Вот, вроде разобрался.
Приведу здесь пример станички для интересующей меня задачи:

Файл search.php
    <form action="search_result.php" method = "post">
               <select size=5 name="frmNumber[]" multiple>
                     <option value="1">Один</option>
                     <option value="2">Два</option>
                     <option value="3">Три</option>
                     <option value="4">Четыре</option>
                     <option value="5">Пять</option>
               </select>
        <input type="hidden" name="New_Search" value="1">
        <input type="hidden" name="frmPage" value="1">
        <input type="hidden" name="frmNum" value="1">
        
        <INPUT type=\"submit\" value=\"ВЫПОЛНИТЬ\">
    </form>
здесь переменные
frmNumber - массив значений;
New_Search - указывает на начало нового поиска;
frmPage - стартовая страница;
frmNum - кол-во данных на страницу

(некоторые переменные не используются в дальнейшем, так как я сократил пример, но за-то смысл будет более понятен (надеюсь))

Файл search_result.php

<?php
session_start();
if($New_Search=='1')
{
   session_unset();
   session_start();
}
?>
<html>

<head>
  <title></title>
</head>

<body>
<?
     if(!isset($_SESSION['Number']))
     {
             echo "<br>Заводим новую сессию.<br>";
             $_SESSION['Number']  = $Number;
             $_SESSION['p']         = $frmPage;
             $_SESSION['n']         = $frmNum;
     }
     else
     {
             echo "<br>Изменяем старую сессию.<br>";
             $_SESSION['p']=$page;
     }

     $Number_str=$_SESSION['Region'][0];
     for ($i=1; $i<count($_SESSION['Region']); $i++)
     {
             $Number_str=$Number_str.",".$_SESSION['Region'][$i];
     }
     echo "<br>Массив значений: ".$Number_str;
     echo "<br>Переменные: ".$_SESSION['p']." : ".$_SESSION['n']."<br>";

     echo "<br><center><a href=?&page=".($p-1)."><Предыдущая </a> | <a href=?&page=".($p+1)."> Следующая></a></center>";
?>
</body>
</html>

конечно, пример далек от совершенста, но если кто видит чем можно улучшть, просьба не критиковать, а предложить более совершенный вариант.
А, то во многих ветках столько флуда относительна неправильного написания и ошибок, что пока разберешься и найдешь что-либо полезное, все волосы можно выдрать ( везде:) ).
*
Дата: 01.11.2006 07:24:09
[quot Ledokol]
<?php
session_start();
if($New_Search=='1')
{
   session_unset();
   session_start();
}
?>
[/quote]1. http://phpfaq.ru/globals. Не $New_Search, а $_POST['New_Search']. Кроме того - включите показ ошибок и впредь всегда пишите скрипты со включенными ошибками.
2. session_unset использовать не надо. Вообще. Как о том и говорит мануал. $_SESSION = array();
3. Зачем стартовать сессию дважды? Это ошибка.
session_start();
if (isset($_POST['New_Search'])) $_SESSION = array();

Далее. Хранить страницу в сессии - неправильно в принципе. Если Вы делаете поиск - то разумнее передавать их в URI, при чём запрос должен быть не POST, а GET - посмотрите, как это делает google или любая другая поисковая система и делайте аналогично.
*
Дата: 01.11.2006 07:34:36
*
Хранить страницу в сессии - неправильно в принципе.
Номер страницы, конечно же.
Если Вы делаете поиск - то разумнее передавать их в URI
Имеются в виду параметры поиска, такие как $_GET['page'], к примеру.

И пишите под register_globals off, а то у Вас половина скрипта написана под off, половина - под on.
Ledokol
Дата: 01.11.2006 18:54:37
Спасибо за замечания. Очень помогает.
С первыми тремя полностью согласен, сделал исправления.

Что касается хранения и передачи всех переменных для скрипта методом GET, то в этом-то и была первоначальная загвоздка.
Моя форма формирует 19 элементов, которые хранятся в массиве. Его я и не могу передать методом GET (еще чего-то не дочитал).
Поэтому пришлось страртовать сессию и хранить этот массив в ней.

Я понимаю, что если кто-то сделает закладку на страницу, то потом не сможет вернуться к ней.
Передать массив получается, только если развернуть его в строку и передавать уже ее через URL, но подумал, что это не совсем корректно и вот... 'изобрел'.
*
Дата: 01.11.2006 22:33:48
Ledokol
Моя форма формирует 19 элементов, которые хранятся в массиве.
Если это не превышает допустимую длину URI (не помню значения, к сожалению), то массив можно передавать точно так же, как и любую другую переменную - ?arr[]=1&arr[2]=2&arr[asd]=3. Может быть удобно применение функции output_add_rewrite_var, правда это так же следует делать с умом, дабы не цеплять хвост ко всем ссылкам подряд.
Передать массив получается, только если развернуть его в строку и передавать уже ее через URL, но подумал, что это не совсем корректно и вот... 'изобрел'.
Честно говоря, не понял, что Вы имеете в виду, но возможно то, что я только-что озвучил.