18.04.2015, 10:54
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
Как проверить e-mail?
Вопрос к специалистам от новичка.
При заполнении формы, после ввода e-mail, проверяется существование такого e-mail в базе данных пользователей.
var prov_email = email_adv;
for (i = 0; i < baza_email.length; i++)
{
if (prov_email == baza_email[i])
{
alert('Такой E-mail уже есть!!!')
break;
}
База e-mail берется из базы данных при открытии формы.
Все работает.
Но вся база получается в открытом доступе при просмотре HTML страницы формы.
Можно-ли как-то решить эту проблему, т.е. проверить e-mail на стороне пользователя, но при этом скрыть базу всех e-mail?
Или после ввода e-mail по событию проверить e-mail на сервере, получить ответ, а потом продолжить заполнение формы?
Если можно сделать это, то как?
P.S.Понимаю, что нужно проверять e-mail на стороне сервера при отправки заполненной всей формы на сервер, но всё-же...
|
|
18.04.2015, 12:02
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Проверять только на сервере, а чтобы не перегружать страницу из-за этой, использовать Ajax.
|
|
18.04.2015, 12:07
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
Не могли-бы объяснить поподробней.
|
|
18.04.2015, 12:16
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Использовать Ajax (асинхронный запрос к серверу) или, если используется jQuery, то его один из методов асинхронного запроса, который отправляет на север введенный адрес.
Запрос можно производить или по потере фокуса полем, или при отправлении формы.
На стороне сервера делаем запрос:
'SELECT 1 FROM table WHERE mail="' . mysql_real_escape_string($_POST['mail']) . '"'
//если используется mysqli или PDO, то и запрос короче будет
и возвращаем число полученных рядов.
Если такого адреса нет, значит клиенту будет возвращен 0, иначе 1.
Останется принять решение - вывод сообщения или принять форму.
Или нужен конкретный пример? Тогда показывайте свой код, указывайте используете ли jQuery.
Последний раз редактировалось laimas, 18.04.2015 в 12:18.
|
|
18.04.2015, 12:37
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
1. jQuery используется.
2. Запрос к базе
$this->vse_email = array();
$db_query="select users.email_user
from ".DB_PREF."users users ";
list($kolvo,$this->vse_email)=obr_db_query_select_assoc($db_query) ;
$mas_perem["vse_email"]=$this->vse_email;
$avax=array();
foreach($mas_perem["vse_email"] as $row) {
$avax[]=$row['email_user'];
}
$baza_email = json_encode($avax);
$mas_perem["baza_email"]=$baza_email;
//15.03.15
}
|
|
18.04.2015, 12:49
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
$this->vse_email = array();
$db_query="select users.email_user
from ".DB_PREF."users users ";
list($kolvo,$this->vse_email)=obr_db_query_select_assoc($db_query) ;
$mas_perem["vse_email"]=$this->vse_email;
$avax=array();
foreach($mas_perem["vse_email"] as $row) {
$avax[]=$row['email_user'];
}
$baza_email = json_encode($avax);
$mas_perem["baza_email"]=$baza_email;
Все это выбрасывать. Нельзя на клиента отправлять адрес даже одного пользователя, а вы вываливаете все. Ну прямо подарочек спамерам )
Вам не нужен адрес как таковой, важно только знать есть ли он уже в базе или нет. Поэтому простой запрос как я показал, а что там будет запрашиваться, цифра 1 или символ "Y", роли не играет, все равно не используется. Если такой адрес уже есть, значит mysql_num_rows($sql) вернет количество рядов равное 1, если конечно вы не допускаете дубликатов, иначе 0.
Но почему вас только эта сторона вопроса интересует? А корректно ли введен адрес это не проверяется? А другие поля тоже не имеют проверки?
Если и другие поля имеют условия, а адрес это не только наличие, но и корректность ввода, а учитывая, что сервер обязан все проверять, то пишите сразу диалог клиент-сервер по приему и проверки формы. И если диалог асинхронный, то забейте на проверку на клиенте, в этом случае можно проверять только не сервере, а клиенту возвращать результат.
Код, имелся ввиду html-код формы, по какому событию проверка, кнопкой ли, или как было сказано выше...
|
|
18.04.2015, 13:05
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
Проверка всех полей формы проверяется на сервере при отправки формы, поле e-mail тоже. До этого форма проверяется JS, e-mail тоже проверяется на корректность JS. Просто до отправки формы хотелось проверить E-mail на наличие его в базе, и сообщить пользователю, что такой E-mail уже есть, и либо он забыл авторизоваться или он хочет зарегистрироваться заново, и решил, стоит-ли форму заполнять дальше или сбросить и авторизоваться.
Но куда копать я понял.
где-то тут:
jQuery:
$.ajax()
$.post()
$.get()
Я просто не знаю ajax, поэтому и попросил помощи.
|
|
18.04.2015, 13:07
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
Вы правильно написали, зачем вытаскивать всю базу, когда можно проверить по базе на соответствия поля.
|
|
18.04.2015, 13:23
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Еще раз:
Ajax, это способ обмена данными с сервером без перезагрузки страницы, а методы $.ajax(), $.post(), $.get(), это методы (не все) jQuery для такого обмена. Можно использовать любой.
Но если сервер проверяет, а страница при этом не перегружается, то зачем нужна еще проверка и на JS? Я ведь могу вам и не с вашей страницы отправить форму и можете не надеяться на реферер, его можно и подделать, а значит хотите вы или нет, сервер не только должен проверять, но и отправлять ошибки, тоже наличие адреса в базе, уже ошибка.
То есть фактически вы проделываете двойную работу. Если бы не использование Ajax, тогда да, на клиенте будет нужна проверка, иначе...
Хотя это не важно, важно, что сервер должен возвращать результат проверки - или все ОК, значит закрываем форму (данные уже на сервере) или переход (выполнять его должен клиент, не сервер), или же ошибки и их отображение.
То есть надо по всем полям сразу, иначе ведь будет тоже что и без Ajax, только теперь мыло проверили и ОК, а остальное может быть и не ОК, и что тогда?
А использовать методы указанные, ну для начала простой взять, к примеру $.post, так это просто:
$('body').on('submit', 'селектор формы', function() {
$.post(url, $(this).serialize(), function(data) {
//data содержит ответ сервера
}, тип возращенных данных);
return false;
})
В общем отправить запрос не сложно.
PS.
$('body').on('submit', 'селектор формы' - это в случае, если форма добавляется на страницу динамически, иначе проще:
$('селектор формы').submit(function() {
//ajax запрос
}
Последний раз редактировалось laimas, 18.04.2015 в 13:28.
|
|
18.04.2015, 13:56
|
Аспирант
|
|
Регистрация: 10.01.2015
Сообщений: 54
|
|
Я просто не силен в языках. Поэтому сделал проверку полей JS с ответом. Потом разобрался с проверкой на PHP, думал не получится с ответом при проверке на PHP, но получилось. Поэтому проверка на JS отпадает. Правда я оставил проверку на JS каждого поля по мере его заполнения( по onChange) если неверно заполнил одно поле, то пользователь сразу исправляет его, а потом идет уже проверка всех полей на PHP с ответом.
Поэтому и возник вопрос проверки e-mail на наличие в базе.
Возможно всё это и неверно.
Но где искать ответ я понял, спасибо за помощь, буду разбираться с Ajax.
|
|
|
|