Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.51 MB
Время: 0.05 c
4-1195550970
guav
2007-11-20 12:29
2008.09.14
Список всех дисков (не томов, именно физических дисков).


2-1217581135
krem
2008-08-01 12:58
2008.09.14
Сохранение файла


15-1216894108
Кактус
2008-07-24 14:08
2008.09.14
SQL


3-1206087836
denis24
2008-03-21 11:23
2008.09.14
гетерогенный запрос


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский