Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Куда-нибудь сохранить значения checkbox
 
 автор: new_user   (17.09.2008 в 13:43)   письмо автору
 
 

Здравствуйте уважаемые форумчане.

Существует многостроничный раздел сайта, на каждой странице которого находится
определённое количество записей с checkbox.
После нажатия кнопки должны показываться все отмеченные записи, независимо от того на
какой странице были поставлены галочки
.

Проблема в том как запоминать отмеченные checkbox, при переходе на
другую страницу. Т.е роблема иммено в способе сохранения значений массива, а не в
отправке формы по ссылке на другую страницу (это и так понятно).

Всё это ослажняется тем, что уже открытые записи (т.е которые были нами помечены
до нажатия на кнопку), должны каждая иметь возможность быть закрыта(ссылка "ЗАКРЫТЬ")
независимо от других.

Дак вот где лучше и правильней сохранять значения массива checkbox. (Куки не наш метод))) )

  Ответить  
 
 автор: sim5   (17.09.2008 в 13:50)   письмо автору
 
   для: new_user   (17.09.2008 в 13:43)
 

А сессия что не годится?

  Ответить  
 
 автор: Trianon   (17.09.2008 в 13:53)   письмо автору
 
   для: new_user   (17.09.2008 в 13:43)
 

передавать информацию об отметках в скрытом поле формы.

  Ответить  
 
 автор: new_user   (17.09.2008 в 14:15)   письмо автору
 
   для: Trianon   (17.09.2008 в 13:53)
 

Т.е отметили , кликнули по ссылке на другую страницу, отправив этим форму, першли на другую страницу, присвоили скрытому полю значение из адресной строки, снова перешли и прибавили к старому значению скрытого поля новый url и т.д. ?

  Ответить  
 
 автор: Trianon   (17.09.2008 в 14:35)   письмо автору
 
   для: new_user   (17.09.2008 в 14:15)
 

>Т.е отметили , кликнули по ссылке на другую страницу, отправив этим форму, першли на другую страницу, присвоили скрытому полю значение из адресной строки, снова перешли и прибавили к старому значению скрытого поля новый url и т.д. ?

В том, что Вы написали я не понял ни слова.
реализация может быть произвольной.
Суть же в том, что в форме, помимо чекбоксов этой страницы, присутствует скрытое поле (поля) , передающее информацию об элементах на других страницах.

  Ответить  
 
 автор: sim5   (17.09.2008 в 14:45)   письмо автору
 
   для: new_user   (17.09.2008 в 14:15)
 

Чет не понятно. А зачем вам на другой странице данные о чекбоксах предыдущей страницы? Вы ведь на этой странице не разотметите все равно чекбоксов с предыдущей.

  Ответить  
 
 автор: Valick   (17.09.2008 в 15:07)   письмо автору
 
   для: new_user   (17.09.2008 в 13:43)
 

а не в отправке формы по ссылке на другую страницу (это и так понятно)
Значения полей формы отправляются скрипту обработчику, у уж сформирует он страницу или нет
это уже совсем другая история.

Дак вот где лучше и правильней сохранять значения массива checkbox. (Куки не наш метод))) )
На сервере. И если вас (как и меня в данном случае) не устраивает сессия, то используйте файлы (если это какой-нибуть конфигурационный файл) или базу данных (я выбираю БД)

2 sim5 не поверите я горячё люблю и обажаю сессии, но это опять не тот случай... так уж вышло)))

  Ответить  
 
 автор: sim5   (17.09.2008 в 15:09)   письмо автору
 
   для: Valick   (17.09.2008 в 15:07)
 

Вы сперва спросите у автора - ему это постоянно надо, или на время сессии, а потом уж в любви объясняйтесь. )

  Ответить  
 
 автор: new_user   (17.09.2008 в 16:07)   письмо автору
 
   для: sim5   (17.09.2008 в 15:09)
 

>Чет не понятно. А зачем вам на другой странице данные о чекбоксах предыдущей страницы? Вы ведь на этой странице не разотметите все равно чекбоксов с предыдущей.

