[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: организация валидации
panich
Доброго времени суток!
Попрошу разъяснить вот какой вопрос:
Хочу реализовать обработку вводимых пользователем данных по средствам вывода сообщений об ошибках на js и php, для верности.
Теперь сама суть:
Вот беру поле,по средствам ajax передаю в php,там проверяю на валидность и через div вывожу сообщение об ошибке.При этом на js разблокирую кнопку(если всё хорошо),так как в html прописал значение btn-disabled...Есть ещё второй файл php, к которому обращается html,если отключен js(там примерно то же самое как и в первом).
Вопрос:
1. У меня выводит сообщения об ошибках сначала js,а потом ещё и дублирующий файл php(на белом фоне через echo).
2. Как я понимаю,в файле php,который срабатывает при обращении js, не нужно прописывать работу с вводом данных в базу?
Натолкните где тут глупости делаю!?Спасибо...



Спустя 1 минута, 54 секунды (23.01.2012 - 17:34) caballero написал(а):
у тебя что и аякс работает и страница перегружается?

Спустя 6 минут, 52 секунды (23.01.2012 - 17:41) panich написал(а):
Биру данные и через аякс отправляю в php на проверку...
Но если js отключен-значит аякс работать не будет.Соответственно создаю второй файл,который будет вести обработку.
Всё дело в том,что вывожу сообщения об ошибках через html(html)...а если js работать не будт,то сообщения вывожу через echo...как-то так!
П.С.Скажите,если объясняю плохо!

Спустя 6 минут, 22 секунды (23.01.2012 - 17:47) m4a1fox написал(а):
плохо объясняешь. Ни кода ни конкретики. Так, чисто на словах... ИМХО не понятно. Ты по кусочкам план разбей, и выполняй последовательно.

Спустя 2 минуты, 2 секунды (23.01.2012 - 17:49) panich написал(а):
Давайте так:
при проверке ajax нужно делать два файла php,что бы избежать иньекции при отключении js?

Спустя 12 минут, 2 секунды (23.01.2012 - 18:01) m4a1fox написал(а):
panich
Цитата
при проверке ajax нужно делать два файла php

C чего вдруг? Поясни!

Спустя 5 часов, 34 минуты, 22 секунды (23.01.2012 - 23:36) neadekvat написал(а):
panich, плохо.

Проверку на корректность введенных данных лучше проводить средствами самого js. Единственное, зачем тут может понадобиться php - это, например, проверка логина на свободен/занят.

Форму вместе со скриптом проверки (скрипт также можно положить в отдельный js файл) выносишь в файл. В обработчике формы (php-файл) проверяешь, была ли прислана форма. Если нет - подключаешь форму. Если была прислана - проверяешь корректность введенных данных. Если есть ошибки - снова выводишь форму, но с добавленными сообщениями об ошибке.

Спустя 6 часов, 43 минуты, 53 секунды (24.01.2012 - 06:19) panich написал(а):
 <form  action="../znakomstva/testreg.php" method="POST" id="form_enter">
<input
id="name_vhod" type="text" name="login" maxlength="20">
<input
id="pass_vhod" type="password" name="pass" maxlength="15">
<input
id="autovhod" type="checkbox" name="autovhod" value="1">
<input
id="btn" type="submit" name="btn" value="">
</form>

$('#form_enter input[name=btn]').click(function(){
if ($('#name_vhod').val().length == 0)
{
$("<div id='indNameV'>Не введён ЛОГИН!</div>").insertAfter('#form_enter');
$('#form_enter #btn').attr('disabled', 'disabled');
}
else
{
if(!$('#name_vhod').val().match("/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,6}$/"))
{
$("<div id='indNameV'>Некорректно введён email-адрес!</div>").insertAfter('#form_enter');
$('#form_enter #btn').attr('disabled', 'disabled');
}
}
}
);

Подскажите,почему в этом случеае у меня кнопка не блокируется и как организовать здесь проверки типа
$old_login = mysql_real_escape_string(trim(htmlspecialchars($_SESSION['login'])));
$login = mysql_real_escape_string(trim($_POST['login']));
$login = htmlspecialchars($login);
а самое главное-нужно ли это здесь?

Спустя 4 часа, 55 минут, 34 секунды (24.01.2012 - 11:15) panich написал(а):
В приведённом выше коде если пишу,что бы при событии с полем blur кнопка просто блокировалась,то срабатывает.
А, если что бы при нажатии на кнопку проверялось условия if else,то блокиратор не работает.Почему?

Спустя 1 час, 21 минута, 59 секунд (24.01.2012 - 12:37) neadekvat написал(а):
panich
1. У тебя не blur, а click. Это сужает множество.
2. Почему бы не сделать кнопку неактивной по умолчанию, проверку засунуть в функцию, которая будет возвращать TRUE или строку с ошибкой. В обработчике (который .click) сделать вызов это функции, и в зависимости от возвращаемого результата - выводить ошибку либо разблокировать кнопку.
3. Зачем селектор '#form_enter #btn'? '#btn' будет более чем достаточно.
4. У тебя на полях висят id. Зачем ты делаешь так: '#form_enter input[name=btn]'?
5. Ты уже обратился к полю, зачем еще раз использовать селектор: $('#name_vhod')? Используй this:
$('#name_vhod').click(function(){
if (this.val().length == 0)

Спустя 20 минут, 13 секунд (24.01.2012 - 12:57) panich написал(а):
Спасибо большое за советы-всё учёл и переработал с некоторыми корректировками!
Вот только остался один вопрос:
почему при вводе даже корректного логина (email) тоже выдаёт ошибку:
if(!$('#name_vhod').val().match("/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,6}$/"))

???

Спустя 25 минут, 2 секунды (24.01.2012 - 13:22) neadekvat написал(а):
Сделай так:
var pat = /^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,6}$/; // Кавычек нет
if(!$('#name_vhod').val().match(pat))

Спустя 12 минут, 10 секунд (24.01.2012 - 13:34) panich написал(а):
Спасибо-получилось!!!
Буду дальше кошмарить код)))

