Напишу блоками что бы тут было более понятно. Код (PHP): //Включаем возможные ошибки в вывод на экран ini_set('display_errors',1); error_reporting(E_ALL); //На внутренних страницах я использую защиту от доступа по этом говорим что с этой страницы будет запрос она своя define ( 'fatalerror', true ); //Подкючаю конфиг в котором записано подключение к базе и ещё пара переменных include_once ('../config.php'); Дальше начинаем обрабатывать данные с капчи и исходя из того верные это данные или нет будем действовать соответственно Код (PHP): //Проверяем есть ли у нас данные с капчи если есть то пишем это в переменную if (isset($_POST['g-recaptcha-response'])) { $grecaptcha = $_POST['g-recaptcha-response']; if ($grecaptcha == '') { unset($grecaptcha);} } //Проверяем как мы получаем постом или чем то другим if($_SERVER["REQUEST_METHOD"] == "POST") { //Теперь самое интересное //Проверяем есть ли у нас данные в переменной ну или по другому существует она или нет //Если есть то шлём GET запрос на гошу if(!empty($grecaptcha)) { //Заносим определяем ip пользоватея $ip = $_SERVER['REMOTE_ADDR']; //ШЛём $homepage = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=ключ&response='.$grecaptcha.'&remoteip='.$ip.''); $res = json_decode($homepage, true); //проверяем reCaptcha совпала или нет if($res['success']) { Дальше у нас начинаеться работ с другими данными так как капча введена правильно Код (PHP): //Проверели капчу она введена по этому начинаем обрабатывать данные дальше // Обрабатываем логин пароль и мыло так уже любимой mysql_escape_string и если есть эти данные то заносим в переменную if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем $login = mysql_escape_string(stripslashes(htmlspecialchars($login))); if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } $password = mysql_escape_string(stripslashes(htmlspecialchars($password))); if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт if (empty($login) or empty($password)or empty($email)) { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев } //проверка е-mail адреса регулярными выражениями на корректность if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { exit ("Неверно введен е-mail!");} //добавляем проверку на длину логина и пароля if (strlen($login) < 3 or strlen($login) > 15) { exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев } if (strlen($password) < 3 or strlen($password) > 15) { exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев } $password = md5($password);//шифруем пароль $password = strrev($password);// для надежности добавим реверс // ТУТ у меня ещё 2 строчки действия с паролем которые я не стал публиковать // Добавляю секретный набор цифорок и буковок и потом делаю с этим ещё что то ..... Финальная стадия пара проверок и данные будем записывать в базу Код (PHP): // проверка на существование пользователя с таким же логином $result = mysql_query("SELECT id FROM user WHERE login='$login'",$db); $myrow = mysql_fetch_array($result); if (!empty($myrow['id'])) { exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); //останавливаем выполнение сценариев } // если такого нет, то сохраняем данные $result2 = mysql_query ("INSERT INTO `user`(`email`, `login`, `password`) VALUES ('$email','$login','$password')",$db); //Проверим успешна ли запись или нет if ($result2=='TRUE') { /// ТУТ ДЕЛАЕМ С ПОЛЬЗОВАТЕЛЕМ ЧЁ НИТЬ ТИПА АКТИВАЦИИ АКАУТА // А дальше всё то если что то не получалась в шагах выше } else { echo 'Зарегистрироваться не получилось';} } else { echo 'Нет капчи'; } } else { echo 'Вы не ввели капчу'; } } else { echo 'Это не пост'; } Добавлено спустя 5 минут 58 секунд: Она работает протестить можно тут http://aqru.ru/register.php
Ух ты, очень напоминает мою первую поделку... Тоже ни черта не посмотришь, пока не зарегистрируешься... xD
Да нет там просто ни чего кроме регистрации и нет ))))) Добавлено спустя 23 секунды: Регистрации и мультиязычности ))))
Где проверено, что вы только с каптчи можете проникнуть суда? Где проверено, что данные были пришли по обработки именно от каптчи? Файлы же оторванные валяются можно что угодно слать и хранить ))))
Дописал вот так if($res['success'] == 1) Таким образом если ответ от гугла 1 то мы продолжаем проверять даныне если что то другое то бреем
разбей свой код на 2 функции, первая это контроллер, а вторая это собственно обработчик всего, в чем смысл, обработчик выглядит примерно так: Код (Text): function exe() { // тут делаем проверку, зашел человек первый раз на форму твоей регистрации или нет if( ... ) // если зашел первый раз { return 'first'; } // далее // тут проверяем, заданы ли данные, если заданы записываем их в переменные для дальнейшей работы if( ... ) // если данные не заданы { return 'empty'; } // далее // проверяем капчу if( ... ) // если капча не верная { return 'failed capcha'; } // и очень много далее действий // вот последнее действие, добавление в бд if(..) // если не удалось добавить в БД { return 'error'; } else // если удалось добавить и все ок { return 'ok'; } } А контроллер собственно вызывает твой обработчик и получает конечный ответ, примерно как то так: Код (Text): function controller() { $reslult = exe(); if($reslult == 'first') { // даем форму регистрации } else if($reslult == 'empty') { // даем форму регистрации и пишем что он заполнил не все поля } else if($reslult == 'failed capcha') { // даем форму и пишем что не верная капча } // и еще много else if // ну и в конце else if($reslult == 'ok') { echo "Вы успешно зарегистрировались"; } } ведь на много лучше чем горбатая гора: Код (Text): if($a) { if ($b) { if ($c) { if($d) { if($e) { // и т.д. } else { } } else { } } else { } } else { } } else { } Добавлено спустя 56 секунд: А еще лучше каждое действие запихнуть в отдельную функцию, а еще лучше все это реализовать в виде класса.
Таким образом мне кажется будет действительно более логично покрайней мере я быстро вьехал что и где делаеться а вот в if if if if вьезжать долго надо...... таксс ладно пойду пробывать реализовывать завтра покажу чё получилось
Большими буквами константы пишутся. что это вообще? садись - два. Читай топик с начала. На колу мочало...
AnteFil, объяснялось же уже. JavaScript-ы никак не могут повредить базе, посему перед добавлением в базу htmlscpecialchars не нужно делать. stripslahes тоже не обязательно, если не нужно, чтоб код одинаково работал при включённых и выключенных магических кавычках (сейчас считается правильным их отключать). В первом случае это тоже не так делается. Ваши unset тоже в топку - просто проверяйте потом !empty, empty отсекает и случай с незаданной переменной, и случай с "пустой" переменной, пустые строки в том числе....
Давай уже запили с учетом рекомендаций. Никто не хочет по три раза одно и то же мусолить. Либо ты усваиваешь материал, либо усё.
Вообщем маленько погуглив нашёл соеденил но что то не работает Пишем функции под каждую переменную Код (PHP): <?php // Проверка имени пользователя function proverkaLogina($str) { // Инициализируем переменную с возможным сообщением об ошибке $error = ''; // Если отсутствует строка с логином, возвращаем сообщение об ошибке if(!$str) { $error = 'Вы не ввели имя пользователя'; return $error; } /** * Проверяем имя пользователя с помощью регулярных выражений * Логин должен быть не короче 4, не длиннее 16 символов * В нем должны быть символы латинского алфавита, цифры, * в нем могут быть символы '_', '-', '.' */ $pattern = '/^[-_.a-z\d]{4,16}$/i'; $result = preg_match($pattern, $str); // Если проверка не прошла, возвращаем сообщение об ошибке if(!$result) { $error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)'; return $error; } // Если же всё нормально, вернем значение true return true; } // Проверка пароля пользователя function proverkaParolya($str) { // Инициализируем переменную с возможным сообщением об ошибке $error = ''; // Если отсутствует строка с логином, возвращаем сообщение об ошибке if(!$str) { $error = 'Вы не ввели пароль'; return $error; } /** * Проверяем пароль пользователя с помощью регулярных выражений * Пароль должен быть не короче 6, не длиннее 16 символов * В нем должны быть символы латинского алфавита, цифры, * в нем могут быть символы '_', '!', '(', ')' */ $pattern = '/^[_!)(.a-z\d]{6,16}$/i'; $result = preg_match($pattern, $str); // Если проверка не прошла, возвращаем сообщение об ошибке if(!$result) { $error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)'; return $error; } // Если же всё нормально, вернем значение true return true; } function proverkaEmail($str) { // Инициализируем переменную с возможным сообщением об ошибке $error = ''; // Если отсутствует строка с почтой, возвращаем сообщение об ошибке if(!$str) { $error = 'Вы забыли ввести почту'; return $error; } /** * Проверяем почту пользователя с помощью регулярных выражений */ $pattern = '/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i'; $result = preg_match($pattern, $str); // Если проверка не прошла, возвращаем сообщение об ошибке if(!$result) { $error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)'; return $error; } // Если же всё нормально, вернем значение true return true; } ?> На странице с регистрацией пишем контроллер Код (PHP): <? // Подключаем файл с функциями require_once('reg.php'); function controller() { $reslult = proverkaLogina($_POST['login']); if($reslult === true) { echo $error; } $reslult = proverkaParolya($_POST['password']); if($reslult === true) { echo $error; } $reslult = proverkaEmail($_POST['email']); if($reslult === true) { echo $error; } } ?> Пытался вызвать ошибку но не получаетсья
чтобы понять почему работает не так как ты задумал используй отладку http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html проверка почты, как тебе igordata подсказал php.net/manual/ru/filter.examples.validation.php php.net/manual/ru/filter.filters.php
Да я там ошибся написал отправку даных на несуществующую страницу исправил Добавлено спустя 33 минуты 56 секунд: Кто то может пояснить строку а точнее её часть Код (PHP): $errors['login'] = checkLogin($fields['login']) === true ? '' : checkLogin($fields['login']); Расскожу предисторию Есть массив для записи ошибок $errors есть функция для проверки loginА так вот как я понимаю смысл строки если после использования функции вернулось не true (не равно true ) checkLogin($fields['login']) === true то мы вернувшуюся ошибку поместили в массив $errors['login'] собственно говоря такую конструкцию вижу в первые Добавлено спустя 24 секунды: Точнее смущает концовка ? '' : checkLogin($fields['login']); Добавлено спустя 39 секунд: а если быть ещё точне то вот это место Код (Text): ? '' : Добавлено спустя 2 минуты 29 секунд: Что за знак вопроса что запустые кавычки и что двоеточие
Вообщем прислушался я ко всем подчёркиваю и VLK и igordata и все кто критиковали за Код (PHP): mysql_escape_string(stripslashes(htmlspecialchars($password))); По этому сейчас внимание 2 версия регистрации пока только зачатки без основных функций и проверок только на примере логина 1/Страничка с функциями Код (PHP): function proverkaLogina($str) { // Инициализируем переменную с возможным сообщением об ошибке $error = ''; // Если отсутствует строка с логином, возвращаем сообщение об ошибке if(!$str) { $error = 'Вы не ввели имя пользователя'; return $error; } /** * Проверяем имя пользователя с помощью регулярных выражений * Логин должен быть не короче 4, не длиннее 16 символов * В нем должны быть символы латинского алфавита, цифры, * в нем могут быть символы '_', '-', '.' */ $pattern = '/^[-_.a-z\d]{4,16}$/i'; $result = preg_match($pattern, $str); // Если проверка не прошла, возвращаем сообщение об ошибке if(!$result) { $error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)'; return $error; } // Если же всё нормально, вернем значение true return true; } 2/Страничка с регой.php Код (PHP): function controller() { $reslult = proverkaLogina($fields['login']); if($reslult === true) { $errors['login'] = $reslult; } } Единственный минус я не могу заставить это работать )))))) Добавлено спустя 1 минуту 7 секунд: Если вернуть к стандарному IF то всё работает if (proverkaLogina($fields['login']) === true) { $errors['login'] = ''; } else { $errors['login'] = proverkaLogina($fields['login']); }