Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.14;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.043 c
3-1206004854
Alexey
2008-03-20 12:20
2008.09.14
Работа с таблицами Fox Pro в Delphi 7


3-1204532945
Ega23
2008-03-03 11:29
2008.09.14
Добавить разом много записей.


13-1121704896
cherrex
2005-07-18 20:41
2008.09.14
Cassini server


2-1217518989
Евгений Р.
2008-07-31 19:43
2008.09.14
Есть ли такой компонент?


3-1205241234
DmitriyG.
2008-03-11 16:13
2008.09.14
Отмена выполнения запроса