За последние 24 часа нас посетили 193444 программиста и 2147 роботов. Сейчас ищут 2213 программистов ...

Количество символов в переменной

Тема в разделе "PHP для новичков", создана пользователем klon5555, 17 янв 2012.

  1. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    В скрипте нужно сделать проверку на количество символов в переменной, полученной путем $_POST.
    В форме ограничение стоит, но его можно легким способом убрать и отправить форму без него. В итоге в базу можно будет добавить любую гору текста... =)

    Код (Text):
    1. $text = isset($_POST['text']) ? $_POST['text'] : ''; // Задаю переменную...
    2. if(strlen($text) > 5000) // Знаю, что проверять нужно таким способом.
    3.                          // Но как в случае true остановить обработку скрипта, и вывести сообщение об ошибке?
    4.                          // или же что-бы $sql вернул false.
    5. $sql = mysql_query("INSERT INTO table (text) VALUES ('$text')");
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Просто обрезай текст до нужной длины, т.к. кулцхакер уже обошел ограничение в форме и готов ко всему (к бану, например).
     
  3. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Спасибо за подсказку. Так и сделаю. Действительно хацкер знает что делает, и предупреждение ему не к чему ))
     
  4. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Следует обратить внимание, что при автоматическом экранировании кавычек текста получится больше, чем указано в maxlength.

    Обработку ошибок можно реализовать с помощью try catch. Читаемость кода повышается и бла-бла-бла.
     
  5. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    А вот это я совсем не учел... Не могли бы вы подсказать как это реализовать?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    klon5555, вы переживаете, что пользователь введёт более 5000 символов, при этом не учитываете, что кодировка может быть UTF-8 (т.е. по два байта на один русский символ). Если не подключён модуль mb_string, то strlen вернёт количество байт, т.е. в два раза больше, чем ввёл пользователь.

    Сообщение, об ошибке можно не показывать, но его нужно логировать, и сообщать пользователю, что есть какие-то проблемы, мол извини, потому что завтра у вас в скрипте что-либо сломается, и вы даже не узнаете, что пользователи постоянно сталкиваются с какими-то проблемами. +1 к try catch

    Ну и совсем смешно выглядит диалог про хакеров, т.к. у вас обыкновенный sql-injection, если не включены magic_quotes.
     
  8. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ну, может, в примере упрощенный вариант, и он допилит проверку данных и сделает конвертацию. Задача была другая.
     
  9. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    К сожалению, подключенность модуля mb_string не влияет на работу функции strlen. При работе со строками в utf-8 надо использовать функцию mb_strlen:
    http://www.php.net/manual/en/function.mb-strlen.php
    - или сделать, как в следующем посте.
     
  10. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
  11. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    topas, спасибо за ссылку.
     
  12. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Извиняюсь за столь поздний ответ в теме.
    Но что-то я не совсем понял как это реализовать...
    Кодировка документа и скрипта всегда utf8, поэтому данные по любому отправятся в utf8, соответственно всё должно быть нормально. Или я не прав?
     
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    strlen работает неправильно с многобайтовыми (utf-8) кодировками
     
  14. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Не могли бы Вы подсказать, каким образом подключить этот модуль? :)
     
  15. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    для начала стоит написать
    Код (PHP):
    1. <?php
    2. phpinfo(); 
    и посмотреть, встречаются ли слова mb_string
    А в целом вам сюда и сюда
     
  16. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Может так?
    Код (Text):
    1.  
    2. INSERT INTO TABLE (text) select SUBSTRING('Типа большой текст',1,5)
     
  17. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Не разобрался как сделать в таком варианте несколько полей.

    Сделал так:
    Код (Text):
    1. $title = substr(isset($_POST['title']) ? $_POST['title'] : '',0,32);
    2. $cutdesc = substr(isset($_POST['cutdesc']) ? $_POST['cutdesc'] : '',0,300);
    3. $fulldesc = substr(isset($_POST['fulldesc']) ? $_POST['fulldesc'] : '',0,5000);
    По идее должно работать нормально.
    Если у вас есть какие-то возражения насчет этого способа решения, буду рад услышать их.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    trim забыл