Jump to content
  • 0

Проверка введенных данных


Serafim1991
 Share

Question

Есть форма, в которую подключается php-скрипт проверки правильности ввода данных(скрипт не дописан на все поля, но не суть)

При запуске формы через WebMatrix после нажатия на кнопку Submit идет перенаправление либо на страницу скрипта с выводом его текста(localhost:8080/PhpScript.php в адресной строке и текст этого файла в окне браузера), либо на пустую страницу(localhost:8080/PhpScript.php и пустая страница в окне браузера)

Собственно вопрос: скрипт не делает никаких действий(хотя, судя по написанному должен ругаться как минимум на 2 поля). В чем проблема? В какую сторону копать, чтобы эту ошибку исправить?

P.S. архив с файлами - http://d01.megashares.com/dl/HmTbP8d/LB1_IIS.rar jQuery подключен локально(мне так удобнее)

P.P.S. это исходная версия, поэтому в ней может быть ошибка в php-файле на 8 и 129 строчках(решается простым закомментированием этих строк, но почему она появляется для меня тоже загадка)

Link to comment
Share on other sites

Recommended Posts

  • 0

1. У формы есть своя html5 валидация, которая у меня в Google Chrome отлично работает

2. Если встроенная валидация не работает, то посылаются пустые переменные:

var_dump($_REQUEST["name"]);

сообщает

string(0) ""

3. Затем смотрим, что происходит с этой переменной в коде дальше:

$errfN=NameVal($fn, "Имя: ");

после этого errfN становится равным true - ошибка присуствует.

4. Смотрим код дальше... упс! а где дальнейшее использование errfN? У вас в самом начале кода стоит

            if ($_COOKIE["TestCookie"]!="12345678"){
echo "Включите, пожалуйста, куки-файлы!";
$formErr=true;
}else{
//echo $_COOKIE["Redirect"];
if($_COOKIE["Redirect"]=="Yes"){
header("Location:Welcom.php");
}
setcookie("surname", $ln);
setcookie("name", $fn);

setcookie("email", $em);
setcookie("phone", $ph);

}

и это выполняется вне зависимости от наличия ошибок.

Link to comment
Share on other sites

  • 0

Насчет первого пункта: тамошняя проверка происходит только на наличие каких-либо символов в поле(практически для каждого инпута я добавил свойство "required"). В поле "Имя" можно ввести "!%?:1sdsd;:" и форма посчитает это правильным именем

Насчет второго, третьего и четвертого - получается, что я взял только список переменных и просто их объявил без какого-либо использования? Ужас, вот так и копируй чужие скрипты...

Спасибо.

Edited by Serafim1991
Link to comment
Share on other sites

  • 0

более менее верный скрипт, но все еще требует некоторой правки, в зависимости от остальных скриптов http://pastebin.com/t0NXZYLA

P.S. при выполнении происходит проверка, включены ли куки, если предположить, что javascript отключен.

Еще советую в Form1.html сделать так:

<script type="text/javascript">
$(document).ready(function() {
$('input, select, textarea').focus(function() {
$(this).parent('li').addClass('active');
});
$('input, select, textarea').blur(function() {
$(this).parent('li').removeClass('active');
});
document.cookie="TestCookie=12345678";
});
</script>

таким образом, если у пользователя включен javascript, кука будет создаваться еще на странице с формой и при отправке данных в скрипт не потребуется дополнительная проверка, или же устанавливать ее через PHP, переименовав Form1 в .php формат

Edited by NeoXidizer
Link to comment
Share on other sites

  • 0

Спасибо большое за код.

Постараюсь подкорректировать под нужды без посторонней помощи.

Однако есть один небольшой вопрос: можно ли организовать редирект после нажатия на кнопку Submit на ту же страницу с формой с выводом ошибок где-то справа?

Link to comment
Share on other sites

  • 0

$_SERVER['PHP_SELF'];

плохая практика, я бы не советовал. Лучше пустым оставить, или ".", смотря по доктайпу.

А можно обоснование?

Я, к примеру, не знаю, почему "можно и так и так, но лучше так"

Link to comment
Share on other sites

  • 0

Спасибо большое за код.

Постараюсь подкорректировать под нужды без посторонней помощи.

Однако есть один небольшой вопрос: можно ли организовать редирект после нажатия на кнопку Submit на ту же страницу с формой с выводом ошибок где-то справа?

ради прикола можно вот так сделать:

ref1.php


