Регистрация и авторизация
Функция регистрации и авторизации пользователей на сайте реализуется так: когда пользователь регистрируется на сайте, он заполняет форму регистрации, в которой указывает различные данные, в том числе, логин и пароль. Форма отправляет эти данные на сервер, и они записываются в базу данных.
Авторизация и дальнейшее пребывание пользователя на сайте происходит по следующей схеме:
- Пользователь вводит логин и пароль в форму авторизации и отправляет на сервер.
- На сервере проверяется, есть ли в базе данных пользователь с таким логином и паролем.
- Если пользователь найден, то информация об этом записывается в сессию или куки.
- На страницах сайта происходит проверка — есть ли в сессии данные о том, что пользователь авторизован и в зависимости от этого страница выводится в том или ином виде.
В сессии можно не просто указать факт авторизации, но и записать какие-то данные пользователя для вывода их на страницу, например имя или ник. Решение о том, использовать сессии или куки принимается для каждого сайта отдельно. Если на сайте содержится важная информация, то лучше применять сессии, потому что узнать чужие регистрационные данные при этом намного сложнее.
Формы авторизации и регистрации
Форма авторизации обычно располагается на главной странице, либо она может быть на всех страницах сайта. Для формы регистрации, в основном, создаётся отдельная страница. Мы создадим всего одну страницу, на которой будут обе формы, и на неё же будут выводиться данные пользователя. Пока на ней будет только HTML код, но мы сразу сделаем PHP файл, потому что в дальнейшем это будет скрипт. Назовём его formreg.php. Код страницы будет такой:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Авторизация:
Регистрация:
Регистрация
Регистрационные данные пользователей мы будем записывать в таблицу users . Если у Вас ещё нет такой таблицы, то создайте её. В ней должны быть поля id , login и pas . Другие поля мы не будем использовать. Если они есть в таблице, то они будут оставаться пустыми.
Форма авторизации отправляет данные в файл registration.php. Расположим его в той же папке, где находится страница. Код скрипта будет такой:
$login=$_POST['login']; $pas=$_POST['password']; $db=mysqli_connect('localhost', 'root', '', 'mybase'); $query="INSERT INTO users (login, pas) VALUES ('$login', '$pas')"; $result=mysqli_query($db, $query); if ($result) header("Location: formreg.php"); mysqli_close($db);
В строке 9 мы устанавливаем возврат к странице с формами. Так как на локальном сервере выполнение скрипта и повторная загрузка страницы происходит очень быстро, то визуально это будет выглядеть так, как будто при нажатии кнопки «Зарегистрироваться», ничего не происходит. На реальных сайтах обычно делают переход на специальную страницу с информацией о том, что пользователь зарегистрирован и регисрационными данными. Попробуйте выполнить регистрацию и посмотрите, появляются ли в базе данных новые записи.
Авторизация
Форма авторизации запускает на сервере файл authorization.php. Этот скрипт принимает логин и прароль и проверяет, есть ли такой пользователь. Если есть, то логин будет записываться в сессию. Если такой пользователь не найден, то в сессию будет записываться информация об этом. Это нужно для того, чтобы страница, которая будет открыта после выполнения скрипта, получила эту информацию и вывела сообщение, что введён неправильный логин или пароль. Код скрипта такой:
3
4
5
6
7
8
9
10
11
12
13
14
session_start(); $login=$_POST['login']; $pas=$_POST['password']; $db=mysqli_connect('localhost', 'root', '', 'mybase'); $query="SELECT * FROM users WHERE login='$login' AND BINARY pas='$pas'"; $result=mysqli_query($db, $query); if (mysqli_num_rows($result)) $_SESSION['login']=$login; else $_SESSION['login']='er login'; header("Location: formreg.php"); mysqli_close($db);
В строке 7 формируется запрос на выборку строки с логином и паролем, полученными из формы. Перед полем pas написано ключевое слово BINARY. Оно нужно для того, чтобы при сравнении по этому полю учитывался регистр символов. Если нужно, чтобы регистр учитывался и при сравнении логина, то BINARY нужно написать перед ним. В примере делается запрос на выборку всех полей. На практике можно делать выборку только тех полей, данные из которых нужно будет выводить на страницу.
После получения результата, проверяется, найдена ли указанная запись. Если запись есть, то логин записывается в сессию. Если пользователь не найден, то вместо логина пишется строка «er login». Можно написать другой текст, но нужно быть уверенным, что он не совпадёт с каким-то логином. Затем происходит возврат на страницу с формами.
На страницах сайта должен быть код, в котором происходит проверка — есть ли в сессии логин. И в зависимости от этого определяется, как должна выглядеть страница. В нашем примере есть только одна страница. На ней и сделаем проверку. Только код будет разделён на две части. Открытие сессии должно производиться до вывода каких-либо данных, то есть, до HTML кода. Поэтому эта часть располагается в самом начале страницы. А остальной код находится внутри тэга , потому что он добавляет на страницу контнет. Добавим в начало страницы такую строку:
Остальной скрипт расположим в теге , в его начале:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Введён неправильный логин или пароль'; $_SESSION['login']=''; > else echo "Здравствуйте, $login
"; > else echo 'Здравствуйте, гость
'; ?>
Если в сессии есть логин, но в нём содержится строка «er login», то выводится сообщение, что логин или пароль неправильный. После вывода сообщения логин становится пустым. Это сделано для того, чтобы сообщение выводилось только один раз и при переходе на другие страницы не появлялось. Если логин другой, значит пользователь авторизован и страница формируется как для зарегистрированных. Если логина нет, значит авторизации ещё не было и страница выводится для не зарегистрированных пользователей.
Мы рассмотрели только общий принцип создания функции регистрации и авторизации. На реальных сайтах она сложнее. Формы должны выводиться только для не авторизованных пользователей. Кроме того, нужно добавить кнопку «Выход», которая отменяет авторизацию. При регистрации нужно делать проверку формы, проверять уникальность логина и добавить подтверждение пароля.
Коприрование материалов сайта возможно только с согласия администрации
2017 — 2023 © basecourse.ru Все права защищены
Создание регистрации на сайте на PHP + MySQL
Здравствуйте! Сейчас мы попробуем реализовать самую простую регистрацию на сайте с помощью PHP + MySQL. Для этого на вашем компьютере должен быть установлен Apache. Принцип работы нашего скрипта изображен ниже.
1. Начнем с создания таблички users в базе. Она будет содержать данные пользователя (логин и пароль). Зайдем в phpmyadmin (если вы создаете базу на своем ПК http://localhost/phpmyadmin/). Создаем таблицу users, в ней будет 3 поля.
Я создаю ее в базе mysql, вы можете создавать в другой базе. Далее устанавливаем значения, как на рисунке:
Нажимаем «сохранить». Итак, таблица у нас есть.
2. Необходимо соединение с этой таблицей. Давайте создадим файл bd.php. Его содержание:
$db = mysql_connect ("ваш MySQL сервер","логин к этому серверу","пароль к этому серверу");
mysql_select_db ("имя базы, к которой подключаемся",$db);
?>
В моем случае это выглядит так:
$db = mysql_connect ("localhost","user","1234");
mysql_select_db ("mysql",$db);
?>
Сохраняем bd.php.
Отлично! У нас есть таблица в базе, соединение к ней. Теперь можно приступать к созданию странички, на которой пользователи будут оставлять свои данные.
3. Создаем файл reg.php с содержанием (все комментарии внутри):
Регистрация
Регистрация
4. Создаем файл, который будет заносить данные в базу и сохранять пользователя. save_user.php(комментарии внутри):
if (isset($_POST['login'])) < $login = $_POST['login']; if ($login == '') < unset($login);>> //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) < $password=$_POST['password']; if ($password =='') < unset($password);>>
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
>
//если логин и пароль введены, то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// подключаемся к базе
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
>
// если такого нет, то сохраняем данные
$result2 = mysql_query ("INSERT INTO users (login,password) VALUES('$login','$password')");
// Проверяем, есть ли ошибки
if ($result2=='TRUE')
echo "Вы успешно зарегистрированы! Теперь вы можете зайти на сайт. Главная страница";
>
else echo "Ошибка! Вы не зарегистрированы.";
>
?>
5. Теперь наши пользователи могут регистрироваться! Далее необходимо сделать «дверь» для входа на сайт уже зарегистрированным пользователям. index.php (комментарии внутри) :
// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички.
session_start();
?>
Главная страница
Главная страница
// Проверяем, пусты ли переменные логина и id пользователя
if (empty($_SESSION['login']) or empty($_SESSION['id']))
// Если пусты, то мы не выводим ссылку
echo "Вы вошли на сайт, как гость
Эта ссылка доступна только зарегистрированным пользователям";
>
else
// Если не пусты, то мы выводим ссылку
echo "Вы вошли на сайт, как ".$_SESSION['login']."
Эта ссылка доступна только зарегистрированным пользователям";
>
?>
В файле index.php мы выведем ссылочку, которая будет открыта только для зарегистрированных пользователей. В этом и заключается вся суть скрипта — ограничить доступ к каким-либо данным.
6. Остался файл с проверкой введенного логина и пароля. testreg.php (комментарии внутри):
session_start();// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички.
if (isset($_POST['login'])) < $login = $_POST['login']; if ($login == '') < unset($login);>> //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) < $password=$_POST['password']; if ($password =='') < unset($password);>>
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
>
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// подключаемся к базе
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
$result = mysql_query("SELECT * FROM users WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином
$myrow = mysql_fetch_array($result);
if (empty($myrow['password']))
//если пользователя с введенным логином не существует
exit ("Извините, введённый вами login или пароль неверный.");
>
else //если существует, то сверяем пароли
if ($myrow['password']==$password) //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
$_SESSION['login']=$myrow['login'];
$_SESSION['id']=$myrow['id'];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь
echo "Вы успешно вошли на сайт! Главная страница";
>
else //если пароли не сошлись
exit ("Извините, введённый вами login или пароль неверный.");
>
>
?>
Ну вот и все! Может урок и скучный, но очень полезный. Здесь показана только идея регистрации, далее Вы можете усовершенствовать ее: добавить защиту, оформление, поля с данными, загрузку аватаров, выход из аккаунта (для этого просто уничтожить переменные из сессии функцией unset) и так далее. Удачи!
Все проверил, работает исправно!
Автор: Стороженко Евгений (отредактировал и опубликовал Максим Шкурупий)
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Максим Шкурупий
Урок создан: 24 Июля 2009
Просмотров: 10515976
Правила перепечатки
5 последних уроков рубрики «PHP»
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Защищенная Авторизация и Регистрация на PHP + MySQL через PDO
В этой статье Вы найдете скрипт на языке программирования 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, при котором веб-сервер принимает данные, заключённые в тело сообщения, для хранения.
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).
Поделиться с друзьями
Похожие статьи:
Комментарии ( )
Роман Дубровский 11 февраля 2018, 19:03 # ↓ +1
Простите, не очень понял. Какой код должен быть на странице с закрытым контентом?
Уже понял. Содержание страницы надо расположить между
Алексей Власов 24 мая 2018, 23:48 # ↑ ↓ 0
Спасибо за комментарий! Всё верно.
Виталий Алехин 29 марта 2018, 19:38 # ↓ +1
1) — ошибка в описании статьи: комментарии здесь не нужны
2) $errors[] = ‘Ответ на вопрос указан не верно!’; var_dump($answers); — опять же непонятно для чего тут в статье и в файле нужен
var_dump($answers);
С уважением,
Виталий
Алексей Власов 24 мая 2018, 23:54 # ↑ ↓ 0
Спасибо за помощь!
var_dump действительно не нужен, забыл удалить его после тестов. В архиве и статье исправил.
«ошибка в описании статьи: комментарии здесь не нужны» — комментарии создал плагин, убрать их статьи не получится, так как там симбиоз html и php кода. Люди, которые это читают, — смело качайте архив, там нет ничего лишнего. Всё исправно работает!
Ярик Ищик 18 мая 2019, 15:45 # ↑ ↓ 0
там при успешной регистрации dreen вместо green, я щас говорю о цвете самого текста, мелочь, но..)
Victor Sproot 06 июля 2018, 21:51 # ↓ 0
скрипт хороший спасибо
вот только как защитить его от перебора паролей, а самое главное как сделать чтоб на страницу которую входишь после авторизации можно бы было попасть только авторизованным а то иначе если ввесли в строке адрес то можно без труда туда попасть
Victor Sproot 06 июля 2018, 22:39 # ↓ 0
ну с тем чтоб не открывалось для неавторизованных я разобрался тем что впихнул всю страницу в if
а вот как с перебором бороться?
Алексей Власов 12 июля 2018, 10:33 # ↑ ↓ 0
Спасибо за комментарий! Можно писать в сессию число попыток и если перевалит за какое-то число, то выводить рекапчу гугловскую, например или просто блокировать.
Kill Mania 14 сентября 2018, 10:29 # ↓ 0
Воспользовался Вашим решением. Все работает отлично. Спасибо большое!
Но так как я темный лес в этом во всем, то никак не могу понять, что нужно прописать на ту или иную страницу сайта (они у меня в html), чтобы закрыть контент от незарегистрированных пользователей и их перекидывало бы на страницу авторизации.
Подскажите, пожалуйста, если не сложно.
Алексей Власов 14 сентября 2018, 13:06 # ↑ ↓ 0
Спасибо за комментарий!
А чтобы определить авторизован человек или нет, — надо воспользоваться сессиями. session_start(); — стартует новую сессию, либо возобновляет существующую. В файле db.php это также реализовано.
Надеюсь, что помог, а не ещё больше запутал.
Kill Mania 15 сентября 2018, 08:58 # ↑ ↓ 0
Спасибо большое, Алексей!)
Нет, вроде бы Вы меня не запутали. Но… Когда я экспериментирую со страничкой index.php, то все получается отлично. Тестовый текст отображается только тогда, когда я авторизован.
Когда же я пытаюсь применить сие счастье на рабочей странице, то что-то идет не так. Вверху и внизу страницы одновременно отображается следующее:
Авторизован! Привет, login; ?>! Выйти и
Вы не авторизованы Авторизация Регистрация Уверен, что где-то допускаю глупую ошибку, скорее всего связанную с недостаточным пониманием логики работы кода. Пишу так:
Kill Mania 15 сентября 2018, 09:16 # ↑ ↓ 0
В общем, после некоторых изучений сломал себе мозг полностью… Две одинаковых страницы: index.html и index.php На index.php все работает, на index.html не работает Не понимаю…
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 это
Kill Mania 15 сентября 2018, 09:45 # ↑ ↓ 0
И тут победил — проблема была в кодировке. Поставил без BOM и все заработало! Уффф… как оно все сложно, мозг кипел с самого утра)))
Алексей, спасибо Вам огромнейшее еще раз! Вы заставили мой мозг поработать)) И, конечно же, помогли в решении моей задачи. Особенно фраза «Это уже реализовано в файле index.php, можно там подглядеть» для меня стала решающей, так как начал с ней экспериментировать и все пошло в нужном направлении.
От всей души СПАСИБО.
Алексей Власов 15 сентября 2018, 12:01 # ↑ ↓ +1
Очень здорово, что всё получилось! Я рад, что смог помочь 🙂 Спасибо за вопросы. Возможно, они ещё кого-то выручат.
Дионис Дуров 14 сентября 2018, 17:33 # ↓ 0
Добрый день! Вот появился вопрос. Данные для бд ввёл. А как нужную таблицу обозначить?
P.S. Я вообще тёмный лес в этом вопросе.
Дионис Дуров 14 сентября 2018, 17:49 # ↑ ↓ 0
И можно ли просто файл импорта таблицы чистый ещё?
Алексей Власов 14 сентября 2018, 20:25 # ↓ 0
Спасибо за комментарий!
В данном скрипте для работы с базой данных используется библиотека RedBean PHP. По этой ссылке можно подробнее про неё почитать и посмотреть примеры.
Например, тут $user = R::dispense(‘users’); используется метод dispense, в который передается название таблицы users.
Дионис Дуров 14 сентября 2018, 21:05 # ↑ ↓ 0
Конечно, спасибо за ответ, но какая структура таблицы нужна?
Алексей Власов 14 сентября 2018, 21:55 # ↑ ↓ 0
Можно таблицу и структуру вообще не создавать. Достаточно придумать для таблицы имя, а RedBean PHP уже сам создаст таблицу в БД с правильной структурой
Алексей Власов 14 сентября 2018, 22:09 # ↑ ↓ 0
Вот тут можно скачать дамп базы, там уже есть структура готовая
Дионис Дуров 14 сентября 2018, 21:12 # ↑ ↓ 0
т.е. код в файле db.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»
Алексей Власов 14 сентября 2018, 22:00 # ↑ ↓ 0
db.php трогать не нужно, там просто подключение к БД. Именно к таблице обращаются, когда нужно сделать конкретное действие, например, записать туда данные или изменить их
Дионис Дуров 14 сентября 2018, 22:06 # ↑ ↓ 0
Алексей, если честно, ничего не понял) Тогда где таблицу указывать?
Алексей Власов 14 сентября 2018, 22:13 # ↑ ↓ 0
А для чего её указывать?) Достаточно просто подключиться к своей базе данных и даже, если она будет пустая, то скрипт уже сам все сделает. В файле signup.php уже указывается таблица на 76 строчке
Дионис Дуров 14 сентября 2018, 22:12 # ↑ ↓ 0
т.е. db.php должен быть такой?
require ‘libs/rb.php’;
R::setup( ‘mysql:host=127.0.0.1;dbname=redbeen’,’root’, » );
if ( !R::testconnection() )
{
exit (‘Нет соединения с базой данных’);
}
Тогда где параметры подключения указывать?
Алексей Власов 14 сентября 2018, 22:15 # ↑ ↓ 0
Да, нужно только свои данные ввести от БД
R::setup( ‘mysql:host=127.0.0.1;dbname=имя_вашей_базы’,’ваш_логин_от_бд’, ‘ваш_пароль_от_бд’ );
Дионис Дуров 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)
Дионис Дуров 17 сентября 2018, 14:18 # ↑ ↓ 0
Мне нужно, чтобы заработал этот скрипт
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 «Вы обычный пользователь»;
?>
Дионис Дуров 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Тут можно вывести форму входа
Сергей Медведев 19 октября 2018, 09:18 # ↓ 0
Добрый день!
Реализовал форму регистрации с шифрованием немного отличным от того что преподносится в уроке не стандартным php хешем, a sha1, теперь хотелось бы прикрутить функцию восстановления пароля к примеру Нажимаем восстановить пароль и данные отсылаются на почту указанную в при регистрации. Но что то не особо получается. Подскажите пожалуйста как правильно подцепить к своей форме данную возможность.
Спасибо.
Алексей Власов 19 октября 2018, 14:17 # ↑ ↓ 0
Сергей, добрый день!
Вас интересует алгоритм действий? Я бы ничего восстанавливать не стал, а создал новый рандомный пароль и отправил его на почту:
1. делаем форму восстановления
2. вводим в нее почту, на которую регистрировались
3. проверяем есть ли такая почта в базе
3.1. если нет, то предлагаем создать новый аккаунт
3.2. если есть, то генерируем пароль из N рандомных символов. Кодируем их, как хотим и сохраняем в базу для этой почты
4. шлем письмо с новым паролем
Денис Дёмин 11 декабря 2018, 14:07 # ↓ 0
а как после успешной авторизации сделать редирект на другую страницу?
спасибо
Маша Личная 30 января 2019, 08:49 # ↑ ↓ 0
Маша Личная 30 января 2019, 08:46 # ↓ 0
в signup.php в архиве
на 69 строке var_dump так и весит=)))
везде обманывают=)))
сп за скрипт
Алексей Власов 30 января 2019, 19:30 # ↑ ↓ 0
спасибо за комментарий
действительно обманул 🙁
Сергей Кутузов 24 февраля 2019, 06:38 # ↓ 0
Здравствуйте.
Если я правильно понял, ничего кроме файла bd менять не надо. Если ошибаюсь пожалуйста поправьте.
И ещё, так как я только-только начал вникать в такие дела, подскажите пожалуйста, куда и что прописать, чтоб в на страницу регистрации добавить текстовое поле Несколько слов о себе.
Заранее благодарен. Печенюшки от веб-мастера (если можно так назваться), с главной страницы. Регулярно при заходах
Сергей Кутузов 24 февраля 2019, 06:46 # ↓ 0
Если не ошибаюсь, ничего кроме файла bd менять не надо?
И ещё, так как я только-только начал вникать в эти дела, пожалуйста подскажите, что и куда прописать, чтоб на страницы регистрации добавить поле Немного о себе.
Печеньки к чаю от веб мастера (если можно так назваться), с Главной, регулярно при посещениях.
Алексей Власов 24 февраля 2019, 12:32 # ↑ ↓ 0
Чтобы авторизация заработала достаточно поменять значения в файле bd.
Добавить поле Немного о себе можно в файле signup, например, после самой формы — в самый конец файла
Сергей Кутузов 24 февраля 2019, 06:49 # ↓ 0
Извините, что-то с комментами напутал.
Сергей Кутузов 24 февраля 2019, 10:21 # ↓ 0
Оп-с. Не нашёл рекламы
Денис Дёмин 25 февраля 2019, 12:51 # ↓ 0
prntscr.com/mpr7tz
Извини братское сердце, снова нет больше. Но зато приятно )))
Денис Дёмин 25 февраля 2019, 12:57 # ↓ 0
Вопрос такого плана, а как вывести в страницу профиля поля касающиеся юзера?
и как в форме добавления новых данных в бд сделать так, что бы там была запись, мол добавил данные Иван Иваныч (залогиневшийся пользователь)?
Сергей Кутузов 28 февраля 2019, 10:49 # ↓ 0
И login.php и signup.php и index.php открывается кракозябрами. Переписал их в Notepad++ в utf8, добавил .htaccess в каталог, всё равно кракозябры. Что ещё можно сделать?
Да ещё вопросик. Зип распаковывается папкой authorization_php, в ней ещё одна папка authorization_php, а уж в ней каталог. Так и загружать, или достаточно одной authorization_php с каталогом?
Алексей Власов 28 февраля 2019, 20:16 # ↑ ↓ 0
кодировка должна быть UTF-8 без BOM, в архиве все файлы уже в этой кодировке
загружать надо самую последнюю папку authorization_php
если еще остались вопросы, то можно ознакомиться с видео уроком www.youtube.com/watch?v=vvgOPJQA8Zk
Сергей Кутузов 01 марта 2019, 22:31 # ↓ 0
Никак не хочет к БД подключаться. Страницы есть, но как только введёшь рег. данные и нажмёшь Регистрация, выдаёт Большую ошибку.
В инструкции RedBean сказано:
RedBeanPHP не работает со строгим режимом MySQL. Чтобы отключить строгий режим, выполните следующий SQL-запрос:
Попробовал выполнить, выдало
#1227 — В доступе отказано. Вам нужны привилегии SUPER для этой операции
Или вообще не там копаю. Но в БД таблицы users нет.
На ошибки проверил не раз. И по видео и по коду в статье.
Сайт на хостинге Бегет, но пока на бесплатном тарифе, техподдержки нет.
Скрипт очень нравится, но никак не даётся.
Сергей Кутузов 04 марта 2019, 15:28 # ↓ 0
Подключился после того, как убрал слеш в signup.php в атрибуте формы action. И таблица создалась и страницы авторизации, регистрации и index есть. Большой ошибки больше нет.
Теперь остался последний зихер: капча выдаёт Ответ на вопрос указан не верно! На все ответы.
Подскажите пожалуйста, в чём может быть дело.
Алексей Власов 04 марта 2019, 17:20 # ↑ ↓ 0
Рад, что у вас получилось подключиться к базе.
капча выдаёт Ответ на вопрос указан не верно! На все ответы. — это странно. Капча рабочая, много раз лично тестировал. Если правильно написать ответ, то ошибку выдавать не должно.
Я думаю у вас не работает функция mb_strtolower с русскими буквами. Она находится в файле signup.php на 66 строчке. В ней я не указывал параметр encoding. А если он в явном виде не указан, то вместо него будет использовано значение внутренней кодировки. Вам скорее всего просто нужно в mb_strtolower указать кодировку UTF-8.
Если совсем беда, то просто удалите проверку капчи в файле signup.php и подключите обычную капчу от Google.
Алексей Власов 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’ ) )
Надеюсь, что помог
Сергей Кутузов 04 марта 2019, 17:54 # ↓ 0
Указал кодировку в mb_strtolower. Сейчас регистрирует, но со второго клика. Т.е. первый клик по Зарегистрироваться выдаёт опять Ответ на вопрос не верный, а если ещё раз кликнуть, уже ничего не вводя, то регистрирует.
Может кодировку указал неправильно. Вот так
if ( $_SESSION[‘captcha’] != array_search( mb_strtolower($_POST[‘captcha’], ‘UTF-8’), $answers ) )
Сергей Кутузов 04 марта 2019, 17:59 # ↓ 0
Напишите так:
Да, и так со второго клика. Чудеса.
Сергей Кутузов 04 марта 2019, 21:36 # ↓ 0
Поставил гугловскую капчу. Всё отлично.
Последний вопросик: если добавить поля в форму регистрации, то в БД они появятся автоматически или надо добавлять вручную?
И спасибо за материал. Что ни говори, а благодаря вам есть отличный результат.
Алексей Власов 04 марта 2019, 22:07 # ↑ ↓ 0
Спасибо за комментарии 🙂
Если добавить поля по аналогии с другими полями, которые уже имеются в форме, то таблицы в БД должны автоматически создаваться. Библиотека RedBeanPHP сама всё сделает, главное внимательно прописать имена переменных и ничего не забыть.
Сергей Кутузов 04 марта 2019, 22:11 # ↓ 0
ОК. Спасибо. Не прощаюсь.
Даниил Шрамков 06 марта 2019, 02:13 # ↓ 0
Здравствуйте. Возник небольшой вопросик, RedBean поддерживаеться только на локально сервере? Ато что-то на хостинг не закачивается сам файл RedBean… Ну и ещё одно, не подскажете как реализовать этот код без ОРМ?
Алексей Власов 06 марта 2019, 11:34 # ↑ ↓ 0
RedBean должен поддерживаться любым хостингом. Если файл на хостинг не закачивается, то нужно обратиться к ним в службу поддержки.
Без ОРМ в интернете полно готовых скриптов. Основное преимущество данного скрипта это безопасность, что для формы авторизации критически важно.
Даниил Шрамков 06 марта 2019, 18:51 # ↑ ↓ 0
Спасибо, обращусь в поддержку.
Даниил Шрамков 07 марта 2019, 18:19 # ↑ ↓ 0
Здравствуйте, ещё раз. Вообщем обратился я в техподдержку и с этой проблемой разобрался… теперь появилась соответственно другая ошибка… При подключении в файле db.php всё отлично подключаеться (я проверял на вывод строки Всё норм) но при регистрации новая таблица в базе данных не создается… Как можно решить данную проблему? Нужно снова обращаться в поддержку??
Алексей Власов 07 марта 2019, 21:18 # ↑ ↓ 0
Добрый вечер!
А что хостинг ответил на прошлую проблему? Почему файл не хотел закачиваться?
Что сейчас происходит после регистрации? Появляется надпись – “Вы успешно зарегистрированы!”??
Даниил Шрамков 07 марта 2019, 22:06 # ↑ ↓ 0
Хостинг посоветовал воспользоваться сторонним FTP-сервером, к примеру, FileZilla. Ну я зашёл через прогу и всё подключилось вроде как… По коду получаеться что он вообще начиная с if( isset($data[‘do_signup’]) не выполняеться, а до if всё работает(опять таки вывод строки через echo)… Но при этом всё отлично работает на локалке
Алексей Власов 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);
После этого попробовать снова зарегаться и посмотреть какие ошибки всплывут. А пока слишком мало информации.
Даниил Шрамков 07 марта 2019, 23:49 # ↑ ↓ 0
Вписал вывод ошибок, зарегался. Ничего не показывает… php версия 7.3 и могу изменить её до более старой версии
Даниил Шрамков 07 марта 2019, 23:51 # ↑ ↓ 0
putishestvinik .zzz .com .ua/reg
Вот можете глянуть, ничего не выводиться
Алексей Власов 08 марта 2019, 00:22 # ↑ ↓ +1
у вас данные из формы не отправляются в обработчик (signup.php)
сейчас у формы прописан action=» reg.php «. Я не знаю есть такой файл на FTP или нет, но к нему в любом случае нельзя обратиться из-за редиректа. Скорее всего в htaccess файле прописано правило, которое удаляет у страниц .php
Посмотрите как в примере прописан action у формы и сделайте по аналогии. Убедитесь, что путь к обработчику прописан корректно и он открывается.
Алексей Власов 08 марта 2019, 00:24 # ↑ ↓ 0
попробуйте написать в action не reg.php, а просто reg
Даниил Шрамков 08 марта 2019, 01:21 # ↑ ↓ 0
Сейчас попробую, спасибо
Даниил Шрамков 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):
Даниил Шрамков 08 марта 2019, 12:54 # ↑ ↓ 0
Вообщем код вроде начал работать, ну как минимум все проверки на ошибки работаеют, а при нажатиии на регистрацию выводит эту ошибку
Даниил Шрамков 08 марта 2019, 01:27 # ↑ ↓ 0
Могу сказать одно, теперь значения не удаляются при обновлении странички )
Даниил Шрамков 08 марта 2019, 01:29 # ↑ ↓ 0
И у меня обработчик в том же файле находиться
Даниил Шрамков 08 марта 2019, 17:02 # ↑ ↓ 0
Мне посоветовали почитать здесь, как исправить данную ошибку. Не могу понять как это сделать потому что в настройках баз вообще 0… А ещё у меня хостинг который даёт доступ к 1 базе данных и всё
Даниил Шрамков 08 марта 2019, 22:16 # ↑ ↓ 0
Кажется дошло… На моем хостинге не установлено InnoDB что означает — старая версия MySql… И что мне теперь делать, как обновить mysql?
Алексей Власов 09 марта 2019, 12:50 # ↑ ↓ 0
Вы не обновите самостоятельно mysql. Отправьте запрос в техподдержку, но я думаю, они ничего сделают, потому что хостинг бесплатный.
Даниил Шрамков 09 марта 2019, 20:00 # ↑ ↓ 0
Спасибо большое за помощь 🙁 Мне сказали что передали моё письмо в отдел разработчиков, и надеяться на то что в скором времени обновят…
Сергей Кутузов 06 марта 2019, 14:40 # ↓ 0
А как подключить к файлам находящимся в каталогах уровнем ниже?
Сергей Кутузов 06 марта 2019, 21:31 # ↓ 0
Cпасибо уже подключил
Илья Царев 02 мая 2019, 17:38 # ↓ 0
Доброго времяни суток! При попытки использования Вашего скрипта на своем сайте, все сломалось (заскриптованные кнопки не работают, ссылки тоже, блоки отправились в свободное плавание), а в месте вывода формы авторизации или регистрации вылезает фатльная ошибка: Fatal error: Cannot redeclare class RedBeanPHP\RedException in C:\OSPanel\domains\Carcolor.ru\libs\rb.php on line 6745
Что делать, как быть, спасите
Илья Царев 02 мая 2019, 17:50 # ↑ ↓ 0
Я дурак, осознал, исправил
Илья Царев 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
Дмитрий Егорчатов 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 в ней
Лебедев Евгений 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 не хэширует пароль, когда я тестирую на локальном сервере. Алексей скажите пожалуйста, как это исправить может быть есть команды совместимости?
Денис Дёмин 12 июля 2019, 14:06 # ↓ 0
Очень интересная статья. вполне себе рабочая и грамотная форма авторизации. подскажите, а Вы бы не могли показать как сделать авторизацию PHP+LDAP.
Идея такая, есть локальная сеть, нужно чтобы пользователи через веб интерфейс заходили по своему логину и паролю (учетные записи пользователей Windows) на определенные страницы.
Спасибо большое. Будет очень даже полезный опыт
Заранее благодарен
Александр Простомолотов 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();