Спустя 50 минут, 41 секунда (24.01.2012 - 14:25) panich написал(а):
Вот к чему пришёл:
<form  action="../znakomstva/testreg.php" method="POST" id="form_enter">
<input
id="name_vhod" type="text" name="login" maxlength="21">
<input
id="pass_vhod" type="password" name="pass" maxlength="16">
<input
id="autovhod" type="checkbox" name="autovhod" value="1">
<input
id="btn" type="submit" name="btn" value="">
</form>

$('#btn').click(function(e){	
if ($('#name_vhod').val().length == 0)
{
$("<div id='indTestV'>Не введён ЛОГИН!</div>").insertAfter('#form_enter');
e.preventDefault();
}
else
{
if ($('#name_vhod').val().length > 20)
{
$("<div id='indTestV'>ЛОГИН не должен превышать 20 символов!</div>").insertAfter('#form_enter');
e.preventDefault();
}
else
{
var mail = /^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,6}$/;
if(!$('#name_vhod').val().match(mail))
{
$("<div id='indTestV'>Некорректно введён email-адрес!</div>").insertAfter('#form_enter');
e.preventDefault();
}
else
{
if ($('#pass_vhod').val().length == 0)
{
$("<div id='indTestV'>Не введён ПАРОЛЬ!</div>").insertAfter('#form_enter');
e.preventDefault();
}
else
{
if ($('#pass_vhod').val().length < 3 || $('#pass_vhod').val().length > 15)
{
$("<div id='indTestV'>ПАРОЛЬ должен составлять от 3 до 15 символов!</div>").insertAfter('#form_enter');
e.preventDefault();
}
else
{
var logVal = $('#name_vhod').val();
var passVal = $('#pass_vhod').val();
$.ajax({
type: "POST",
url: "testregJS.php",
data: {'login':logVal, 'pass':passVal},
success: function(html){
$("<div id='indTestV'></div>").insertAfter('#form_enter').html(html);
$('#btn').attr('disabled' , 'disabled');
}
}
);
}
}
}
}
}
}
);
$('#name_vhod, #pass_vhod').focus(function(){
$('#indNameV').fadeOut(1000);
$('#btn').removeAttr('disabled');
});

<?php
$login = mysql_real_escape_string(trim($_POST['$login']));
$login = iconv('UTF-8', 'Windows-1251', $login);
$login = htmlspecialchars($login);
if(get_magic_quotes_gpc())
{
$login = stripslashes($login);
}
$pass = mysql_real_escape_string(trim($_POST['$pass']));
$pass = iconv('UTF-8', 'Windows-1251', $pass);
$pass = htmlspecialchars($pass);
if(get_magic_quotes_gpc())
{
$pass = stripslashes($pass);
}
$sql = "SELECT `pass` FROM `users` WHERE `login`='$login'";
$result = mysql_query($sql, $db)or die("Ошибка в запросе: " . mysql_error());
if ($result = TRUE)
{
$pass = md5($pass);
$pass = strrev($pass);
$pass = $pass."cR9i7Z";
$myrow = mysql_fetch_array($result);
if ($myrow['pass'] != $pass)
{
$html = "<div>Проверте правильность введённых данных!</div>";
echo ($html);
}
}

?>

Всё замечательно работает,только вот аякс что-то касячит!Не выводит сообщение об ошибке...тут подскажете?
П.С.Кстати, скажите сильно ужасно пишу?Как это влияет на работоспособность сайта?

