Защищенная Авторизация и Регистрация на PHP + MySQL через PDO

Защищенная Авторизация и Регистрация на PHP + MySQL через PDO
PHP скрипты 1    99094 +3

В этой статье Вы найдете скрипт на языке программирования PHP, который позволяет пользователю зарегистрироваться и авторизоваться на сайте. Скрипт на 100% защищает от SQL-инжекций, поскольку использует PDO (система подготовленных запросов) и библиотеку RedBeanPHP, которая реализует ORM. Использовать RedBeanPHP мы будем только, чтобы присоединиться к базе данных и легко ей манипулировать, не используя стандартные команды в PHP, такие как mysql_connect и подобные, потому что они устаревшие и не очень эффективные.

Скрипт использует сессии ($_SESSION) и позволяет узнать авторизован сейчас человек или нет. Также в скрипте предусмотрена капча с рандомными вопросами, которая защищает сайт от надоедливого спама.

Скрипт состоит из следующих файлов:

  • index.php - содержит 2 ссылки (на форму авторизации и регистрации);
  • rb.php - ORM-библиотека RedBeanPHP;
  • db.php - подключение к базе данных;
  • login.php - обработчик авторизации пользователя и форма авторизации;
  • signup.php - обработчик регистрации пользователя и форма регистрации;
  • logout.php - выход из сессии.

Как подключить скрипт?

Скачайте готовый скрипт и перенесите все файлы на свой хостинг или локальный сервер (Denwer, OpenServer). Для работы скрипта Вам потребуется версия PHP не ниже 5.6. Далее необходимо создать базу данных и подсоединиться к ней. Для этого потребуется поменять значения в файле db.php. Если с этим возникнут трудности, то Вы можете задавать свои вопросы в комментариях под статьей.


Форма авторизации

В файле login.php находится обработчик и сама форма авторизации, которая состоит из двух полей (логин, пароль). Значок @ (собачка) перед переменными служит в PHP для отключения ошибки, если такая возникнет.

Логин
Пароль

PHP обработчик формы авторизации пользователя

Все переменные, которые возвращаются по методу POST - мы присваиваем переменной $data.

	$data = $_POST;
	if ( isset($data['do_login']) )
	{
		$user = R::findOne('users', 'login = ?', array($data['login']));
		if ( $user )
		{
			//логин существует
			if ( password_verify($data['password'], $user->password) )
			{
				//если пароль совпадает, то нужно авторизовать пользователя
				$_SESSION['logged_user'] = $user;
				echo '
Вы авторизованы!
Можете перейти на главную страницу.

'; }else { $errors[] = 'Неверно введен пароль!'; } }else { $errors[] = 'Пользователь с таким логином не найден!'; } if ( ! empty($errors) ) { //выводим ошибки авторизации echo '
' .array_shift($errors). '

'; } }

Форма регистрации

В файле signup.php находится обработчик и сама форма регистрации. Для таких форм рекомендуется использовать метод запроса POST, при котором веб-сервер принимает данные, заключённые в тело сообщения, для хранения.

Ваш логин
Ваш Email
Ваш пароль
Повторите пароль


PHP обработчик формы регистрации пользователя

	$data = $_POST;

	function captcha_show(){
		$questions = array(
			1 => 'Столица России',
			2 => 'Столица США',
			3 => '2 + 3',
			4 => '15 + 14',
			5 => '45 - 10',
			6 => '33 - 3'
		);
		$num = mt_rand( 1, count($questions) );
		$_SESSION['captcha'] = $num;
		echo $questions[$num];
	}

	//если кликнули на button
	if ( isset($data['do_signup']) )
	{
    // проверка формы на пустоту полей
		$errors = array();
		if ( trim($data['login']) == '' )
		{
			$errors[] = 'Введите логин';
		}

		if ( trim($data['email']) == '' )
		{
			$errors[] = 'Введите Email';
		}

		if ( $data['password'] == '' )
		{
			$errors[] = 'Введите пароль';
		}

		if ( $data['password_2'] != $data['password'] )
		{
			$errors[] = 'Повторный пароль введен не верно!';
		}

		//проверка на существование одинакового логина
		if ( R::count('users', "login = ?", array($data['login'])) > 0)
		{
			$errors[] = 'Пользователь с таким логином уже существует!';
		}
    
    //проверка на существование одинакового email
		if ( R::count('users', "email = ?", array($data['email'])) > 0)
		{
			$errors[] = 'Пользователь с таким Email уже существует!';
		}

		//проверка капчи
		$answers = array(
			1 => 'москва',
			2 => 'вашингтон',
			3 => '5',
			4 => '29',
			5 => '35',
			6 => '30'
		);
		if ( $_SESSION['captcha'] != array_search( mb_strtolower($_POST['captcha']), $answers ) )
		{
			$errors[] = 'Ответ на вопрос указан не верно!';
		}


		if ( empty($errors) )
		{
			//ошибок нет, теперь регистрируем
			$user = R::dispense('users');
			$user->login = $data['login'];
			$user->email = $data['email'];
			$user->password = password_hash($data['password'], PASSWORD_DEFAULT); 
			//пароль нельзя хранить в открытом виде, 
			//мы его шифруем при помощи функции password_hash для php > 5.6
			
			R::store($user);
			echo '
Вы успешно зарегистрированы!

'; }else { echo '
' .array_shift($errors). '

'; } }

Смотреть видеоурок

Статья была написана на основе видеоурока Хауди Хо, который Вы можете посмотреть ниже. Скрипт из видео был немного доработан (добавлена капча function captcha_show).


Поделиться с друзьями


Похожие статьи:

Парсер на PHP с записью контента в БД
Разрабатываем exploit
Парсер курсов валют на PHP
Удобная форма обратной связи без перезагрузки страницы
Счетчик онлайн посетителей на сайте
Пишем на SQL без SQL: основы по RedBean PHP
Универсальный и очень простой PHP парсер

Комментарии ()

  1. Роман Дубровский 11 февраля 2018, 19:03 # +1
    Простите, не очень понял. Какой код должен быть на странице с закрытым контентом?

    Уже понял. Содержание страницы надо расположить между <?php if… и <?php else: ?>
    1. Алексей Власов 24 мая 2018, 23:48 # 0
      Спасибо за комментарий! Всё верно.
    2. Виталий Алехин 29 марта 2018, 19:38 # +1
      1)<strong><!--?php captcha_show(); ?--></strong> <input type="text" name="captcha"> — ошибка в описании статьи: комментарии здесь не нужны
      2)$errors[] = 'Ответ на вопрос указан не верно!'; var_dump($answers); — опять же непонятно для чего тут в статье и в файле нужен
      var_dump($answers);
      С уважением,
      Виталий
      1. Алексей Власов 24 мая 2018, 23:54 # 0
        Спасибо за помощь!

        var_dump действительно не нужен, забыл удалить его после тестов. В архиве и статье исправил.

        «ошибка в описании статьи: комментарии здесь не нужны» — комментарии создал плагин, убрать их статьи не получится, так как там симбиоз html и php кода. Люди, которые это читают, — смело качайте архив, там нет ничего лишнего. Всё исправно работает!
        1. Ярик Ищик 18 мая 2019, 15:45 # 0
          там при успешной регистрации dreen вместо green, я щас говорю о цвете самого текста, мелочь, но..)
      2. Victor Sproot 06 июля 2018, 21:51 # 0
        скрипт хороший спасибо
        вот только как защитить его от перебора паролей, а самое главное как сделать чтоб на страницу которую входишь после авторизации можно бы было попасть только авторизованным а то иначе если ввесли в строке адрес то можно без труда туда попасть
        1. Victor Sproot 06 июля 2018, 22:39 # 0
          ну с тем чтоб не открывалось для неавторизованных я разобрался тем что впихнул всю страницу в if
          а вот как с перебором бороться?
          1. Алексей Власов 12 июля 2018, 10:33 # 0
            Спасибо за комментарий! Можно писать в сессию число попыток и если перевалит за какое-то число, то выводить рекапчу гугловскую, например или просто блокировать.
          2. Kill Mania 14 сентября 2018, 10:29 # 0
            Здравствуйте.

            Воспользовался Вашим решением. Все работает отлично. Спасибо большое!

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

            Подскажите, пожалуйста, если не сложно.

            Спасибо.
            1. Алексей Власов 14 сентября 2018, 13:06 # 0
              Спасибо за комментарий!

              Содержание страницы надо расположить между конструкциями <?php if ( isset ($_SESSION['logged_user']) ): и <?php else: ?>. Это уже реализовано в файле index.php, можно там подглядеть. Если человек не авторизован, то увидит надпись «Вы не авторизованы». А если он авторизовался, то увидит надпись «Авторизован!». По аналогии можно поступить со своим контентом.

              А чтобы определить авторизован человек или нет, — надо воспользоваться сессиями. session_start(); — стартует новую сессию, либо возобновляет существующую. В файле db.php это также реализовано.

              Надеюсь, что помог, а не ещё больше запутал.
              1. Kill Mania 15 сентября 2018, 08:58 # 0
                Спасибо большое, Алексей!)

                Нет, вроде бы Вы меня не запутали. Но… Когда я экспериментирую со страничкой index.php, то все получается отлично. Тестовый текст отображается только тогда, когда я авторизован.

                Когда же я пытаюсь применить сие счастье на рабочей странице, то что-то идет не так. Вверху и внизу страницы одновременно отображается следующее:

                Авторизован! Привет, login; ?>! Выйтии

                Вы не авторизованы Авторизация РегистрацияУверен, что где-то допускаю глупую ошибку, скорее всего связанную с недостаточным пониманием логики работы кода. Пишу так:

                <?php require 'db.php'; ?> <?php if ( isset ($_SESSION['logged_user']) ) : ?> Авторизован! Привет, <?php echo $_SESSION['logged_user']->login; ?>! <a href="logout.php">Выйти</a> <!DOCTYPE html> <html lang="en"> <head> </head> <body> И тут внутренности страницыВнизу страницы:

                </body> </html> <?php else : ?> Вы не авторизованы <a href="/login.php">Авторизация</a> <a href="/signup.php">Регистрация</a> <?php endif; ?>Вроде бы все так делаю на мой взгляд…
                1. Kill Mania 15 сентября 2018, 09:16 # 0
                  В общем, после некоторых изучений сломал себе мозг полностью… Две одинаковых страницы: index.html и index.php На index.php все работает, на index.html не работает Не понимаю…
                  1. Kill Mania 15 сентября 2018, 09:33 # 0
                    Переименовал свою страницу index.html в index.php И даже все заработало. Но появилась ошибка: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\OSPanel\domains\localhost\index.php:1) in C:\OSPanel\domains\localhost\db.php on line 10Если посмотреть на db.php, то там это session_start();, а в index.php это <?php require 'db.php'; ?>
                    1. Kill Mania 15 сентября 2018, 09:45 # 0
                      И тут победил — проблема была в кодировке. Поставил без BOM и все заработало! Уффф… как оно все сложно, мозг кипел с самого утра)))

                      Алексей, спасибо Вам огромнейшее еще раз! Вы заставили мой мозг поработать)) И, конечно же, помогли в решении моей задачи. Особенно фраза «Это уже реализовано в файле index.php, можно там подглядеть» для меня стала решающей, так как начал с ней экспериментировать и все пошло в нужном направлении.

                      От всей души СПАСИБО!!!
                      1. Алексей Власов 15 сентября 2018, 12:01 # +1
                        Очень здорово, что всё получилось! Я рад, что смог помочь :) Спасибо за вопросы. Возможно, они ещё кого-то выручат.
            2. Дионис Дуров 14 сентября 2018, 17:33 # 0
              Добрый день! Вот появился вопрос. Данные для бд ввёл. А как нужную таблицу обозначить?
              P.S. Я вообще тёмный лес в этом вопросе.
              1. Дионис Дуров 14 сентября 2018, 17:49 # 0
                И можно ли просто файл импорта таблицы чистый ещё?
              2. Алексей Власов 14 сентября 2018, 20:25 # 0
                Спасибо за комментарий!

                В данном скрипте для работы с базой данных используется библиотека RedBean PHP. По этой ссылке можно подробнее про неё почитать и посмотреть примеры.

                Например, тут $user = R::dispense('users'); используется метод dispense, в который передается название таблицы users.
                1. Дионис Дуров 14 сентября 2018, 21:05 # 0
                  Конечно, спасибо за ответ, но какая структура таблицы нужна?
                  1. Алексей Власов 14 сентября 2018, 21:55 # 0
                    Можно таблицу и структуру вообще не создавать. Достаточно придумать для таблицы имя, а RedBean PHP уже сам создаст таблицу в БД с правильной структурой
                    1. Алексей Власов 14 сентября 2018, 22:09 # 0
                      Вот тут можно скачать дамп базы, там уже есть структура готовая
                    2. Дионис Дуров 14 сентября 2018, 21:12 # 0
                      т.е. код в файле db.php такой?
                      <?php
                      require 'libs/rb.php';
                      R::setup( 'mysql:host=127.0.0.1;dbname=homework54','myuser, 'mypass' );
                      $user = R::dispense('users');
                      if ( !R::testconnection() )
                      {
                      exit ('Нет соединения с базой данных');
                      }

                      session_start();
                      ?>
                      с учётом, того, что название таблицы: «users»
                      1. Алексей Власов 14 сентября 2018, 22:00 # 0
                        db.php трогать не нужно, там просто подключение к БД. Именно к таблице обращаются, когда нужно сделать конкретное действие, например, записать туда данные или изменить их
                        1. Дионис Дуров 14 сентября 2018, 22:06 # 0
                          Алексей, если честно, ничего не понял) Тогда где таблицу указывать?
                          1. Алексей Власов 14 сентября 2018, 22:13 # 0
                            А для чего её указывать?) Достаточно просто подключиться к своей базе данных и даже, если она будет пустая, то скрипт уже сам все сделает. В файле signup.php уже указывается таблица на 76 строчке
                          2. Дионис Дуров 14 сентября 2018, 22:12 # 0
                            т.е. db.php должен быть такой?
                            <?php
                            require 'libs/rb.php';
                            R::setup( 'mysql:host=127.0.0.1;dbname=redbeen','root', '' );

                            if ( !R::testconnection() )
                            {
                            exit ('Нет соединения с базой данных');
                            }

                            session_start();
                            ?>

                            Тогда где параметры подключения указывать?
                            1. Алексей Власов 14 сентября 2018, 22:15 # 0
                              Да, нужно только свои данные ввести от БД

                              R::setup( 'mysql:host=127.0.0.1;dbname=имя_вашей_базы','ваш_логин_от_бд', 'ваш_пароль_от_бд' );
                      2. Дионис Дуров 17 сентября 2018, 14:14 # 0
                        Снова здравствуйте!
                        Вот в $_SESSION['logged_user'] я с горем пополам сделал чтобы заносилось только это

                        array(3) { [«auth»]=> string(5) «admin» [«captcha»]=> int(1) [«logged_user»]=> string(5) «admin» }

                        Вместо громадного массива. Теперь есть вопрос. Как достать оттуда значение «logged_user» или «auth» (они в моём случае равны admin)
                        1. Дионис Дуров 17 сентября 2018, 14:18 # 0
                          Мне нужно, чтобы заработал этот скрипт

                          <?php
                          ini_set('error_reporting', E_ALL);
                          ini_set('display_errors', 1);
                          ini_set('display_startup_errors', 1);
                          @session_start();
                          include 'config.php';
                          $login = $_SESSION[«logged_user»];
                          var_dump( $_SESSION);
                          $link = mysqli_connect(HOST, USERNAME, PASS, DBNAME);
                          mysqli_set_charset($link, «utf8mb4_unicode_ci»);
                          $login = strval($login);
                          $res=mysqli_query($link,«SELECT * FROM `users` WHERE `login` = '$login' „);
                          $row = mysqli_fetch_array($res);
                          echo $row;
                          if (!$row['usertype']) echo “Тут можно вывести форму входа»;
                          else if ($row['usertype'] === 2) echo «Admin-доступ»;
                          else if ($row['usertype'] === 1) echo «Вы модератор»;
                          else if ($row['usertype'] === 0) echo «Вы обычный пользователь»;
                          ?>
                          1. Дионис Дуров 17 сентября 2018, 15:03 # 0
                            Пока на выходе даёт

                            array(3) { [«auth»]=> string(5) «admin» [«captcha»]=> int(1) [«logged_user»]=> string(5) «admin» }
                            Notice: Array to string conversion in /var/www/user290/data/www/engineer-school.space/test.php on line 14
                            ArrayТут можно вывести форму входа
                        2. Сергей Медведев 19 октября 2018, 09:18 # 0
                          Добрый день!
                          Реализовал форму регистрации с шифрованием немного отличным от того что преподносится в уроке не стандартным php хешем, a sha1, теперь хотелось бы прикрутить функцию восстановления пароля к примеру Нажимаем восстановить пароль и данные отсылаются на почту указанную в при регистрации. Но что то не особо получается. Подскажите пожалуйста как правильно подцепить к своей форме данную возможность.
                          Спасибо.
                          1. Алексей Власов 19 октября 2018, 14:17 # 0
                            Сергей, добрый день!

                            Вас интересует алгоритм действий? Я бы ничего восстанавливать не стал, а создал новый рандомный пароль и отправил его на почту:

                            1. делаем форму восстановления
                            2. вводим в нее почту, на которую регистрировались
                            3. проверяем есть ли такая почта в базе
                            3.1. если нет, то предлагаем создать новый аккаунт
                            3.2. если есть, то генерируем пароль из N рандомных символов. Кодируем их, как хотим и сохраняем в базу для этой почты
                            4. шлем письмо с новым паролем
                          2. Денис Дёмин 11 декабря 2018, 14:07 # 0
                            а как после успешной авторизации сделать редирект на другую страницу?
                            спасибо
                            1. Маша Личная 30 января 2019, 08:49 # 0
                            2. Маша Личная 30 января 2019, 08:46 # 0
                              в signup.php в архиве
                              на 69 строке var_dump так и весит=)))
                              везде обманывают=)))
                              сп за скрипт
                              1. Алексей Власов 30 января 2019, 19:30 # 0
                                спасибо за комментарий
                                действительно обманул :(

                              2. Сергей Кутузов 24 февраля 2019, 06:38 # 0
                                Здравствуйте.
                                Если я правильно понял, ничего кроме файла bd менять не надо. Если ошибаюсь пожалуйста поправьте.

                                И ещё, так как я только-только начал вникать в такие дела, подскажите пожалуйста, куда и что прописать, чтоб в на страницу регистрации добавить текстовое поле Несколько слов о себе.

                                Заранее благодарен. Печенюшки от веб-мастера (если можно так назваться), с главной страницы. Регулярно при заходах
                                1. Сергей Кутузов 24 февраля 2019, 06:46 # 0
                                  Здравствуйте.

                                  Если не ошибаюсь, ничего кроме файла bd менять не надо?

                                  И ещё, так как я только-только начал вникать в эти дела, пожалуйста подскажите, что и куда прописать, чтоб на страницы регистрации добавить поле Немного о себе.

                                  Печеньки к чаю от веб мастера (если можно так назваться), с Главной, регулярно при посещениях.
                                  1. Алексей Власов 24 февраля 2019, 12:32 # 0
                                    Здравствуйте, Сергей!

                                    Чтобы авторизация заработала достаточно поменять значения в файле bd.

                                    Добавить поле Немного о себе можно в файле signup, например, после самой формы — в самый конец файла
                                  2. Сергей Кутузов 24 февраля 2019, 06:49 # 0
                                    Извините, что-то с комментами напутал.
                                    1. Сергей Кутузов 24 февраля 2019, 10:21 # 0
                                      Оп-с. Не нашёл рекламы
                                      1. Денис Дёмин 25 февраля 2019, 12:51 # 0
                                        prntscr.com/mpr7tz
                                        Извини братское сердце, снова нет больше. Но зато приятно )))
                                        1. Денис Дёмин 25 февраля 2019, 12:57 # 0
                                          Вопрос такого плана, а как вывести в страницу профиля поля касающиеся юзера?
                                          и как в форме добавления новых данных в бд сделать так, что бы там была запись, мол добавил данные Иван Иваныч (залогиневшийся пользователь)?
                                          1. Сергей Кутузов 28 февраля 2019, 10:49 # 0
                                            И login.php и signup.php и index.php открывается кракозябрами. Переписал их в Notepad++ в utf8, добавил .htaccess в каталог, всё равно кракозябры. Что ещё можно сделать?

                                            Да ещё вопросик. Зип распаковывается папкой authorization_php, в ней ещё одна папка authorization_php, а уж в ней каталог. Так и загружать, или достаточно одной authorization_php с каталогом?
                                            1. Алексей Власов 28 февраля 2019, 20:16 # 0
                                              кодировка должна быть UTF-8 без BOM, в архиве все файлы уже в этой кодировке

                                              загружать надо самую последнюю папку authorization_php

                                              если еще остались вопросы, то можно ознакомиться с видео уроком www.youtube.com/watch?v=vvgOPJQA8Zk
                                            2. Сергей Кутузов 01 марта 2019, 22:31 # 0
                                              Никак не хочет к БД подключаться. Страницы есть, но как только введёшь рег. данные и нажмёшь Регистрация, выдаёт Большую ошибку.

                                              В инструкции RedBean сказано:

                                              RedBeanPHP не работает со строгим режимом MySQL. Чтобы отключить строгий режим, выполните следующий SQL-запрос:

                                              SET @@global.sql_mode= '';

                                              Попробовал выполнить, выдало

                                              #1227 — В доступе отказано. Вам нужны привилегии SUPER для этой операции

                                              А где их взять?

                                              Или вообще не там копаю. Но в БД таблицы users нет.

                                              На ошибки проверил не раз. И по видео и по коду в статье.

                                              php5.6

                                              Сайт на хостинге Бегет, но пока на бесплатном тарифе, техподдержки нет.

                                              Скрипт очень нравится, но никак не даётся.
                                              1. Сергей Кутузов 04 марта 2019, 15:28 # 0
                                                Подключился после того, как убрал слеш в signup.php в атрибуте формы action. И таблица создалась и страницы авторизации, регистрации и index есть. Большой ошибки больше нет.
                                                Теперь остался последний зихер: капча выдаёт Ответ на вопрос указан не верно! На все ответы.
                                                Подскажите пожалуйста, в чём может быть дело.
                                                1. Алексей Власов 04 марта 2019, 17:20 # 0
                                                  Рад, что у вас получилось подключиться к базе.

                                                  капча выдаёт Ответ на вопрос указан не верно! На все ответы. — это странно. Капча рабочая, много раз лично тестировал. Если правильно написать ответ, то ошибку выдавать не должно.

                                                  Я думаю у вас не работает функция mb_strtolower с русскими буквами. Она находится в файле signup.php на 66 строчке. В ней я не указывал параметр encoding. А если он в явном виде не указан, то вместо него будет использовано значение внутренней кодировки. Вам скорее всего просто нужно в mb_strtolower указать кодировку UTF-8.

                                                  Если совсем беда, то просто удалите проверку капчи в файле signup.php и подключите обычную капчу от Google.

                                                  1. Алексей Власов 04 марта 2019, 17:29 # 0
                                                    Попробуйте заменить 66 строчку в файле signup.php:

                                                    Вместо этого:
                                                    if ( $_SESSION['captcha'] != array_search( mb_strtolower($_POST['captcha']), $answers ) )

                                                    Напишите так:
                                                    if ( $_SESSION['captcha'] != array_search( mb_strtolower($_POST['captcha']), $answers, 'UTF-8' ) )

                                                    Надеюсь, что помог
                                                  2. Сергей Кутузов 04 марта 2019, 17:54 # 0
                                                    Указал кодировку в mb_strtolower. Сейчас регистрирует, но со второго клика. Т.е. первый клик по Зарегистрироваться выдаёт опять Ответ на вопрос не верный, а если ещё раз кликнуть, уже ничего не вводя, то регистрирует.
                                                    Может кодировку указал неправильно. Вот так

                                                    if ( $_SESSION['captcha'] != array_search( mb_strtolower($_POST['captcha'], 'UTF-8'), $answers ) )
                                                    1. Сергей Кутузов 04 марта 2019, 17:59 # 0
                                                      Напишите так:

                                                      Да, и так со второго клика. Чудеса.
                                                      1. Сергей Кутузов 04 марта 2019, 21:36 # 0
                                                        Поставил гугловскую капчу. Всё отлично!!!

                                                        Последний вопросик: если добавить поля в форму регистрации, то в БД они появятся автоматически или надо добавлять вручную?

                                                        И спасибо за материал. Что ни говори, а благодаря вам есть отличный результат.
                                                        1. Алексей Власов 04 марта 2019, 22:07 # 0
                                                          Спасибо за комментарии :)

                                                          Если добавить поля по аналогии с другими полями, которые уже имеются в форме, то таблицы в БД должны автоматически создаваться. Библиотека RedBeanPHP сама всё сделает, главное внимательно прописать имена переменных и ничего не забыть.
                                                        2. Сергей Кутузов 04 марта 2019, 22:11 # 0
                                                          ОК. Спасибо. Не прощаюсь.
                                                          1. Даниил Шрамков 06 марта 2019, 02:13 # 0
                                                            Здравствуйте. Возник небольшой вопросик, RedBean поддерживаеться только на локально сервере? Ато что-то на хостинг не закачивается сам файл RedBean… Ну и ещё одно, не подскажете как реализовать этот код без ОРМ?
                                                            1. Алексей Власов 06 марта 2019, 11:34 # 0
                                                              Здравствуйте

                                                              RedBean должен поддерживаться любым хостингом. Если файл на хостинг не закачивается, то нужно обратиться к ним в службу поддержки.

                                                              Без ОРМ в интернете полно готовых скриптов. Основное преимущество данного скрипта это безопасность, что для формы авторизации критически важно.
                                                              1. Даниил Шрамков 06 марта 2019, 18:51 # 0
                                                                Спасибо, обращусь в поддержку.
                                                                1. Даниил Шрамков 07 марта 2019, 18:19 # 0
                                                                  Здравствуйте, ещё раз. Вообщем обратился я в техподдержку и с этой проблемой разобрался… теперь появилась соответственно другая ошибка… При подключении в файле db.php всё отлично подключаеться (я проверял на вывод строки Всё норм) но при регистрации новая таблица в базе данных не создается… Как можно решить данную проблему? Нужно снова обращаться в поддержку??
                                                                  1. Алексей Власов 07 марта 2019, 21:18 # 0
                                                                    Добрый вечер!
                                                                    А что хостинг ответил на прошлую проблему? Почему файл не хотел закачиваться?

                                                                    Что сейчас происходит после регистрации? Появляется надпись – “Вы успешно зарегистрированы!”??
                                                                    1. Даниил Шрамков 07 марта 2019, 22:06 # 0
                                                                      Хостинг посоветовал воспользоваться сторонним FTP-сервером, к примеру, FileZilla. Ну я зашёл через прогу и всё подключилось вроде как… По коду получаеться что он вообще начиная с if( isset($data['do_signup']) не выполняеться, а до if всё работает(опять таки вывод строки через echo)… Но при этом всё отлично работает на локалке
                                                                      1. Алексей Власов 07 марта 2019, 23:35 # 0
                                                                        Попробуйте снова обратиться в службу поддержки. Возможно на хостинге нужно сменить версию php. Я тестировал скрипт на PHP-5.6

                                                                        Еще можно попробовать включить вывод ошибок, добавив в начало нужного .php файла следующие строки:

                                                                        ini_set('error_reporting', E_ALL);
                                                                        ini_set('display_errors', 1);
                                                                        ini_set('display_startup_errors', 1);

                                                                        После этого попробовать снова зарегаться и посмотреть какие ошибки всплывут. А пока слишком мало информации.
                                                                        1. Даниил Шрамков 07 марта 2019, 23:49 # 0
                                                                          Вписал вывод ошибок, зарегался. Ничего не показывает… php версия 7.3 и могу изменить её до более старой версии
                                                                          1. Даниил Шрамков 07 марта 2019, 23:51 # 0
                                                                            putishestvinik .zzz .com .ua/reg
                                                                            Вот можете глянуть, ничего не выводиться
                                                                            1. Алексей Власов 08 марта 2019, 00:22 # +1
                                                                              я посмотрел

                                                                              у вас данные из формы не отправляются в обработчик (signup.php)

                                                                              сейчас у формы прописан action=" reg.php ". Я не знаю есть такой файл на FTP или нет, но к нему в любом случае нельзя обратиться из-за редиректа. Скорее всего в htaccess файле прописано правило, которое удаляет у страниц .php

                                                                              Посмотрите как в примере прописан action у формы и сделайте по аналогии. Убедитесь, что путь к обработчику прописан корректно и он открывается.
                                                                              1. Алексей Власов 08 марта 2019, 00:24 # 0
                                                                                попробуйте написать в action не reg.php, а просто reg
                                                                                1. Даниил Шрамков 08 марта 2019, 01:21 # 0
                                                                                  Сейчас попробую, спасибо
                                                                                  1. Даниил Шрамков 08 марта 2019, 01:23 # 0
                                                                                    выводит это:
                                                                                    Fatal error: Uncaught [42000] — SQLSTATE[42000]: Syntax error or access violation: 1286 Unknown storage engine 'InnoDB' trace: #0 /profiles/p/pu/put/putishestvinik/putishestvinik.zzz.com.ua/rb.php(958): RedBeanPHP\Driver\RPDO->runQuery('CREATE TABLE `u...', Array) #1 /profiles/p/pu/put/putishestvinik/putishestvinik.zzz.com.ua/rb.php(3455):
                                                                                    1. Даниил Шрамков 08 марта 2019, 12:54 # 0
                                                                                      Вообщем код вроде начал работать, ну как минимум все проверки на ошибки работаеют, а при нажатиии на регистрацию выводит эту ошибку
                                                                                  2. Даниил Шрамков 08 марта 2019, 01:27 # 0
                                                                                    Могу сказать одно, теперь значения не удаляются при обновлении странички )
                                                                                    1. Даниил Шрамков 08 марта 2019, 01:29 # 0
                                                                                      И у меня обработчик в том же файле находиться
                                                                                    2. Даниил Шрамков 08 марта 2019, 17:02 # 0
                                                                                      Мне посоветовали почитать здесь, как исправить данную ошибку. Не могу понять как это сделать потому что в настройках баз вообще 0… А ещё у меня хостинг который даёт доступ к 1 базе данных и всё
                                                                                      1. Даниил Шрамков 08 марта 2019, 22:16 # 0
                                                                                        Кажется дошло… На моем хостинге не установлено InnoDB что означает — старая версия MySql… И что мне теперь делать, как обновить mysql?
                                                                                        1. Алексей Власов 09 марта 2019, 12:50 # 0
                                                                                          Вы не обновите самостоятельно mysql. Отправьте запрос в техподдержку, но я думаю, они ничего сделают, потому что хостинг бесплатный.
                                                                                          1. Даниил Шрамков 09 марта 2019, 20:00 # 0
                                                                                            Спасибо большое за помощь :( Мне сказали что передали моё письмо в отдел разработчиков, и надеяться на то что в скором времени обновят…
                                                                      2. Сергей Кутузов 06 марта 2019, 14:40 # 0
                                                                        А как подключить к файлам находящимся в каталогах уровнем ниже?
                                                                        1. Сергей Кутузов 06 марта 2019, 21:31 # 0
                                                                          Cпасибо уже подключил
                                                                          1. Илья Царев 02 мая 2019, 17:38 # 0
                                                                            Доброго времяни суток! При попытки использования Вашего скрипта на своем сайте, все сломалось (заскриптованные кнопки не работают, ссылки тоже, блоки отправились в свободное плавание), а в месте вывода формы авторизации или регистрации вылезает фатльная ошибка: Fatal error: Cannot redeclare class RedBeanPHP\RedException in C:\OSPanel\domains\Carcolor.ru\libs\rb.php on line 6745
                                                                            Что делать, как быть, спасите
                                                                            1. Илья Царев 02 мая 2019, 17:50 # 0
                                                                              Я дурак, осознал, исправил
                                                                            2. Илья Царев 03 мая 2019, 12:21 # 0
                                                                              Что я делаю не так, все преерпроверил, ошибка как была, так исталась (зарание прошу прощения, если ошибка глупая, что ппц):
                                                                              Fatal error: Call to a member function findOne() on a non-object in C:\OSPanel\domains\Carcolor.ru\libs\rb.php on line 10854
                                                                              1. Дмитрий Егорчатов 07 мая 2019, 11:28 # 0
                                                                                При регистрации вываливается
                                                                                Fatal error: Uncaught [42S22] - SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'field list' trace: #0 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(882): RedBeanPHP\Driver\RPDO->runQuery('INSERT INTO `us...', Array) #1 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(919): RedBeanPHP\Driver\RPDO->GetAll('INSERT INTO `us...', Array) #2 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(3547): RedBeanPHP\Driver\RPDO->GetOne('INSERT INTO `us...', Array) #3 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(4976): RedBeanPHP\Adapter\DBAdapter->getCell('INSERT INTO `us...', Array, 0) #4 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(5103): RedBeanPHP\QueryWriter\AQueryWriter->insertRecord('users', Array, Array) #5 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(7646): RedBeanPHP\QueryWriter\AQueryWriter->updateRecord('users', Array, 0) #6 /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php(7233): RedBeanPHP\Repository\Fluid->storeBean(Object(RedBeanPHP\OODBBean)) #7 /home/p522455/www/ in /home/p522455/www/p522455.ihc.xyz/admstr/libs/rb.php on line 720Таки как сие победять?
                                                                                Вне зависимости от наличия как самой таблицы users так и столбцов id/login/password/email в ней
                                                                                1. Лебедев Евгений 20 мая 2019, 12:03 # 0
                                                                                  У меня такая же ошибка,
                                                                                  Fatal error: Uncaught [22001] — SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'password' at row 1 trace: #0 W:\domains\localhost\avtoriz\libs\rb.php(882): RedBeanPHP\Driver\RPDO->runQuery('INSERT INTO `us...', Array) #1 W:\domains\localhost\avtoriz\libs\rb.php(919): RedBeanPHP\Driver\RPDO->GetAll('INSERT INTO `us...', Array) #2 W:\domains\localhost\avtoriz\libs\rb.php(3547): RedBeanPHP\Driver\RPDO->GetOne('INSERT INTO `us...', Array) #3 W:\domains\localhost\avtoriz\libs\rb.php(4976): RedBeanPHP\Adapter\DBAdapter->getCell('INSERT INTO `us...', Array, 0) #4 W:\domains\localhost\avtoriz\libs\rb.php(5103): RedBeanPHP\QueryWriter\AQueryWriter->insertRecord('users', Array, Array) #5 W:\domains\localhost\avtoriz\libs\rb.php(7646): RedBeanPHP\QueryWriter\AQueryWriter->updateRecord('users', Array, 0) #6 W:\domains\localhost\avtoriz\libs\rb.php(7233): RedBeanPHP\Repository\Fluid->storeBean(Object(RedBeanPHP\OODBBean)) #7 W:\domains\localhost\avtoriz\libs\rb.php(8310): RedBeanPHP\Repository->store(Obje in W:\domains\localhost\avtoriz\libs\rb.php on line 720
                                                                                  если я правильно понимаю PHP выше 7 не хэширует пароль, когда я тестирую на локальном сервере. Алексей скажите пожалуйста, как это исправить может быть есть команды совместимости?
                                                                                  1. Денис Дёмин 12 июля 2019, 14:06 # 0
                                                                                    Очень интересная статья. вполне себе рабочая и грамотная форма авторизации. подскажите, а Вы бы не могли показать как сделать авторизацию PHP+LDAP.
                                                                                    Идея такая, есть локальная сеть, нужно чтобы пользователи через веб интерфейс заходили по своему логину и паролю (учетные записи пользователей Windows) на определенные страницы.
                                                                                    Спасибо большое. Будет очень даже полезный опыт
                                                                                    Заранее благодарен
                                                                                    1. Александр Простомолотов 06 января 2020, 20:33 # 0
                                                                                      Warning: session_start(): Cannot send session cookie — headers already sent by (output started at E:\OSPanel\domains\imysite.ru\index.php:6) in E:\OSPanel\domains\imysite.ru\db.php on line 10

                                                                                      Warning: session_start(): Cannot send session cache limiter — headers already sent (output started at E:\OSPanel\domains\imysite.ru\index.php:6) in E:\OSPanel\domains\imysite.ru\db.php on line 10

                                                                                      ошибка связанная с session_start();
                                                                                      1. Денис Дёмин 06 января 2020, 22:11 # 0
                                                                                        Включите сессии. У меня было такое
                                                                                      2. екатерина калинина 07 апреля 2020, 14:47 # 0
                                                                                        что делать, если при нажатии кнопки регистрация (на моменте проверки ошибок) меня перебрасывает на страницу «Объект не найден»?
                                                                                        1. Алексей Власов 07 апреля 2020, 15:11 # +1
                                                                                          скорее всего вы неправильно прописали путь к файлу signup.php у формы вот тут <form action="/signup.php" method="POST">
                                                                                          1. GSS Carrental 13 мая 2020, 15:52 # 0
                                                                                            Здравствуйте, мне нужно чтобы после регистрации создавалась страница пользователя по определенному шаблону, который можно будет в дальнейшем отредактировать. Каждому пользователю — своя страница например с идентификационным номером или по адресу почты. Этот скрипт подойдет для такой цели ??
                                                                                        2. Rozi Damburajyan 02 мая 2020, 10:05 # 0
                                                                                          Добрый день огромное спасибо за урок!!!
                                                                                          У меня вопрос… а как сделать чтобы разных пользователей перекинуло на разные страницы?

                                                                                          Спасибо
                                                                                          1. xaxatun xaxa 22 июня 2020, 09:17 # 0
                                                                                            Здравствуйте! С большим интересом прочитал вашу статью и попробовал реализовать на Open Server. Код работает отлично, нареканий нет. Но один вопрос всё же есть. Как переместить глобальный массив ошибок $errors из body например в контейнер там где собственно «форма авторизации» и «форма регистрации»?
                                                                                            1. xaxatun xaxa 01 июля 2020, 00:01 # 0
                                                                                              Разобрался!
                                                                                              <?php require 'db.php';?> надо вставить отдельно в каждую страницу сверху перед <!doctype html>.
                                                                                              А $data = $_POST; и т.д. положить отдельно <?php ?>.
                                                                                              И уже вместе с формой в body — div id=container например.
                                                                                              1. Андрей Рейз 25 августа 2022, 06:45 # 0
                                                                                                не понял, что вы написали в конце. Тоже интересует этот вопрос. Что вставлять в мою форму регистрации?
                                                                                              2. misha10 m 02 августа 2020, 23:51 # 0
                                                                                                класс какой спооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооосибо…
                                                                                                1. сергей кум 18 марта 2021, 18:11 # 0
                                                                                                  Всем привет! Подскажите не появляется имя зарегистрированного юзера, кто с вталкивался с такой бедой? Как вывести инфузорным из базы для зарегистрированного пользователя конкретного. Спасибо за ответы
                                                                                                  1. Sobaka Sobaka 15 августа 2021, 12:41 # 0
                                                                                                    Почему пароль который вводится при авторизации не шифруется и не проверяется с серверным? Регистрация работает, авторизация нет

                                                                                                    if ( password_verify($data['password'], $user->password) ) { //если пароль совпадает, то нужно авторизовать пользователя $_SESSION['logged_user'] = $user; echo '<div style="color:dreen;">Вы авторизованы! Можете перейти на <a href="/">главную</a> страницу.</div><hr>'; }else { $errors[] = 'Неверно введен пароль!'; } При правильном вводе своего пароля, у меня выходит «Неверно введен пароль!»
                                                                                                    1. Nurbolat Nurmash 11 февраля 2022, 16:07 # 0
                                                                                                      Not Found
                                                                                                      The requested URL was not found on this server.

                                                                                                      у меня такая ошибка когда нажал на регистрацию
                                                                                                      1. Алексей Бобыкин 11 июля 2022, 09:21 # 0
                                                                                                        1. Алексей Бобыкин 12 июля 2022, 03:57 # 0
                                                                                                          1. Михаил Гагаркин 26 июля 2022, 04:47 # 0
                                                                                                            Алексей, — Я скопировал ваши файлы и опробовал регистрацию юзера в Базе данных, все работает отлично.
                                                                                                            Мне нужно форму разместить в модальном окне, но в файле и код формы и код подключения к bd.
                                                                                                            Поэтому в модальном окне отображается весь код файла.
                                                                                                            Как мне поступить, что бы в модальное окно разместить только форму с чистыми полями ввода. И если можно, то на почту — garinvladimir430@gmail.com
                                                                                                            Сам я конечно не сделаю, масла мало в голове в моем возрасте, да и это мой первый сайт в жизни.
                                                                                                            Заранее благодарен. Михаил Гагаркин.
                                                                                                            1. Владимир Гагаркин 03 сентября 2022, 23:33 # 0
                                                                                                              Кто нибудь объяснить мне может, или нет,
                                                                                                              я по поводу просьбы в комментарии.
                                                                                                            2. Андрей Рейз 24 августа 2022, 18:19 # 0
                                                                                                              Здравствуйте. Спасибо за проделанную огромную работу. Пытаюсь поставить вашу регистрацию в свою форму и столкнулся с проблемой. Не работает регистрация если в моей форме указан id=«form1», id=«form2». Без них всё работает. Это очень странно. Я не могу убрать id, так как они нужны. Можете помочь решить такую проблему? Вот мой код. Как-то он тут криво выкладывается. Ваши файлы login и SingUp я объединил в один, котором и этот код.

                                                                                                              <div class="login-list"> <div class="con-reg right-panel-active"> <!-- Зарегистрироваться --> <div class="con-reg__form con-reg--signup"> <form action="reg.html" class="form" id="form1" method="POST"> <h2 class="form__title">Зарегистрироваться</h2> <input type="text" placeholder="User" class="input" name="login" value="<?php echo @$data['login']; ?>"> <input type="email" placeholder="Email" class="input" name="email" value="<?php echo @$data['email']; ?>"> <input type="password" placeholder="Password" class="input" name="password" value="<?php echo @$data['password']; ?>"> <input type="password" placeholder="Password" class="input" name="password_2" value="<?php echo @$data['password_2']; ?>"> <strong><?php captcha_show(); ?></strong> <input type="text" name="captcha" > <button class="btn-reg" type="submit" name="do_signup">Зарегистрироваться</button> </form> </div> <!-- Войти --> <div class="con-reg__form con-reg--signin"> <form action="#" method="POST" class="form" id="form2"> <h2 class="form__title">Войти</h2> <input type="email" placeholder="Email" class="input" name="email" value="<?php echo @$data['email']; ?>"> <input type="password" placeholder="Password" class="input" name="password" value="<?php echo @$data['password']; ?>"> <a href="#" class="link">Забыли пароль:(?</a> <button class="btn-reg" type="submit" name="do_login">Войти</button> </form> </div> <!-- Оверлей --> <div class="con-reg__overlay"> <div class="overlay"> <div class="overlay__panel overlay--left"> <button class="btn-reg" id="signIn">Войти</button> </div> <div class="overlay__panel overlay--right"> <button class="btn-reg" id="signUp">Зарегистрироваться</button> </div> </div> </div> </div> </div>
                                                                                                              1. Андрей Рейз 25 августа 2022, 09:15 # 0
                                                                                                                с предыдущим вопросом решил в пользу удаления form Id. Сейчас появилась другая проблема. Не знаю как прикрутить ошибки к текстовым полям. Получилось сделать, чтоб они выводились для каждого поля отдельно, однако если в допустим в поле e-mail указано правильное значение, а в других отсутствует, то ошибки выводятся начиная с первого поля подряд поверх того же e-mail. В результате ошибка указывается на правильно заполненном поле.

                                                                                                                Вы должны авторизоваться, чтобы оставлять комментарии.

                                                                                                                Вы можете авторизоваться на сайте через:
                                                                                                                YandexVkontakte
                                                                                                                Требуется программист