|
|
|
| подскажите как лучше поступить
есть форма - список ссылок
у каждой строки есть 1 чекбокс для отметки отображения на сайте, то есть чек возвращает либо 1 либо вообще ничего.
если мы отметим нужные ссылки галочкой "активные", то получим соответственно 1, которую запишем в БД, а вот как убрать из БД 1, когда с чеков снята отметка? | |
|
|
|
|
|
|
|
для: iggipop
(28.06.2014 в 15:56)
| | А как хранятся эти ссылки в базе? Если под уникальным id (номером записи), то чекбокс должен иметь в качестве значения не 1 (смысла устанавливать какое либо значение чекбоксу вообще нет, если оно может принимать единственное значение), а id записи.
Обновить при этом значения можно двояко:
1) сбросить в базе значение для всех, а затем установить (1) для тех id, чекбоксы которых получены.
2) запомнить на сервере все id помещенные в форме, а при получении пришедшие установить, а id полученные вычитанием из запомненных пришедших, сбросить. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 16:21)
| |
<input name="el[{$data[data].id}]" type="checkbox"{if $data[data].active == 1} checked{/if}>
<?php
$db->query('SELECT `id` FROM `menu` WHERE `level` = '.$fr.' ORDER BY `groupa` ASC , `pos` ASC');
$a = $db->fetch();
for($i = 0; $i < sizeof($a); $i ++)
{
empty($el[$a[$i][0]]) ? $ac = 0 : $ac = 1;
.......
}
|
вот так сделал. | |
|
|
|
|
|
|
|
для: iggipop
(28.06.2014 в 16:51)
| | Из сути вопроса, а затем того, что вы сделали, я вообще не понимаю чего вы хотите, ибо код к вопросу выше никакого отношения не имеет. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 17:00)
| | как это не имеет?)
<?php
//выбрали id тех записей, что отображены на страницы (в случае постраничной разбивки, например)
$db->query('SELECT `id` FROM `menu` WHERE `level` = '.$fr.' ORDER BY `groupa` ASC , `pos` ASC');
$a = $db->fetch();
//перебрали массив
for($i = 0; $i < sizeof($a); $i ++)
{
empty($el[$a[$i][0]]) ? $ac = 0 : $ac = 1; // checkbox
.....
//обновили БД
$db->query('UPDATE `menu` SET `pos` = '.(int)$ps[$a[$i][0]].', `active` = '.$ac.',
`link` = "'.$db->real_escape($ln[$a[$i][0]]).'" WHERE `id` = '.$a[$i][0]);
}
html
<input name="el[48]" type="checkbox" checked> - активность
<input name="ps[48]" type="text" style="width:50px;" value="0"> - позиция
<input name="ln[48]" type="text" style="width:70px;" value="http://link.com"> - ссылка
|
| |
|
|
|
|
|
|
|
для: iggipop
(28.06.2014 в 17:16)
| | Значит так, если чекбокс служит источником булева значения, то какие empty() могут быть? 0 - сброшен (не выбран), 1 - установлен (выбран). Следовательно, при выводе:
<input name="el[48]" type="checkbox" <?=$chk ? 'checked' : null?>>
|
где $chk значение 0/1 полученное из базы. А
'SELECT `id` FROM `menu` WHERE `level` = '.$fr.'...
темный лес, ибо я вообще не вижу в данной выборке хоть что-то связанное с чекбоксом, а какая-то, извините, хрень, потому как $a = $db->fetch(); это массив id, который к верху "каком" сравнивается с массивом полей формы (надо полагать).
Последнее (обновление, что только сейчас добавлено) это да, к вопросу. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 17:30)
| | давайте еще раз
это массив id - поля присутствующих на текущей странице
то есть я выбрал id которые должны вернуть или не вернуть значения
$db->query('SELECT `id` FROM `menu` WHERE `level` = '.$fr.' ORDER BY `groupa` ASC , `pos` ASC');
$a = $db->fetch();
array{
[0]=>48
[1]=>49
[2]=>50
......
}
|
далее в цикле я сверяю вернулся ли id(чекбокс) со значением
for($i = 0; $i < sizeof($a); $i ++)
{
empty($el[$a[$i][0]]) ? $ac = 0 : $ac = 1;
// это соответствует
empty[$el[48]] ? $ac = 0 : $ac = 1;
empty[$el[49]] ? $ac = 0 : $ac = 1;
empty[$el[50]] ? $ac = 0 : $ac = 1;
и так далее
|
уберу empty выходит избыточно
$el[48] ? $ac = 0 : $ac = 1;
|
вообще empty там был типа для получения false если notset/0 | |
|
|
|
|
|
|
|
для: iggipop
(28.06.2014 в 17:52)
| | Еще раз:
1) вы отдаете форму, а это означает, что вы уже делаете выборку полей представленных формой, так почему их не запомнить сразу?
2) emty для чекбокса, это также глупо как и строку возводить в степень, ибо чебокс либо пришел (выбран), либо нет (не отмечен), а для поиска в массиве тем более.
3) существуют функции пересечения массивов, которыми можно получить то, что я писал выше (вариант 2), и даже более того, можно узнать состояние каких чекбоксов было изменено (включая и среди полученных).
4) состояние выгодно хранить в виде значение 0/1, если надо что-то "картинное", то можно enum+радиокнопка.
5) следовательно, чекбоксы, это просто массив name=as[] и value=id.
6) далее пересечение массива с ранее запомненным, если же сессия к этому времени "умерла", то либо по версии 1, либо то что вы делаете, чтобы не тревожить все записи если их много, а тем более, если изменения производятся с постраничным выводом.
7) но в этом случае, для того чтобы узнать наличие значения в массиве, это in_array(), либо еще проще - $array[index] ? 1 : 0;
8) но поступать таким способом не есть хорошо, а лучше так, как я говорил выше, используя WHERE id IN(id, id, id, ...), это будет один запрос к базе, а не куча. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 18:12)
| | с типом текст так name=as[] и value=id. не выйдет
тут в ключ id придется?
и покажите более развернуто конструкцию WHERE id IN(id, id, id, ...), при этой задаче | |
|
|
|
|
|
|
|
для: iggipop
(28.06.2014 в 18:24)
| | Это почему не выйдет?
<input name="set[]" type="checkbox" value=48 (checked - это вообще не понятно, если только по условию они обязательно выбраны, но тогда непонятна логика)>
<input name="ps[48]" type="text" style="width:50px;" value="0"> вот тут и ниже понятно, ключ это id, а value его значение
<input name="ln[48]" type="text" style="width:70px;" value="http://link.com"> - ссылка
<?
//для установки 1 для пришедших id, будет условие
$sql = '.... WHERE id IN(' . implode(',', array_map('intval', $_POST['set'])) . ')';
|
| |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 18:35)
| | не сюда сорри | |
|
|
|
|
|
|
|
для: moonfox
(28.06.2014 в 19:18)
| | Вы вообще думаете или "как партия сказала, так и быть"?
а) если в базе есть значения сборошено/установлено, то почему все чекбоксы выбраны по умолчанию?
б) если база вообще ничего не отображает (хотя представить такое сложно, ибо должно быть значение по умолчанию), то к чему все эти душевные страдания, не проще ли по умолчанию выбрать 1?
И еще раз подумайте, и вообще, не спешите что-то писать, советовать и т.п., не подумавши как следует.
Что касаемо второго, то тоже самое - думайте, ибо я от этом писал, а вам же в раздел описаний функций работы с массивами и изучать, изучать, изучать... | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 19:29)
| |
б) если база вообще ничего не отображает (хотя представить такое сложно, ибо должно быть значение по умолчанию), то к чему все эти душевные страдания, не проще ли по умолчанию выбрать 1?
|
по умолчанию поле имеет 1
а) если в базе есть значения сборошено/установлено, то почему все чекбоксы выбраны по умолчанию?
|
а что не так? в БД стоит 1 | |
|
|
|
|
|
|
|
для: moonfox
(28.06.2014 в 19:40)
| | А вы что, автор этой базы?
Охота дискуссий на эту тему, так это не ко мне. Хотите ответ на свой вопрос - прочтите изначальный вопрос. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 19:44)
| | простите не туда нажал)
не туда это "не туда" именно так)
кстати а массивы то причем тут?
от того что я привел в тот раз не верный код?
ну вы знаете три минуты до того, как чел спросил я тоже не знал ответа
в сети есть информация, правда в первый раз я не осмысленно прочитал задачу и что делает арей слайсес, зато потом выяснил 3 функции которые могут пригодится к массивам.
в любом случае "нормальный" подход это испробовать на своем примере, а так как у меня не было задачи я и провтыкал.
а чел тупо ленивый и это есть не хорошо.
одному тут насоветовали из прошлой темы про if так у него и готовый код не работает не так ни этак.... | |
|
|
|
|
|
|
|
для: moonfox
(28.06.2014 в 19:47)
| | При том, что поля формы это массив.
Если требуется обновить данные, причем среди них есть индивидуальные, в отличие от чекбоксов, которые можно рассматривать как групповую операцию, то к чему вообще эта тема?
Вы не лучше этого "чел", ибо такие суждения вываливаете, что извилины от них выпрямляются. | |
|
|
|
|
|
|
|
для: confirm
(28.06.2014 в 20:01)
| | я понимаю теперь в чем загвоздка
вы сильно много приводите образов при объяснение сути
а еще есть такая вещь в ваших письменных суждениях, как не полная связанность всего текста...
при написании чего либо вам уже полностью понятного, вам кажется, что вы чуть ли не разжевали свою мысль, ан нет... частенько начинаешь аж путаться "о чем именно вы хотели написать")))
а вы знаете, насчет массива форм-данных, наверно только ежик не видит что такое print_r($_post)
правда вот реакция на увиденное не у всех одинаковая...
текстовые поля очевидно и с пустым значением вернуть свои id
не очевидно как быть с теми, что нужно обновить не получая их id
особенно если не действовать по варианту 1. | |
|
|
|
|
|
|
|
для: moonfox
(28.06.2014 в 21:17)
| | Вот что я вам скажу:
Изначально на вопрос был дан ответ или так, или так.
Далее, после приведенного чего там делают, стало понятно, что этого не стоит делать, потому и написано, что нафик нужно то-то и то-то, ибо все нужно делать каждым запросом, где для чекбокса 1 - пришел, 0 - нет (как на выводе).
Ну а далее начались сомнения, не у меня, потому и всевозможные разъяснения. У меня лишь одно, это не понимание хода мыслей автора.
Это понятно или нет?
Если не понятно, весьма жаль. | |
|
|
|
|