Спустя 23 минуты, 47 секунд (24.01.2012 - 14:49) neadekvat написал(а):
1. Лучше создай в верстке некоторый <div id="error">, заготовленный для ошибки, видимость ему сделай изначально none, а затем вставляй в него ($.text()) текст ошибки и делай видимым.

2. Аякс - это метод (или процесс) передачи данных скриптом в бэкграунд. Все остальное - просто js.

3.
> $_POST['$login']
Уверен в названии индекса (и далее по коду то же самое)?

4.
> $login = iconv('UTF-8', 'Windows-1251', $login);
Пиши сайты на UTF-8.

5.
> get_magic_quotes_gpc()
В жопу. Выключай магические кавычки в .htaccess. Скоро эту директиву вообще удалят (в php 5.4), так что код можно считать устаревшим.

6.
> or die("Ошибка в запросе: " . mysql_error());
Справедливо только для учебных программ. В рабочих проектах так делать нельзя (ошибки логируются, на экран выводится только пространное сообщение о неработоспособности сервиса в данный момент)

7.
> if ($result = TRUE)
В данном случаи ты приравниваешь переменной $result значение TRUE, а условие проверяет, было бы это присвоение успешным или нет. Знак сравнения - ==.

8.
$pass = md5($pass);   
$pass = strrev($pass);
$pass = $pass."cR9i7Z";

Соль обычно у каждого пользователя своя. MD5 берется от пароля с солью.

9.
> mysql_fetch_array
Лучше использовать mysql_fetch_assoc, т.к. *_array возвращает два массива (ассоциативный и числовой).

10.
> echo ($html)
Скобки никто не использует. Они тут не нужны.

Спустя 27 минут, 46 секунд (24.01.2012 - 15:17) panich написал(а):
1. По идее даже если писать как я,то должно работать(и работает,кстати),но переделал,конечно...
3. Перепроверил несколько раз...всё верно...вроде!Или Вы увидели ошибку?
4. Уже много написал, пробовал переделывать на utf-8,но ничего не вышло-теперь так приходится...(((
5.А можете мне пример кода написать и я создам файл(мне так советовали делать на одном из форумов).
6.В этом случае как выводить на экран сообщение об ошибке?И нужно ли это делать?
8.Так правильно:
$pass = strrev($pass);      
$pass = $pass."cR9i7Z";
$pass = md5($pass);


Все эти преобразования проблему не решили-сообщение об ошибке при неправильном вводе пароля(не совпадающем с тем,что в базе привязан к id) не выводится...

Спустя 12 минут, 50 секунд (24.01.2012 - 15:29) neadekvat написал(а):
1. Я не говорил, что неправильно. Я говорил, как лучше.

3. Ок, сравни твой вариант: $_POST['$login'] и мой: $_POST['login']

4. Согласен, работа с Юникодом при том, что php номинально его не поддерживает - это не самая легкая задача для начинающего с ним работать. Но надо, Федя, надо (с)

5.
php_flag magic_quotes_gpc Off
php_flag magic_quotes_runtime Off


6. Хм, каждый по-своему делает. Но надо, да. Пользователь же будет ждать какого-то ответа. Придумай свой интерфейс общения между скриптом и бэкграундом. Т.е., например, php-скрипт возвращает в js-скрипт ответ в формате json с данными типа status: success; msg: "all ok!", или status: fail; msg: "Service temporary unavailable".

8. Я вообще не то имел в виду.

Цитата (panich @ 24.01.2012 - 16:17)
Все эти преобразования проблему не решили-сообщение об ошибке при неправильном вводе пароля(не совпадающем с тем,что в базе привязан к id) не выводится...

Ты проверь, у тебя ответ вот здесь:
success: function(html){
$("<div id='indTestV'></div>").insertAfter('#form_enter').html(html);
$('#btn').attr('disabled' , 'disabled');
}

Вообще приходит или нет. Сделай console.log или alert.

Кроме того, вставка текста происходит как-то странно. Коль есть div id = error, то и делай:
$('#error').html(html);

Спустя 11 минут, 40 секунд (24.01.2012 - 15:41) panich написал(а):
1. Понял-это мысли вслух.
3. Замылились глаза совсем...)))
4. Как буду писать уже хотя бы на Вашем уровне учту,а так 3 дня потратил на форумах,когда менял кодировку и проблему не решил-пришлось потом очень долго всё на исходную возвращать (по неопытности не сделал копию).
5. Нужны знаки # перед этими строчками?Этот файл в корень кидать?
6. Это когда картинки с ошибками выводятся-не как у всех. В самом конце продумаю этот вопрос...

Алертом проверял-вообще ничего не выводит из php...что самое интересно!
Там даже писал вместо всего кода:
$html = "123";
echo $html;

но ничего не выводило....