<?php
if(isset($_GET['a']) && $_GET['a'] == 1 && !empty($_GET['a'])) {
echo 'Email не был указан, или указан некорректный email!';
} elseif(isset($_GET['a']) && $_GET['a'] == 2 && !empty($_GET['a'])) {
echo 'Все в порядке!';
}
echo '
<form action="ref2.php" method="post">
<input type="text" name="mail">
<input type="submit" value="отправить">
</form>
';
?>

обработчик ref2.php


<?php
$mail = $_POST['mail'];
if(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['mail'])) {
header('Location: http://'.$_SERVER['HTTP_HOST'].'/ref1.php?a=1');
} else {
header('Location: http://'.$_SERVER['HTTP_HOST'].'/ref1.php?a=2');
}
?>

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

Link to comment
Share on other sites

  • 0

$_SERVER['PHP_SELF'];

плохая практика, я бы не советовал. Лучше пустым оставить, или ".", смотря по доктайпу.

А можно обоснование?

Я, к примеру, не знаю, почему "можно и так и так, но лучше так"

При использовании ЧПУ на основе редиректов через .htaccess в $_SERVER['PHP_SELF'] можно получить совсем не то, что видим в адресной строке. А они сейчас повсеместно.

Link to comment
Share on other sites

  • 0

$_SERVER['PHP_SELF'];

плохая практика, я бы не советовал. Лучше пустым оставить, или ".", смотря по доктайпу.

А можно обоснование?

Я, к примеру, не знаю, почему "можно и так и так, но лучше так"

При использовании ЧПУ на основе редиректов через .htaccess в $_SERVER['PHP_SELF'] можно получить совсем не то, что видим в адресной строке. А они сейчас повсеместно.

А если использовать $_SERVER['REQUEST_URI'] ?

Link to comment
Share on other sites

  • 0

Бьюсь-бьюсь, но результата все нет.

Вернее есть, только отрицательный.

В голову пришла следующая мысль: а не проще ли сделать ту же самую проверку используя цикл if и регексы?

И правда, не проще ли так будет?

Что-то типа(код не мой, спер у товарища):


<?php
$name=$_POST['name'];
$password=$_POST['password'];
$email=$_POST['email'];
$message=$_POST['message'];
$url=$_POST['url'];
if (!preg_match("|^[\w\d\. ]+$|i",$name))
exit ("Неверный формат имени");
if(!preg_match("|^[\w\d\. ]+$|i", $password))
exit("Неверный формат пароля");
if(!preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}|i", $email))
exit("Неверный формат E-mail");
if(!preg_match("|^[^';]+$|i", $message))
exit("Неверный формат E-mail");
if(!preg_match("#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi|ru)#i", $url))
exit("Неверный формат URL");
?>

Link to comment
Share on other sites

  • 0

Serafim1991, вы уж определитесь как-то с вопросом.

то какая-то ошибка, которую вы не знаете (не можете понять), то вывести где-то справа текст о не верном вводе данных в поле, то валидация формы...

и да, exit(); завершает работу скрипта, если возникла ошибка по условию, но не выводит текст ошибки, для вывода используйте echo.

Link to comment
Share on other sites

  • 0

и да, exit(); завершает работу скрипта, если возникла ошибка по условию, но не выводит текст ошибки, для вывода используйте echo.

exit() завершает, да, но почему же не выводит?

Serafim1991, if — не цикл, а условие. Для проверки email, уже не помню с какой версии, есть встроенная функция, я бы использовал её.

UP: http://ru2.php.net/filter_var , PHP 5 >= 5.2.0.

Link to comment
Share on other sites

  • 0

exit() завершает, да, но почему же не выводит?

ссори, просто я не пользуюсь им именно для вывода, потому видимо так и сказал... да я вообще им стараюсь не пользоваться.

Для проверки email, уже не помню с какой версии, есть встроенная функция, я бы использовал её.

ага, есть: http://www.php.net/manual/en/function.filter-var.php

Link to comment
Share on other sites

  • 0

Serafim1991, вы уж определитесь как-то с вопросом.

то какая-то ошибка, которую вы не знаете (не можете понять), то вывести где-то справа текст о не верном вводе данных в поле, то валидация формы...

и да, exit(); завершает работу скрипта, если возникла ошибка по условию, но не выводит текст ошибки, для вывода используйте echo.

Ну на первый вопрос мне ответили. Описать переменные я описал, но не использовал их.

Про текст - это так, по мелочи, ибо тот вывод, который я себе представляю, самолично я сделать не могу, а просить сделать его за меня я как-то стесняюсь(в свои-то 21 и стесняюсь... Позор мне)

Валидацию я вроде как прошел(валидатор показал только одно предупреждение)

Насчет exit - буду знать, спасибо