Мне не нужно их разотмечать, мне нужны id тех записей которые были отмечены.
т.е. при нажатии на кнопку "показать" должны выводиться только те записи которые были помечены независимо от того на какой странице эта гадость произашла).

ИМХО: работать с GET проще чем с переменной сесии и куками, учитывая то, что уже показанные записи(которые у нас вывились после нажатия на кнопку "показать") должны иметь возможность быть закрытыми по одной.

  Ответить  
 
 автор: sim5   (17.09.2008 в 19:28)   письмо автору
 
   для: new_user   (17.09.2008 в 16:07)
 

Зачем вам в строку собирать эти значения? Если вы будете при преходах со страницы на страницу "прикручивать" этот выбор с каждой страницы, думаю, вы понимаете какой длины портянка к вашему url будет "пришита"?
Вы говорите словами общими, а не конкретными, те есть что и как у вас, потому и я вам говору в общем.
1. Можно держать в сессии массив выбранных чекбоксов, имя которого равно имени страницы (или ее id).
2. Можно хранить переменную по имени страницы или ее id, которая будет содержать маску указывающую на состояния чекбоксов.
Нужно вам узнать, что творилось на странице, получаете массив/переменную этой страницы из сессии и... чего вам хочется.

  Ответить  
 
 автор: new_user   (17.09.2008 в 16:11)   письмо автору
 
   для: Valick   (17.09.2008 в 15:07)
 

To Valick.
Ради такой мелочи использовать БД не хочется - должны быть менее затратные способы.
Но это ИМХО.

  Ответить  
 
 автор: Valick   (17.09.2008 в 20:12)   письмо автору
 
   для: new_user   (17.09.2008 в 16:11)
 

должны быть менее затратные способы
А гонять туда сюда ненужные данные не накладно? Но если уж так хочется сериализуйте и передавайте как сказал Трианон, скрытым полем, ну уж ни как не засовывайте их в URL

  Ответить  
 
 автор: sim5   (17.09.2008 в 20:39)   письмо автору
 
   для: Valick   (17.09.2008 в 20:12)
 

Их даже скрытым полем передавать не надо. А сессия будет работать быстрее, чем обращения к базе. Да и вообще, если бы речь шла о сохранении и для каждого авторизованного юзера, тогда еще можно вести разговор о сохранении в базе, иначе как вы себе представляете такое сохранение? Если для всех одно значение в таблице, то значит уровнять всех пользователей, хочет кто-то или не хочет...

  Ответить  
 
 автор: Trianon   (18.09.2008 в 00:17)   письмо автору
 
   для: sim5   (17.09.2008 в 20:39)
 

>Их даже скрытым полем передавать не надо. А сессия будет работать быстрее, чем обращения к базе.

Собственно, я посоветовал (и в общем-то настаиваю на) передавать данные скрытым полем, из тех соображений, что сервер один, а пользователей много. И если есть возможность малой кровью освободить сервер от нагрузки, которую вполне может взять на себя клиент - это нужно сделать. В данном случае совершенно непонятно, зачем серверу хранить что-то между обращениями.
И даже более того. Если я открою подобную страницу сразу в двух окнах - я буду ожидать, что наборы элементов для этих окон будут обрабатываться независимо. С сессиями такой номер либо совсем не пройдет, либо потребует изрядных извращений.

  Ответить  
 
 автор: sim5   (18.09.2008 в 08:25)   письмо автору
 
   для: Trianon   (18.09.2008 в 00:17)
 

Trianon, а зачем передавать скрытым полем, если нам надо перенести эти данные только временно - от одной страницы к другой? А далее их в любом случае надо где-то сохранить. Ведь в конечном итоге, никак не хорошо будет, если накапливать их в скрытых полях. Почему вы считаете что не пойдет сессиях? Давайте рассуждать. Первое, не известно как отдаются эти состояния - либо после их выбора отправляем форму, либо пользователь может отметить чекбоксы и уйти на другую страницу. А также не известно, каким образом осуществляется адресация страниц. К тому же, если запоминать состояния нужно не только при переходе от странице к странице, а нужен сквозной перенос через любое число страниц, то сколько же накопится скрытых полей? Да и нужно будет учитывать, чтобы не появились дубликаты таких полей.
Не понятно, что имеет ввиду автор под "Скрыть", если это на стороне клиента, то опускаем это и относим к другой задаче. Остальное я бы сделал так, предполагая, что отправки формы при выборе чекбоксов не предполагается, и они служат только как информация о выборе того или иного на странице. К примеру, страницы выводятся по id. Тогда:

<script>
//функция получения состояний чекбоксов на странице
//и передачи маски их состояния в url запрос
function setCheck(n) {
  var lnk = document.getElementById("chk").href;
  if (lnk.indexOf("bit") < 0) {
    lnk += "&bit=" + Math.pow(2,n-1);
    document.getElementById("chk").href = lnk;
  } else {
    var bt = lnk.substr(lnk.lastIndexOf("=")+1);
    bt ^= Math.pow(2,n-1);
    document.getElementById("chk").href = lnk.slice(0, lnk.lastIndexOf("=")+1)+bt;
  } 
}
</script>
<input type="checkbox" name="as[]" value="1" onclick="setCheck(this.value)"><br>
<input type="checkbox" name="as[]" value="2" onclick="setCheck(this.value)"><br>
<input type="checkbox" name="as[]" value="3" onclick="setCheck(this.value)">
<a id="chk" href="untitled1.html?pid=1">Page 1</a>

В этом случае мы всегда будем передавать с каждой страницы маску состояний чекбоксов. На сервере, на любой запрашиваемой странице, пишем:
<?
session_start
();
if (!isset(
$_SESSIN['check'])) $_SESSIN['check'] = array();
if (isset(
$_GET['bit'])) $_SESSIN['check'][$_GET['pid']] = $_GET['bit'];

Тогда мы будем иметь массив с ключами id страниц и со значениями состояния чекбоксов на этих страницах. Ну а далее уже что хочется. Достаточно, зная id запрашиваемой страницы, число необходимых чекбоксов на ней, при выводе этих чекбоксов, проверять в массиве $_SESSIN['check'] наличие индекса и отметить (как выбранные) чекбоксы, которые установленны, согласно маске. Ну может еще и скрыть описания не выбранных чекбоксов и т.п..
Чем этот вариант плох и как сильно он будет загружать червер?

  Ответить  
 
 автор: new_user   (18.09.2008 в 09:37)   письмо автору
 
   для: sim5   (18.09.2008 в 08:25)
 

Зачем накапливать скрытые поля - вроде достаточно одного?
Такой вариант (грубый)

<?php 
if ( !empty($_GET['box']) ) {
    
        foreach(
$_GET['box'] as $index=>$val) {
            
$_box.= $index.',';
        }
        
        
$_box substr$_box0strlen($_box)-);// отрезаем последнюю запятую
        
        
if ( $_GET['url']!=='' ) {
            
$_box $_GET['url'].','.$_box// если скрытое поле не пустое прибавляем к существующим новые значения
        
}
        if (isset( 
$_GET['button']) ) {// если нажата кнопка делаем запрос к БД
            
@mysql_query("SELECT * FROM table WHERE id IN(".$_GET['url'].")");//далее в php блоке обработка результата из БД.
        
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Untitled Document</title>
</head>

<body>

текущяя стр. <?php echo $_GET['page']?>

<form id="form1" name="form1" method="get" action="">
  <label>
  <input type="checkbox" name="box[1]" value="1" />
  <br />
  </label>
  <label>
  <input type="checkbox" name="box[2]" value="2"  />
  <br />
  </label>
  <label>
  <input type="checkbox" name="box[3]" value="3"  />
  </label>
  <p><br />
    <br />
    <input type="text" name="page" id="_page" /><!--в этом поле хранится номер страницы (поле должно быть скрытым)-->
    <br />
    <br />
    <input type="text" name="url" id="_url" value="<?php echo $_box?>" /><!--здесь хранятся ранее отмеченные checkbox (поле должно быть скрытым)-->
</p>

  <p>
    <input type="submit" name="button" id="button" value="Submit" />
</p>
  <p>pages 
    <a href="#"  onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a> | 
    <a href="#"  onclick="document.getElementById('_page').value='2';document.forms['form1'].submit();">2</a> | 
    <a href="#"  onclick="document.getElementById('_page').value='3';document.forms['form1'].submit();">3</a>
  </p>
</form>
</body>
</html>

  Ответить  
 
 автор: sim5   (18.09.2008 в 09:41)   письмо автору
 
   для: new_user   (18.09.2008 в 09:37)
 

Так если вам нужно получить эти состояния на другой странице, и после этого успешно забыть их, тогда хватит и одного. Но тогда вообще нафик ничего не надо никаких скрытых полей, вообще ничего, если разобраться. А вот это зачем?:
<a href="#" onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a>

  Ответить  
 
 автор: new_user   (18.09.2008 в 10:05)   письмо автору
 
   для: sim5   (18.09.2008 в 09:41)
 

Мне их нужно помнить до нажатия на кнопку (извините если раньше непонятно написал).

>А вот это зачем?:
<a href="#" onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a>
При переходе на другую страницу, что бы узнать отмеченные чекбоксы мне надо отправить форму(document.forms['form1'].submit;) и при этом не забыть на какую стр. я хочю попасть(document.getElementById('_page').value='1';).

>Но тогда вообще нафик ничего не надо никаких скрытых полей, вообще ничего, если разобраться.
Это как? Объясните пожалуста.

  Ответить  
 
 автор: sim5   (18.09.2008 в 10:12)   письмо автору
 
   для: new_user   (18.09.2008 в 10:05)
 

Не городите ерунды! Зачем тогда вам чекбоксы, коли вы управляете значениями с помощью ссылок? При каждом клике вы отправляете форму, а значит можно выбрать только один чекбокс! А вам нужна возможность выбора нескольких, не так-ли? И именно проблема этого вас волнует, которую вы неверно назвали в теме своей "сохранением"? Вы либо неверно формулируете свой вопрос, либо не можете объянить чего вам надо. Поэтому, по крайней мере для меня, то что вы делаете сейчас, это полный бред.

  Ответить  
 
 автор: new_user   (18.09.2008 в 10:52)   письмо автору
 
   для: sim5   (18.09.2008 в 10:12)
 

Вы код смотрели, мы в переменной $_GET['url'], после нажатия на "красную кнопку" имеем значения всех чекбоксов(), отмеченных на всех из трёх страниц.

Если это бред, скажите как лучше (после того как всё стало понятно).

ЗЫ. А вопросы я действительно формулирую не очень. Извините.

  Ответить  
 
 автор: sim5   (18.09.2008 в 11:22)   письмо автору
 
   для: new_user   (18.09.2008 в 10:52)
 

Я к тому, что вы имеете три ссылки (кстати их всего и будет 3?), по этой ссылке вы что-то получаете в базе. Из переданных чекбоксов вы чего-то там получаете и все. Что они у вас делают эти значения? Чему у вас служат эти чекбоксы, если они не ничего не выполняют, и тем неменее вы хотите гонять их между страницами?
Вы напишите подробно суть того, чего в конечном итоге вы хотите, для чего эти чекбоксы, почему их значения надо сохранять? Как сохранять, чтобы можно было получить их значения на любой произвольной странице? И т.д..

  Ответить  
 
 автор: new_user   (18.09.2008 в 12:23)   письмо автору
 
   для: sim5   (18.09.2008 в 11:22)
 

Будет результат поиска по 11 параметрам (все передаются по GET), выводимый постранично (число выводимых записей на одной странице задаётся юзером и сохраняется в кук, страниц конечно будет не 3), напротив каждой записи есть чекбокс, value которого соответствует айдишнику этой записи(записи ессно берутся из БД).

Юзер отмечает нужное, переходит на другую страницу, там тоже отмечает и т.д., но поняв что уже пора остановится, нажимает "красную кнопку", условно названную "показать все, что Вы наотмечали на этой и предыдущих страницах".

Мне нужны id отмеченных записей(на любой странице), что бы вставить их SQL- запрос.

для Trianon

>А при чем здесь php?!

Если Вы имели ввиду JS то:
1. PHP привычней,
2. На JS переносить данные от одной странице к другой я могу только куками или опять же через URL(наверно).

  Ответить  
 
 автор: sim5   (18.09.2008 в 13:06)   письмо автору
 
   для: new_user   (18.09.2008 в 12:23)
 

>но поняв что уже пора остановится, нажимает "красную кнопку"

Аргумент конечно железный :) А если не поймет, тогда что?
Трудно представить что надо искать, толи в этих записях, но что? Толи сами записи, а не много ли? Может быть сделать поиск как: на сайте, в разделе, на странице...? Вы уж как-то оганичьте запрос на поиск, хотя, повторяю, непонятно чего вам искать. Но коли вам нужны id записей, то лучше их хранить все таки в сесии, так как у вас нет гарантии того, что юзер вернется со страницы Z на страницу К и не разотметит какой либо ранее выбранный чекбокс. В этом случае, как вы собираетесь перебирать вашу запись в скрытом тексте, чтобы удалить id разотмеченного чекбокса? Вам в любом случае потребуется для этого JS. К тому же, при любых возвратах, пользователь должен видеть ранее выбранное им, иметь возможность что-то удалить из выброа, что-то добавить... И как вам тут поможет скрытое поле? Не майтесь вы, сессия хороший инструмент для этого, а вот хранить где-то id страницы не надо, зачем это?

  Ответить  
 
 автор: new_user   (18.09.2008 в 13:58)   письмо автору
 
   для: sim5   (18.09.2008 в 13:06)
 

