проверка формы

Тема в разделе "PHP", создана пользователем sunyang, 31 мар 2011.

Модераторы: latteo
  1. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    440
    Симпатии:
    30
    есть скрипт с формой для постинга комментов. Помогите пожалуйста дописать проверку полей формы
    PHP:
    <?php
    // вывод имеющихся комментариев
    //Подключаемся к базе
    @MYSQL_CONNECT('localhost''root''') or die("Ошибка при соединении с Базой MySQL!!!");
    //выбираем БД
    @MYSQL_SELECT_DB('mydb') or die("Не могу выбрать базу <b>mydb</b>");
    //устанавливаем кодировку
    @mysql_query("SET CHARACTER SET cp1251;") or die("Invalid query: "mysql_error());
    //выбираем все комментарии
    //$result=mysql_query("SELECT * FROM comments");
    // нужно значение photoid передать в переменной, которая равна $getImage['id']
    $result=mysql_query("SELECT * FROM comments WHERE photoid= " intval($getImage['id']));
    while (
    $row=mysql_fetch_array($result))
    {
      
    //последовательно выводим все комментарии
      
    echo "<hr><b>".$row['name']."</b><br>".$row['text'];
    }
    ?>
    </div><br>
    <br>
    <div align=center id=cerror></div>
    <form  name=comment id=com>
    id Фото:<br>
    <input  type=text name=photoid value="<?=$getImage['id']?>" />
    <br>
    Ваше имя:<br>
    <input  type=text name=comname><br>
    Текст записи:<br>
    <textarea name=comtext cols=69 rows=10></textarea><br>
    <input id=sub type=submit value="Добавить комментарий" onClick="addComment(); return false;">
    </form>
     
  2. sam3000

    sam3000 Создатель

    Регистр.:
    2 окт 2007
    Сообщения:
    13
    Симпатии:
    1
    В форум добавить:
    Код:
    <input type="hidden" name="do_comm" value="true">
    Блок проверки:
    PHP:
    if ($_POST['do_comm']) {
        
    $id $_POST['photoid'];
        
    $name $_POST['comname'];
        
    $comment $_POST['comtext'];
        
    // дальше проверяем
        
    if (empty($name)) {
            print 
    "Вы забыли ввести имя<br />";
        } else if (
    preg_match("/[^А-яA-z0-9_-]+$/"$name)) {
            print 
    "Символы бяки в имени<br />";
        } else if (empty(
    $comment)) {
            print 
    "Вы забыли ввести комментарий<br />";
        } else if (empty(
    int($id))) {
            print 
    "Не трогайте айди фотки<br />";
        } else {
            
    //выполняем скрипт добавления
            
    $query "INSERT INTO `comments` (`photoid`, `name`, `text`)
                VALUES ('"
    .mysql_real_escape_string(int($id))."', '".mysql_real_escape_string($name)."', '".mysql_real_escape_string($comment)."')";
            
    mysql_query($query);
        }
    }
    Что-то типа этого. Можно еще проверять длину полей через js/jq и php.

    П.С. и лучше <input type=text name=photoid value="<?=$getImage['id']?>" /> сделать как type="hidden".
    Хотя в хидден поля тоже всякий мусор подставляют.
     
  3. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    У тебя суперглобальный массив $_POST вообще может быть не объявлен, либо объявлен частично. Надо сначала проверять на isset, а потом уже на empty, иначе получишь warning. Я тут заметил такую тенденцию, что ты своими кривыми советами попросту набираешь посты. Смотри, как бы в бан не полететь.

    PHP:
    else if (preg_match("/[^А-яA-z0-9_-]+$/"$name)) {
            print 
    "Символы бяки в имени<br />";
        }
    Если уж ты такой гений проверяешь строку на символы, не входящие в список(хотя по уму сравнивают с допустимой маской, а не наоборот), не сочти за труд поставить "^" после первого ограничителя шаблона в твоей регулярке:
    PHP:
    else if (preg_match("/^[^А-яA-z0-9_-]+$/"$name)) {
             print 
    "Символы бяки в имени<br />";
         }
    Иначе в нее можно будет подставить все что угодно. А так у тебя получается, что проверка идет только в конце строки.
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    если использовать html5 http://www.w3.org/TR/html5/the-input-element.html#the-input-element
    то достаточно
    выбрать нужный тип поля и поставить свойство required=true
    а в pattern можно задать регулярку
    пример
    Код:
    <input required="true" name="mypole" value="" pattern="[A-Z0-9]+">
    это аналог проверки как реализуется на JS, только браузер должен быть современным
    2010 года ))
     
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    А как оно с кириллицей работает?
     
  6. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    если про регулярки, хз на руссиш не проверял, я такое ставил на email, логин, еще несколько полей и все.

    если про то, что без регулярки работает отметнно, так же можно задать мин и макс символов, и браузер будет ругатся,
    а потом в пхп через filter_var чекать ) у меня так сделано.
     
  7. sam3000

    sam3000 Создатель

    Регистр.:
    2 окт 2007
    Сообщения:
    13
    Симпатии:
    1
    Да да, в форме я ради прикола держу method="post". Хотя у себя в скриптах я всегда проверяю на подобное. Данный кусок как пример.
    Странно, я использую текущую регулярку на одном ресурсе, при тесте все было ок. Можешь примеры показать что можно подставить и как?
    Кому как нравится.

    XSiteCMS, для человека который использует другую форму будет без разницы что ты в форму добавишь. Конечно для пользователей это прикольная фича.
    И сколько браузеров поддерживает проверку в хтмл5?
     
  8. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Не слушйте любителей HTML/JS защит. Такой подход актуален только в связке с серверной (PHP) проверкой и служит исключиельно для избежания ошибок добросовестным пользователем.

    Код:
     
    if(isset($_POST['do_comm'])){
      $id = isset($_POST['photoid']) ? (int) $_POST['photoid'] : false;
      $name = isset($_POST['comname']) ? $_POST['comname'] : false;
      $comment = isset($_POST['comtext'] ? $_POST['comtext'] : false;
      if(!$id or !is_integer(id)){
         die(); //ID не должен меняться в браузере и ругаться бесполезно. Также он должен быть INTом
      }
      if(!$name){
         ругаемся на пустой name
      }elseif(!preg_match("/^[^А-яA-z0-9_-]+$/", $name)){//регулярку скопипасил, остается на совести saen :)
        ругаемся на имя
      }else{
      }
      if(!$comment){
          ругаемся на пустой коммент
      }else{
        //вот тут определитесь что сделать с HTML тегами
        //Убрать :
        $allow="<p><br><u><i>"; //в общем те, что разрешаются
        comment=strip_tags(comment,$allow);
        //ИЛИ их отображать (именно показать как пони пишутся, но не обрабатывать браузером)
        comment=htmlspecialchars(comment, + ДРУГИЕ ПАРАМЕТРЫ);
      }
    }
    
    После этого уже вставка в БД как предложил saen.
    Если не обработать теги - убют или дизайн, или через JS фокус покажут ;)
     
  9. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    А самому проверить мозгов не хватает?
    PHP:
    $name '$"#!Вася#';
    if (
    preg_match("/[^А-яA-z0-9_-]+$/"$name))
    {
            print 
    "Символы бяки в имени";

    Выведет "Символы бяки в имени".

    А вот так:
    PHP:
    $name '$"#!Вася';
    if (
    preg_match("/[^А-яA-z0-9_-]+$/"$name))
    {
            print 
    "Символы бяки в имени";

    ничего не выведет, потому что, как я уже писал выше, твое регулярное выражение проверяет только конец строки.
     
  10. sam3000

    sam3000 Создатель

    Регистр.:
    2 окт 2007
    Сообщения:
    13
    Симпатии:
    1
    PHP:
    $name '$"#!Вася#';
    if (
    preg_match("/^[^А-яA-z0-9_-]+$/"$name))
    {
            print 
    "Символы бяки в имени<br />";
    }
    Ничего не выводит на пхп 5.2.14
    Такая проверка preg_match("/[^А-яA-z0-9_-]+/", $name) лучше. Надо будет еще поковырять.
    Обязательно, яж криворукий, всегда должен спросить чтобы мне разжевали. Да и лишний раз напрячь такого гения как ты стоит того :Р