Serafim1991, if — не цикл, а условие. Для проверки email, уже не помню с какой версии, есть встроенная функция, я бы использовал её.

UP: http://ru2.php.net/filter_var , PHP 5 >= 5.2.0.

За ссылку благодарен, почитаю на досуге.

P.S. прочитать личное сообщение не могу, нет 30 сообщений.

Link to comment
Share on other sites

  • 0

Про текст - это так, по мелочи, ибо тот вывод, который я себе представляю, самолично я сделать не могу, а просить сделать его за меня я как-то стесняюсь(в свои-то 21 и стесняюсь... Позор мне)

про вывод, я описал как вариант выше, но на мой взгляд - это изврат полный!

я бы лучше инклудом подгружал обработчик на страницу формы и в теге <form> просто action="" оставляете пустым, method="POST" и все ошибки при не правильном вводе в поля будут выводиться на этой же странице, и никуда перенаправлять не надо будет.

Link to comment
Share on other sites

  • 0

С инклудом не понял(перед тегом form написал <?php include("PhpScript.php"); ?>, action оставил пустым - но ничего не вышло). Поэтому я просто взял код формы и добавил в php-файл после самого php-кода

От регексов решил отказаться, оставил старую версию(слегка модифицированную).

Остался только два момента:

function NameVal(&$src, $nametype){
global $ErrorString;
global $formErr;

if(empty($src)){
$ErrorString.= "<b>** $nametype незаполненное поле. **</b><br>";
$err=true;
$formErr= true;
}else{
setlocale(LC_ALL,'Russian_Russia.1251');
$str="Русский";
$src = ucfirst($src);
if(!ctype_alpha($src)){
$ErrorString.= "<b>** $nametype имеются некорректные символы. **</b><br>";
$err=true;
$formErr= true;
}
}
return $err;
}

функция работает корректно там, где нужно проверять символы на буквы(если не буквы - выводить ошибку). Но мне мешает "ctype_alpha". Ну как мешает - он свою работу делает, но не пропускает такие символы как точка, запятая и пробел. Есть что-то похожее, что будет разрешать вводить точку, запятую и пробел не используя условия if как в проверке e-mail'а?

И второй момент:

setlocale(LC_ALL,'Russian_Russia.1251');

- отказывается работать.

Пробовал разные способы:

setlocale(LC_ALL,"rus.1251");

setlocale(LC_ALL,"rus");

setlocale(LC_ALL,"russian");

(кавычки использовал как одинарные, так и двойные - результат один и тот же)

На русские буквы он ругается сообщением о недопустимых символах.

Что здесь не так?

Edited by Serafim1991
Link to comment
Share on other sites

  • 0

Возможно вам мой ответ покажется не к месту, но:

1) не знаю назначения этой формы, но никогда бы не стал заморачиваться над полем скажем name, буквы там, или цифры... просто сделал бы проверку на ввод символов (любых) не меньше скажем 5, или 3.

2) я не знаю откуда в функции вообще взялись переменные $src и $nametype и поэтому не понимаю что она должна делать, да и вообще для проверки форм такое извращение вижу впервые!

С инклудом не понял(перед тегом form написал <?php include("PhpScript.php"); ?>, action оставил пустым - но ничего не вышло). Поэтому я просто взял код формы и добавил в php-файл после самого php-кода

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

От регексов решил отказаться, оставил старую версию(слегка модифицированную).

Почему? Основание? Регулярные выражения для проверки валидности введенных данных в формы - это как раз и самое распространенное решение, и самое подходящее и очевидное, а велик изобретать имхо тут смысла не вижу, если это обычная форма с отсылкой введенных данных на ваше мыло.

Link to comment
Share on other sites

  • 0

Возможно вам мой ответ покажется не к месту, но:

1) не знаю назначения этой формы, но никогда бы не стал заморачиваться над полем скажем name, буквы там, или цифры... просто сделал бы проверку на ввод символов (любых) не меньше скажем 5, или 3.

Не-не, это не для поля name. Вернее, функция для этого поля, но вопрос не про name. Это для поля адреса.

Хотя, возможно вы правы и не стоит так извращаться. Это же не полноценный сайт.

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

Да нет, в той же папке.

Я думал, что неправильно подключил, но раз претензий нет, значит ошибка где-то в другом месте.

Просто не хочется оставлять php и html код в одном файле. Возможно, это моя ошибка, но мне гораздо удобнее, ежели каждый код(php, JS, html, css, etc) будет находится в отдельном файле.

