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

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>
 
В форум добавить:
Код:
<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".
Хотя в хидден поля тоже всякий мусор подставляют.
 
В форум добавить:
Код:
<input type="hidden" name="do_comm" value="true">
Блок проверки:
Код:
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".
Хотя в хидден поля тоже всякий мусор подставляют.

У тебя суперглобальный массив $_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 />";
     }
Иначе в нее можно будет подставить все что угодно. А так у тебя получается, что проверка идет только в конце строки.
 
если использовать html5
то достаточно
выбрать нужный тип поля и поставить свойство required=true
а в pattern можно задать регулярку
пример
Код:
<input required="true" name="mypole" value="" pattern="[A-Z0-9]+">

это аналог проверки как реализуется на JS, только браузер должен быть современным
2010 года ))
 
если использовать html5 *** скрытое содержание ***
то достаточно
выбрать нужный тип поля и поставить свойство required=true
а в pattern можно задать регулярку
пример
Код:
<input required="true" name="mypole" value="" pattern="[A-Z0-9]+">
это аналог проверки как реализуется на JS, только браузер должен быть современным
2010 года ))
А как оно с кириллицей работает?
 
если про регулярки, хз на руссиш не проверял, я такое ставил на email, логин, еще несколько полей и все.

если про то, что без регулярки работает отметнно, так же можно задать мин и макс символов, и браузер будет ругатся,
а потом в пхп через filter_var чекать ) у меня так сделано.
 
У тебя суперглобальный массив $_POST вообще может быть не объявлен, либо объявлен частично. Надо сначала проверять на isset, а потом уже на empty, иначе получишь warning.
Да да, в форме я ради прикола держу method="post". Хотя у себя в скриптах я всегда проверяю на подобное. Данный кусок как пример.
PHP:
else if (preg_match("/[^А-яA-z0-9_-]+$/", $name)) {
        print "Символы бяки в имени<br />";
    }
Если уж ты такой гений проверяешь строку на символы, не входящие в список, не сочти за труд поставить "^" после первого ограничителя шаблона в твоей регулярке:
PHP:
else if (preg_match("/^[^А-яA-z0-9_-]+$/", $name)) {
         print "Символы бяки в имени<br />";
     }
Иначе в нее можно будет подставить все что угодно. А так у тебя получается, что проверка идет только в конце строки.
Странно, я использую текущую регулярку на одном ресурсе, при тесте все было ок. Можешь примеры показать что можно подставить и как?
хотя по уму сравнивают с допустимой маской, а не наоборот
Кому как нравится.

XSiteCMS, для человека который использует другую форму будет без разницы что ты в форму добавишь. Конечно для пользователей это прикольная фича.
И сколько браузеров поддерживает проверку в хтмл5?
 
Не слушйте любителей 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 фокус покажут ;)
 
Да да, в форме я ради прикола держу method="post". Хотя у себя в скриптах я всегда проверяю на подобное. Данный кусок как пример.

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

Кому как нравится.

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

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

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