Спустя 5 минут, 12 секунд (24.01.2012 - 15:46) neadekvat написал(а):
Поставь firebug или воспользуйся любым другим отладчиком, чтобы проследить, что происходит со скриптом, когда он делает запрос.

Спустя 26 минут, 8 секунд (24.01.2012 - 16:12) panich написал(а):
Да ставил,читал в инете как пользоваться,пробовал...как бы стыдно не было признаться,но не разобрался как пользоваться в этом случае...(((

Спустя 5 минут, 12 секунд (24.01.2012 - 16:18) neadekvat написал(а):
Ох, некогда расписывать. Часа через 3-4 из тренажерки вернусь - расскажу, коль никто еще не ответит.

Спустя 13 минут, 56 секунд (24.01.2012 - 16:32) panich написал(а):
О!Я по утрам гоняю...
Хобби или сдавать физо заставляют по роду деятельности (у меня так)?
Мне кажется проблема здесь:
data: {'login':logVal, 'pass':passVal},

не правильно данные передаю...
П.С.По безопасности есть ещё подсказать!?

Спустя 2 часа, 36 минут, 4 секунды (24.01.2012 - 19:08) neadekvat написал(а):
Значицо так, скачиваешь Мозиллу, ставшь на нее Firebug. Включаешь его (на треть экрана снизу появится консоль), перезагружаешь страницу. Затем пробуешь отправить форму, ищешь в консоли вкладку "Сеть" или "Network", там будет показано, что происходило, че спрашивало, какой ответ.

Цитата (panich @ 24.01.2012 - 17:32)
не правильно данные передаю...

Неправильно слитно пишется.
Попробуй изменить на
data: 'login='+ logVal +'&pass='+ passVal,

Хотя, по-моему, и при текущем варианте должно работать.

Свернутый текст
Цитата (panich @ 24.01.2012 - 17:32)
Хобби или сдавать физо заставляют по роду деятельности (у меня так)?

Я бы так сказал - это необходимость. Но при этом получаю удовольствие, конечно же.
Все-таки работа программиста - это сидячая работа. Работа программиста-фрилансера - это еще и безвылозная работа. Так что есть шанс заплыть жиром и заработать геморрой. Меня такие перспективы не радуют :)
Ну, и по традиции: сколько грудь/становая/присед? Или ты другого направления?

Спустя 16 часов, 54 минуты, 56 секунд (25.01.2012 - 12:03) panich написал(а):
Я бег,подтягивание,отжимание,прес и плечи!
Каждый день с 7:50 - 8:20, кроме выходных!
У меня сдача раз в пол года:100 м.,1000 м., и подтягивание.

Понял одно,что лучше всего своим весом качаться-у меня,лично,так больше результата!

Спустя 4 часа, 2 минуты, 33 секунды (25.01.2012 - 16:05) panich написал(а):
Большое спасибо,что потратили столько времени на меня (для нас-новичков, это очень важно)!
Учёл все Ваши корректировки,но решил добить свой корявый код...
Как выяснилось проблема была в том,что php выдавал ошибку-не пропускал mysql_real_escape_string (по чему не знаю) и в php не было подключения к базе данных!!!
Только теперь не отключается у меня блокиратор кнопки,если использовать removeAttr...

Спустя 2 дня, 46 минут, 38 секунд (27.01.2012 - 16:52) panich написал(а):
Чот не сработало как подсказали...:
$('#btn').click(function(e){	
var logVal = $('#name_vhod').val();
var passVal = $('#pass_vhod').val();
$.ajax({
type: "POST",
url: "testregJS.php",
data: {'login':logVal, 'pass':passVal},
success: function(html){
if (html != '')
{
//как вот тут заблочить кнопку!?
$("<div id='indTestV'></div>").insertAfter('#form_enter').html(html);
}
else
{
$('#indTestV').fadeOut(1000);
//а вот тут разблочить!?
}
}

Вопрос в коде!

Спустя 2 часа, 10 минут, 32 секунды (27.01.2012 - 19:02) neadekvat написал(а):
Заблочить элемент с id = "some_buttom":
$('#some_buttom').attr('disabled', 'disabled');

Разблочить:
$('#some_buttom').removeAttr('disabled');

Спустя 2 дня, 14 часов, 13 минут, 13 секунд (30.01.2012 - 09:16) panich написал(а):
Большое спасибо за помощь!
Теперь приступил к валидации на js загружаемых изображений!
Гуглил и там готовых решений нет,а только вопросы на форумах без конкретных ответов,а отдельные товарищи пишут,что реализовать через js не возможно...
Если так,то вопрос:
как с помощью ajax передать переменную в php файл,загружаемую в базу?Нужно,что бы php получил значение $_FILES["filename"]["name"]?А дальше уже там проверить все дела?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.