>К тому же, при любых возвратах, пользователь должен видеть ранее выбранное им, иметь возможность что-то удалить из выброа, что-то добавить...

Перебъется))). А так да логично.Спасибо

После всех перипитий интересно мнение Trianonаа.

  Ответить  
 
 автор: sim5   (18.09.2008 в 14:20)   письмо автору
 
   для: new_user   (18.09.2008 в 13:58)
 

Нельзя так, если вы уж хотите дать свободу выбора пользователю, то что это за свобода? Вас просто материть будут нещадно.

  Ответить  
 
 автор: Trianon   (18.09.2008 в 10:16)   письмо автору
 
   для: new_user   (18.09.2008 в 10:05)
 

А при чем здесь php?!

  Ответить  
 
 автор: Trianon   (18.09.2008 в 10:01)   письмо автору
 
   для: sim5   (18.09.2008 в 08:25)
 

>Trianon, а зачем передавать скрытым полем, если нам надо перенести эти данные только временно - от одной страницы к другой?

Так ведь не факт, что этот переход произойдет.
Таким образом я на клиентской стороне накапливаю аргументы запроса.
Когда Пользователь нажмет окончательную "красную кнопку" - запрос будет отдан на исполнение.
Вот тогда и придется чего-то сохранять, удалять, перекладывать из таблицы в таблицу и т.п.
А до тех пор, сервер считает, что его и не трогали.



>А далее их в любом случае надо где-то сохранить. Ведь в конечном итоге, никак не хорошо будет, если накапливать их в скрытых полях.

Я как раз считаю, что там им самое место. Необязательно - в скрытых, но обязательно - в аргументах запроса.

>Почему вы считаете что не пойдет сессиях?

Да не считаю я, что не пойдет.
Я считаю, что не нужно, если можно избежать.

  Ответить  
 
 автор: sim5   (18.09.2008 в 10:06)   письмо автору
 
   для: Trianon   (18.09.2008 в 10:01)
 

Ну теперь это уже чисто риторически, коли автор "высказался наконец-то" :) А после высказывания, стало понятно, что вообще к чему все это, если при каждом выборе он отправляет форму. О каком сохранении каких-то состояний может идти речь, если при таком способе будет отправлено только одно тукущее изменение? Нафига тогда все нужно, хотелось бы спросить автора? :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования