Форум: "Прочее";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
ВнизHTML-элемент "checkbox" Найти похожие ветки
← →
Пробегал2.... (2008-07-21 21:51) [0]Как известно, есть такой input-элемент checkbox, который на мой взгляд обладает большим недостатком. Дело в том, что если checkbox взведен, то в GET/POST запросе присутствуют данные о нем в виде "name=value". А вот если checkbox не отмечен - то данных о нем в запросе вообще нету ;( На мой взгляд это очень нелогично, можно было бы предусмотреть значения навроде <input type="checkbox" valueEnabled="on" valueDisabled="off" /> и тогда не было бы проблемы ;( Ведь элемент типа "text" если он равняется пустой строчке - отправляет в запросе пустую строчку, хотя по той же логике мог бы ничего не отправлять. И это логично, что он отправляет...
Как обычно обрабатываются такие checkbox"ы? Если заранее известно, что такой checkbox с таким-то именем есть на форуме, то в терминах PHP получается аля:if (isset($checkbox_name)) { $state_checkbox = "on" ; }
else { $state_checkbox = "off" ; }
тут даже не особо важно какое именно значение Value присвоено CheckBox"у. Собственно, нафига оно нужно? Если checkbox активирован - то информация о нем БУДЕТ в запросе, а если не активирован - то не будет...
И все хорошо, если ты знаешь, что такой элемент есть в форме. А если не знаешь?
Допустим, у меня такая ситуация - в базе данных перечислены имена HTML элементов и их значения, которые нужно вывести в форму. В форме их можно изменить и опять сохранить в базу.
До сих пор код сохранения был элементарный донельзя - он просто перебирал существующие в запросе поля данных и сохранял их в базу данных. Это несколько строчек и абсолютно универсальных, можно добавить сколь угодно элементов в форму, все равно он их в цикле все переберет и сохранит. И знать не знает какие конкретно элементы на форме.
И все хорошо, кроме этого CheckBox. Да, если он активирован - то он в запросе присутствует и в базу допустим запишется значение "on" - то, что надо. Но если он не активирован - то его в запросе попросту не будет блин !!! И в базу ничего не запишется, никакого "off" и подобного... Так и останется предыдущее значение...
Многие, знаю, сталкивались с таким поведением, кто-то заменяет checkbox на 2 radio, но это визуально не так удобно ;(
Может, кто обладает элегантным решением проблемы?...
← →
McSimm © (2008-07-21 21:52) [1]
> И все хорошо, если ты знаешь, что такой элемент есть в форме.
> А если не знаешь?
Как такое может получиться ?
← →
ProgRAMmer Dimonych © (2008-07-21 21:55) [2]Если checkbox"ф нет, то предполагается какое-то действие по умолчанию. Условие задачи позволяет использовать HIDDEN-поле?
← →
Пробегал2.... (2008-07-21 23:43) [3]McSimm © (21.07.08 21:52) [1]
> И все хорошо, если ты знаешь, что такой элемент есть в форме.
> А если не знаешь?
Как такое может получиться ?
осталось прочитать всего-то пару абзацев вниз от того места, где ты остановился.
ProgRAMmer Dimonych © (21.07.08 21:55) [2]
Если checkbox"ф нет, то предполагается какое-то действие по умолчанию
ничего не понял - к чему это?
ProgRAMmer Dimonych © (21.07.08 21:55) [2]
Условие задачи позволяет использовать HIDDEN-поле?
позволяет. Но генерировать hidden-поле + JS, который будет в зависимости от нажатий на checkbox присваивать value совсем другому элементу... Ну думал над этим, но криво что-то ;( Вся элегантность решения теряется ;(
← →
Zeqfreed © (2008-07-21 23:52) [4]Ну так элементы то которые ты отображаешь ты берешь из базы? Значит знаешь что это за элементы. Для чекбоксов сделать дополнительное условие не вижу проблемы.
← →
McSimm © (2008-07-22 00:36) [5]
> осталось прочитать всего-то пару абзацев вниз от того места,
> где ты остановился.
Прочитал. Я не останавливался.
Я о том, что форма делается/генерируется обычно тем же программистом, что и ее обработка.
← →
Eraser © (2008-07-22 00:55) [6]> [0] Пробегал2.... (21.07.08 21:51)
во-первых, следуя этой логике под эту гребенку смело можно отправлять и остальные элементы.
во-вторых, веб-приложение основанное на такой логике (типа заранее не известно что за элементы) кроме как поделкой не назовешь.
это огромная дыра в безопасности, если даже какое-то время все буде нормально, то прийдет в проект новый человек и по незнанию сделает приложение дырявым.
> if (isset($checkbox_name)) { $state_checkbox = "on" ; }
> else { $state_checkbox = "off" ; }
$state_checkbox = isset($_REQUEST["checkbox_name"]) ? "on" : "off";
← →
speller (2008-07-22 04:44) [7]Не, всё проще ) Навскидку можно сделать так:
foreach ($dbFields as $field => $fieldData)
{
$value = isset($POST[$field]) ? $POST[$field] : "";
$postFields[$field] = ($fieldData["type"] == "checkbox" && $value == "") ? "off" : $value;
}
В результате в массиве $postFields получаем то, что нужно писать в базу. Немного сложнее, но такова жизнь, что не всё так как нам хотелось бы.
← →
speller (2008-07-22 04:51) [8]Кроме того, в таком цикле легко приживаются разного рода проверки на валидность запощенных данных, вроде минимальной/максимальной длины, и т.д., вырезание опасных для базы символов, обрезание html-тегов при необходимости, регэкспы на вырезание ява-скриптов. Например, присвоение $value можно обернуть в mysql_escape_string. Вобщем, на сколько знаний и фантазии хватит ) И вообще, на будущее - не красиво постоянно работать в $POST/$GET: нужно заводить свой массив, в котором хранить единожды обработанные посты.
← →
Style © (2008-07-22 09:44) [9]
> присвоение $value можно обернуть в mysql_escape_string.
а если magic_quotes_gpc включен?
> И вообще, на будущее - не красиво постоянно работать в $POST/$GET:
> нужно заводить свой массив, в котором хранить единожды
> обработанные посты.
Почему же не красиво? Может обрабатывать все post параметры и не нужно?
Написать функцию и вызывать ее для получения параметра.
function post($param, $default = false, $caseignore = false) {
global $post_keys;
if(($caseignore) && (!is_array($post_keys)) && (count($_POST) > 0)) {
$post_keys = array_keys($_POST);
$post_keys = array_combine(array_keys(array_change_key_case(array_flip($post_keys), CASE_LOWER)), $post_keys);
} else $post_keys = array();
if($caseignore) {
$param = strtolower($param);
if(array_key_exists($param,$post_keys)) {
$value = $_POST[$post_keys[$param]];
return get_magic_quotes_gpc() ? $value : addslashes($value);
}
else return $default;
}
else
{
$value = isset($_POST[$param]) ? $_POST[$param] : $default;
return get_magic_quotes_gpc() ? $value : addslashes($value);
}
}
← →
ProgRAMmer Dimonych © (2008-07-22 10:33) [10]> Style © (22.07.08 09:44) [9]
> а если magic_quotes_gpc включен?
Так убирать надо.
http://www.php.net/manual/ru/security.magicquotes.whynot.php
http://www.php.net/manual/ru/security.magicquotes.disabling.php
← →
speller (2008-07-22 15:15) [11]
> а если magic_quotes_gpc включен?
Можно сделать проверку и если включено - удалить результаты работы данной функции.
← →
Пробегал2.... (2008-07-22 19:48) [12]McSimm © (22.07.08 0:36) [5]
Я о том, что форма делается/генерируется обычно тем же программистом, что и ее обработка
верно. Но это не означает, что данный программист знает, какие будут поля на форме.
Я же рассказал, что элементы, например, могут браться из базы и в ее же потом все записываться...
Eraser © (22.07.08 0:55) [6]
во-первых, следуя этой логике под эту гребенку смело можно отправлять и остальные элементы
э... Я не знаю других элементов, которые при определенном своем значении Value НЕ отсылали данные. Даже текстовые элементы, если они пусты - все равно отсылают пустую строчку. Хотя по логике checkbox могли бы ничего не отсылать..
Eraser © (22.07.08 0:55) [6]
во-вторых, веб-приложение основанное на такой логике (типа заранее не известно что за элементы) кроме как поделкой не назовешь
то, что я лох - очевидный факт, прошу не обсуждать
Eraser © (22.07.08 0:55) [6]
это огромная дыра в безопасности, если даже какое-то время все буде нормально
полку телепатов прибыло? ;)
speller (22.07.08 4:44) [7]
Навскидку можно сделать так:
foreach ($dbFields as $field => $fieldData)
{
$value = isset($POST[$field]) ? $POST[$field] : "";
$postFields[$field] = ($fieldData["type"] == "checkbox" && $value == "") ? "off" : $value;
}
можно... А если пользователь ДОБАВИЛ новый элемент типа checkbox? Но при этом галочка не стоит? Информации об этом checkbox в сервер вообще не передастся!!! БРЕД.
speller (22.07.08 4:51) [8]
вообще, на будущее - не красиво постоянно работать в $POST/$GET: нужно заводить свой массив, в котором хранить единожды обработанные посты.
если честно - проект то написан не на PHP, а на дельфи. Но это сути проблемы с checkbox не меняет. Но интересно, а чем плохо использовать $_REQUEST то?
← →
Zeqfreed © (2008-07-22 19:58) [13]> Пробегал2.... (22.07.08 19:48) [12]
Ты уже опиши задачу по-людски. А то как будто тебе не решение нужно, а пожаловаться на горькую жизнь.
Что значит пользователь добавил чекбокс? У вас интерфейс, который на клиентской стороне позволяет добавлять произвольные элементы, которые необходимо потом запомнить в базе?
← →
speller (2008-07-22 20:12) [14]
> А если пользователь ДОБАВИЛ новый элемент типа checkbox?
> Но при этом галочка не стоит?
В таких случаях с помощью JS обходишь все инпуты формы и в хидден-поле вписываешь данные, которые будут поститься, оформив например в таком виде "field1,text;field2,checkbox;field3,textarea". Сервер, распарсив это одно поле, будет знать что ему искать в посте.
> Но интересно, а чем плохо использовать $_REQUEST то?
Много нюансов. Напишешь и посопровождаешь средней величины проект, работающий в свободном доступе - поймешь )
← →
Пробегал2.... (2008-07-22 20:20) [15]Удалено модератором
← →
VirEx © (2008-07-22 20:25) [16]Удалено модератором
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.048 c