Почему? Основание? Регулярные выражения для проверки валидности введенных данных в формы - это как раз и самое распространенное решение, и самое подходящее и очевидное, а велик изобретать имхо тут смысла не вижу, если это обычная форма с отсылкой введенных данных на ваше мыло.

Все объясняется очень просто - они у меня не работают.

Например:


$name=$_POST['name'];
if (!preg_match("|^[\w\d\. ]+$|i",$name))
echo ("Неверный формат имени");

выводит ошибку при любых символах.


$email=$_POST['email'];
if(!preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}|i", $email))
echo("Неверный формат E-mail");

проверяет только чтобы были символы перед собачкой, сама собачка и после собачки. Можно написать test@test - и это будет правильным, по мнению условия, email адресом.

Link to comment
Share on other sites

  • 0

ну вот к примеру форма:


<form method="Post" action="">
<table class="table_content">
<tr>
<td class="td_border">ФИО<font color="#FF0000">*</font>:</td>
<td class="td_border"><input type="Text" name="name" maxlength="60" width="285"/></td>
</tr>
<tr>
<td class="td_border">Ваш E-Mail<font color="#FF0000">*</font>:</td>
<td class="td_border"><input type="Text" name="email" maxlength="30" /></td>
</tr>
<tr>
<td class="td_border">Контактный телефон<font color="#FF0000">*</font>:</td>
<td class="td_border"><input type="Text" name="tel" maxlength="20" /></td>
</tr>
<tr>
<td class="td_border">Комментарий:</td>
<td class="td_border"><textarea cols=40 rows=5 name="message"></textarea></td>
</tr>
<tr>
<td class="td_border" colspan="2" align="center"><input type="Submit" value="Отправить" /></td>
</tr>
</table>
</form>

вот ее обработчик:


<?
$date = date("d/m/Y");
$name = $_POST['name'];
$tel = $_POST['tel'];
$email = $_POST['email'];
$message = $_POST['message'];

if (empty($_POST['name']) or strlen($name) < 5) {
echo '<p>Вы не указали фамилию и имя!</p>';
}
elseif (empty($_POST['tel']) or strlen($tel) < 7) {
echo '<p>Вы не указали свой номер телефона.</p>';
}
elseif(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['email'])) {
echo '<p>Email не был указан, или указан некорректный email!</p>';
} else {
$text = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>'. $from . '</title>
<style media="screen" type="text/css">
table {
padding:5px;
margin:5px;
border:#E2E2E2 solid 2px;
width:600px;
text-align: center;
}
td {
border:#E2E2E2 solid 1px;
width:100px;
padding:5px;
margin:5px;
text-align: center;
color:#3E73C8;
}
body {
margin: 0;
padding: 6px;
border: 0;
background: #fff;
text-align: center;
}
</style>
</head>
<body>
<table>
<tr>
<td>ФИО отправителя:</td>
<td> ' . $name = str_replace("\n", "<br />", $name) . '</td>
</tr>
<tr>
<td>Email отправителя:</td>
<td> ' . $email = str_replace("\n", "<br />", $email) . '</td>
</tr>
<tr>
<td>Телефон отправителя:</td>
<td> ' . $tel = str_replace("\n", "<br />", $tel) . '</td>
</tr>
<tr>
<td>Комментарии к заказу:</td>
<td> ' . $message = str_replace("\n", "<br />", $message) . '</td>
</tr>
<tr>
<td>Дата отправки заказа:</td>
<td><div style="line-height: 30px;"> (' . $date . ')</div></td>
</tr>
</table>
</body>
</html>';

$toMail = "test@test.ru"; // куда отправляем
$subject= "сообщение с сайта ".$_SERVER['SERVER_NAME'];
$from = "Администратор";
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-type: text/html; charset=windows-1251 \r\n";
$headers .= "From: $from<info@".$_SERVER['SERVER_NAME'].">\r\n"; // мыло сайта откуда отправлено сообщение
mail ($toMail, $subject, $text, $headers);
echo '<p>Сообщение успешно отправлено.</p>';
}
?>

что-то типа того...

Link to comment
Share on other sites

  • 0

и всё таки:


if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == FALSE){
echo '<p>Email не был указан, или указан некорректный email!</p>';}

труЪ же :)

Rus, а почему windows-1251? Не клёво же.

Edited by Быколай
Link to comment
Share on other sites

  • 0

и всё таки:


if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == FALSE){
echo '<p>Email не был указан, или указан некорректный email!</p>';}

труЪ же :)

Rus, а почему windows-1251? Не клёво же.

yes of corsa :D

да, так и есть, просто пример оочень древний и валялся на локалке бог знает сколько!

но в качестве примера думаю пойдет.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy