За последние 24 часа нас посетили 18080 программистов и 1700 роботов. Сейчас ищут 1520 программистов ...

Создал регистрацию прошу заценить.

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 16 дек 2014.

  1. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Мне на вопрос ответят? =)
     
  2. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Напишу блоками что бы тут было более понятно.
    Код (PHP):
    1. //Включаем возможные ошибки в вывод на экран
    2. ini_set('display_errors',1);
    3. //На внутренних страницах я использую защиту от доступа по этом говорим что с этой страницы будет запрос она своя
    4. define ( 'fatalerror', true );
    5. //Подкючаю конфиг в котором записано подключение к базе и ещё пара переменных
    6. include_once ('../config.php'); 
    Дальше начинаем обрабатывать данные с капчи и исходя из того верные это данные или нет будем действовать соответственно
    Код (PHP):
    1. //Проверяем есть ли у нас  данные с капчи если есть то пишем это в переменную 
    2. if (isset($_POST['g-recaptcha-response'])) { $grecaptcha = $_POST['g-recaptcha-response']; if ($grecaptcha == '') { unset($grecaptcha);} } 
    3. //Проверяем как мы получаем постом или чем то другим
    4. if($_SERVER["REQUEST_METHOD"] == "POST")
    5. {
    6. //Теперь самое интересное
    7. //Проверяем есть ли у нас данные в переменной ну или по другому существует она или нет
    8. //Если есть то шлём GET запрос на гошу
    9. if(!empty($grecaptcha))
    10. {
    11. //Заносим определяем ip пользоватея
    12. $ip = $_SERVER['REMOTE_ADDR'];
    13. //ШЛём
    14. $homepage = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=ключ&response='.$grecaptcha.'&remoteip='.$ip.'');
    15. $res = json_decode($homepage, true);
    16. //проверяем reCaptcha совпала или нет
    17. if($res['success'])
    18. {
    19.  
    Дальше у нас начинаеться работ с другими данными так как капча введена правильно
    Код (PHP):
    1. //Проверели капчу она введена по этому начинаем обрабатывать данные дальше
    2. // Обрабатываем логин пароль и мыло так уже любимой mysql_escape_string и если есть эти данные то заносим в переменную
    3. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем 
    4. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    5. if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную
    6. //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
    7. if (empty($login) or empty($password)or empty($email))
    8. {
    9. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
    10. }
    11. //проверка е-mail адреса регулярными выражениями на корректность
    12. if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
    13. { exit ("Неверно введен е-mail!");}
    14. //добавляем проверку на длину логина и пароля
    15. if (strlen($login) < 3 or strlen($login) > 15) {
    16. exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
    17. }
    18. if (strlen($password) < 3 or strlen($password) > 15) {
    19. exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
    20. }
    21.  
    22. $password = md5($password);//шифруем пароль
    23. $password = strrev($password);// для надежности добавим реверс
    24. // ТУТ у меня ещё 2 строчки действия с паролем которые я не стал публиковать 
    25. // Добавляю секретный набор цифорок и буковок и потом делаю с этим ещё что то .....
    26.  
    Финальная стадия пара проверок и данные будем записывать в базу
    Код (PHP):
    1. // проверка на существование пользователя с таким же логином
    2. $result = mysql_query("SELECT id FROM user WHERE login='$login'",$db);
    3. $myrow = mysql_fetch_array($result);
    4. if (!empty($myrow['id'])) {
    5. exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); //останавливаем выполнение сценариев
    6. }
    7. // если такого нет, то сохраняем данные
    8. $result2 = mysql_query ("INSERT INTO `user`(`email`, `login`, `password`) VALUES ('$email','$login','$password')",$db);
    9. //Проверим успешна ли запись или нет 
    10. if ($result2=='TRUE')
    11. {
    12. /// ТУТ ДЕЛАЕМ С ПОЛЬЗОВАТЕЛЕМ ЧЁ НИТЬ ТИПА АКТИВАЦИИ АКАУТА
    13. // А дальше всё то если что то не получалась в шагах выше
    14. } else { echo 'Зарегистрироваться не получилось';}
    15. }
    16. else
    17. {
    18. echo 'Нет капчи';
    19. }
    20. } else { echo 'Вы не ввели капчу'; }
    21. } else { echo 'Это не пост'; } 
    Добавлено спустя 5 минут 58 секунд:
    Она работает протестить можно тут http://aqru.ru/register.php
     
  3. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Ух ты, очень напоминает мою первую поделку... Тоже ни черта не посмотришь, пока не зарегистрируешься... xD
     
  4. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Да нет там просто ни чего кроме регистрации и нет )))))

    Добавлено спустя 23 секунды:
    Регистрации и мультиязычности ))))
     
  5. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Ааа... Вононочо! =)
     
  6. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Где проверено, что вы только с каптчи можете проникнуть суда?
    Где проверено, что данные были пришли по обработки именно от каптчи?
    Файлы же оторванные валяются можно что угодно слать и хранить ))))
     
  7. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Дописал вот так
    if($res['success'] == 1)
    Таким образом если ответ от гугла 1 то мы продолжаем проверять даныне если что то другое то бреем
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    разбей свой код на 2 функции, первая это контроллер, а вторая это собственно обработчик всего, в чем смысл, обработчик выглядит примерно так:
    Код (Text):
    1. function exe()
    2. {
    3.     // тут делаем проверку, зашел человек первый раз на форму твоей регистрации или нет
    4.     if( ... ) // если зашел первый раз
    5.     {
    6.         return 'first';
    7.     }    
    8.    
    9.     // далее
    10.     // тут проверяем, заданы ли данные, если заданы записываем их в переменные для дальнейшей работы
    11.     if( ... ) // если данные не заданы
    12.     {
    13.         return 'empty';
    14.     }
    15.    
    16.     // далее
    17.     // проверяем капчу
    18.     if( ... ) // если капча не верная
    19.     {
    20.         return 'failed capcha';
    21.     }
    22.    
    23.     // и очень много далее действий
    24.    
    25.     // вот последнее действие, добавление в бд
    26.     if(..) // если не удалось добавить в БД
    27.     {
    28.         return 'error';
    29.     }
    30.     else // если удалось добавить и все ок
    31.     {
    32.         return 'ok';
    33.     }
    34. }
    А контроллер собственно вызывает твой обработчик и получает конечный ответ, примерно как то так:
    Код (Text):
    1. function controller()
    2. {
    3.     $reslult = exe();
    4.    
    5.     if($reslult == 'first')
    6.     {
    7.         // даем форму регистрации
    8.     }
    9.     else if($reslult == 'empty')
    10.     {
    11.         // даем форму регистрации и пишем что он заполнил не все поля
    12.     }
    13.     else if($reslult == 'failed capcha')
    14.     {
    15.         // даем форму и пишем что не верная капча
    16.     }
    17.    
    18.     // и еще много else if
    19.     // ну и в конце
    20.     else if($reslult == 'ok')
    21.     {
    22.         echo "Вы успешно зарегистрировались";
    23.     }
    24.    
    25. }
    ведь на много лучше чем горбатая гора:
    Код (Text):
    1. if($a)
    2. {
    3.     if ($b)
    4.     {
    5.         if ($c)
    6.         {
    7.             if($d)
    8.             {
    9.                 if($e)
    10.                 {
    11.                     // и т.д.
    12.                 }
    13.                 else
    14.                 {
    15.                    
    16.                 }
    17.             }
    18.             else
    19.             {
    20.                
    21.             }
    22.         }
    23.         else
    24.         {
    25.            
    26.         }
    27.     }
    28.     else
    29.     {
    30.        
    31.     }
    32. }
    33. else
    34. {
    35.    
    36. }
    Добавлено спустя 56 секунд:
    А еще лучше каждое действие запихнуть в отдельную функцию, а еще лучше все это реализовать в виде класса.
     
  9. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    что тут? В:
    config.php
     
  10. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Таким образом мне кажется будет действительно более логично покрайней мере я быстро вьехал что и где делаеться а вот в if if if if вьезжать долго надо...... таксс ладно пойду пробывать реализовывать завтра покажу чё получилось
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Большими буквами константы пишутся.
    что это вообще?

    садись - два. Читай топик с начала. На колу мочало...
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    AnteFil, объяснялось же уже. JavaScript-ы никак не могут повредить базе, посему перед добавлением в базу htmlscpecialchars не нужно делать. stripslahes тоже не обязательно, если не нужно, чтоб код одинаково работал при включённых и выключенных магических кавычках (сейчас считается правильным их отключать). В первом случае это тоже не так делается. Ваши unset тоже в топку - просто проверяйте потом !empty, empty отсекает и случай с незаданной переменной, и случай с "пустой" переменной, пустые строки в том числе....
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Хорошо, зайдем с другой стороны, какой IDE пользуешься?
     
  14. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Не знаю что это
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Давай уже запили с учетом рекомендаций. Никто не хочет по три раза одно и то же мусолить. Либо ты усваиваешь материал, либо усё.
     
  16. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Вообщем маленько погуглив нашёл соеденил но что то не работает
    Пишем функции под каждую переменную
    Код (PHP):
    1. <?php
    2. // Проверка имени пользователя
    3. function proverkaLogina($str) {
    4.     // Инициализируем переменную с возможным сообщением об ошибке
    5.     $error = '';
    6.     // Если отсутствует строка с логином, возвращаем сообщение об ошибке
    7.     if(!$str) {
    8.         $error = 'Вы не ввели имя пользователя';
    9.         return $error;
    10.     }
    11.     /**
    12.       * Проверяем имя пользователя с помощью регулярных выражений
    13.       * Логин должен быть не короче 4, не длиннее 16 символов
    14.       * В нем должны быть символы латинского алфавита, цифры, 
    15.       * в нем могут быть символы '_', '-', '.'
    16.       */
    17.     $pattern = '/^[-_.a-z\d]{4,16}$/i';    
    18.     $result = preg_match($pattern, $str);
    19.     
    20.     // Если проверка не прошла, возвращаем сообщение об ошибке
    21.     if(!$result) {
    22.         $error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)';
    23.         return $error;
    24.     }
    25.     // Если же всё нормально, вернем значение true
    26.     return true;
    27. }
    28.  
    29. // Проверка пароля пользователя
    30. function proverkaParolya($str) {
    31.     // Инициализируем переменную с возможным сообщением об ошибке
    32.     $error = '';
    33.     // Если отсутствует строка с логином, возвращаем сообщение об ошибке
    34.     if(!$str) {
    35.         $error = 'Вы не ввели пароль';
    36.         return $error;
    37.     }
    38.     /**
    39.       * Проверяем пароль пользователя с помощью регулярных выражений
    40.       * Пароль должен быть не короче 6, не длиннее 16 символов
    41.       * В нем должны быть символы латинского алфавита, цифры, 
    42.       * в нем могут быть символы '_', '!', '(', ')'
    43.       */
    44.     $pattern = '/^[_!)(.a-z\d]{6,16}$/i';    
    45.     $result = preg_match($pattern, $str);
    46.     // Если проверка не прошла, возвращаем сообщение об ошибке
    47.     if(!$result) {
    48.         $error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)';
    49.         return $error;
    50.     }
    51.     // Если же всё нормально, вернем значение true
    52.     return true;
    53. }
    54. function proverkaEmail($str) {
    55.     // Инициализируем переменную с возможным сообщением об ошибке
    56.     $error = '';
    57.     // Если отсутствует строка с почтой, возвращаем сообщение об ошибке
    58.     if(!$str) {
    59.         $error = 'Вы забыли ввести почту';
    60.         return $error;
    61.     }
    62.     /**
    63.       * Проверяем почту пользователя с помощью регулярных выражений
    64.       */
    65.     $pattern = '/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i';    
    66.     $result = preg_match($pattern, $str);
    67.     // Если проверка не прошла, возвращаем сообщение об ошибке
    68.     if(!$result) {
    69.         $error = 'Недопустимые символы в пароле пользователя или пароль слишком короткий (длинный)';
    70.         return $error;
    71.     }
    72.     // Если же всё нормально, вернем значение true
    73.     return true;
    74. }
    75.  
    76. ?>
    На странице с регистрацией пишем контроллер
    Код (PHP):
    1. <?
    2.   
    3. // Подключаем файл с функциями
    4. require_once('reg.php');
    5.  
    6. function controller()
    7. {
    8.     $reslult = proverkaLogina($_POST['login']);
    9.     if($reslult === true)
    10.     {
    11.         echo $error;
    12.     }
    13.     $reslult = proverkaParolya($_POST['password']);
    14.     if($reslult === true)
    15.     {
    16.         echo $error;
    17.     }
    18.     $reslult = proverkaEmail($_POST['email']);
    19.     if($reslult === true)
    20.     {
    21.         echo $error;
    22.     }   
    23. }
    24.  
    25. ?>
    Пытался вызвать ошибку но не получаетсья
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Знаешь в пхп есть родной валидатор. Про него мало кто слышал, но он используется во фреймворках.
     
  18. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    При выполнении кода почему то редиректит на 404.php
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ладно. Прощай.
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    чтобы понять почему работает не так как ты задумал используй отладку
    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
     
  21. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Да я там ошибся написал отправку даных на несуществующую страницу исправил

    Добавлено спустя 33 минуты 56 секунд:
    Кто то может пояснить строку а точнее её часть
    Код (PHP):
    1. $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):
    1. ? '' :
    Добавлено спустя 2 минуты 29 секунд:
    Что за знак вопроса что запустые кавычки и что двоеточие
     
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Тернарный оператор
     
  23. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Вообщем прислушался я ко всем подчёркиваю и VLK и igordata и все кто критиковали за
    Код (PHP):
    По этому сейчас внимание 2 версия регистрации пока только зачатки без основных функций и проверок только на примере логина
    1/Страничка с функциями
    Код (PHP):
    1. function proverkaLogina($str) {
    2.     // Инициализируем переменную с возможным сообщением об ошибке
    3.     $error = '';
    4.     // Если отсутствует строка с логином, возвращаем сообщение об ошибке
    5.     if(!$str) {
    6.         $error = 'Вы не ввели имя пользователя';
    7.         return $error;
    8.     }
    9.     /**
    10.       * Проверяем имя пользователя с помощью регулярных выражений
    11.       * Логин должен быть не короче 4, не длиннее 16 символов
    12.       * В нем должны быть символы латинского алфавита, цифры, 
    13.       * в нем могут быть символы '_', '-', '.'
    14.       */
    15.     $pattern = '/^[-_.a-z\d]{4,16}$/i';    
    16.     $result = preg_match($pattern, $str);
    17.     
    18.     // Если проверка не прошла, возвращаем сообщение об ошибке
    19.     if(!$result) {
    20.         $error = 'Недопустимые символы в имени пользователя или имя пользователя слишком короткое (длинное)';
    21.         return $error;
    22.     }
    23.     // Если же всё нормально, вернем значение true
    24.     return true;
    25. }
    2/Страничка с регой.php
    Код (PHP):
    1. function controller()
    2. {
    3.     $reslult = proverkaLogina($fields['login']);
    4.    
    5.     if($reslult === true)
    6.     {
    7.        $errors['login'] = $reslult;
    8.     }
    9. }
    Единственный минус я не могу заставить это работать ))))))

    Добавлено спустя 1 минуту 7 секунд:
    Если вернуть к стандарному IF то всё работает
    if (proverkaLogina($fields['login']) === true) {
    $errors['login'] = '';
    } else {
    $errors['login'] = proverkaLogina($fields['login']);
    }
     
  24. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    и сколько ты еще будешь игнорировать основы программирования?
     
  25. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Что опять не так ? По поводу function controller() её же где-то надо как то вызвать