Простой пример работы с базой данный в php. Часть 1. Авторизация пользователя.

На тему работы с базой данных существует очень много статей. Но совсем недавно один мой знакомый, начинающий молодой программист, попросил рассказать о простейшей работе с базой данных – создание, редактирование и получение данных. Сначала я решил найти ответ в интернете и предложить ему статью, но либо я не умею пользоваться поисковиком, либо все блогеры-программисты имеют ученые степени и описывают элементарные действия с бд таким языком, что новичку тяжело разобраться с материалом. И поэтому я решил написать статью сам. Я не претендую на какие-либо таланты к учительскому или преподавательскому мастерству, но все же попробую написать статью максимально просто и понятно.

В этой статье я постараюсь по максимуму обойти теоритическую сторону вопроса и как можно больше уделить место практике. Но все же несколько теоретических моментов нужно рассказать.
И так начнем. Начнем с того, что поставим конкретную задачу и попытаемся максимально быстро и правильно ее решить. Перед нами задача: необходимо создать сайт из двух страниц – страница авторизации и страница, которую может посетить только авторизованный пользователь. Так же на этой странице нужно сделать вывод информации о пользователе. Информация о пользователе должно храниться в базе данных.
Задача понятна, составим план выполнения задачи:
1. Спроектируем и создадим бузу данных, в которой будет храниться информация о пользователе.
2. Создадим страницу с авторизацией пользователя
3. Создадим страницу с информацией о пользователе и ограничим к ней доступ.
План прост и понятен. Начнем. Какую информацию о пользователе нужно хранить в базе данных? Всю. Чем больше информации хранится в базе данных, тем более универсальный и динамический будет ваш сайт. Таким образом, создадим базу данных, а в ней создадим таблицу user со следующими полями (столбцами):
Id – В этом поле мы будем хранить числовые значения. И пусть оно заполняется само, при создании новых записей – автоинкрементное значение. Это поле будет первичным ключом. Первичный ключ, должен быть уникальный, он необходим для того, чтобы можно было однозначно обратиться к записи. Другими словами, при каждом новом создании записи поле id будет заполняться автоматически, и всегда будет увеличивать свое числовое значение.
First_name – это поле будет хранить имя пользователя, а значит должно иметь строковый тип. Строковых типов несколько, но давайте выберем varchar и выделим места в целых 255 байт.
Last_name – по своим признакам поле идентично предыдущему, только будет служить для хранения фамилии пользователя.
Login – поле для хранения логина пользователя. Идентично полям для имени и фамилии.
Password – тут будем хранить пароль. Ни чем не отличается от предыдущих полей.
Вот и все, мы за 5 мин спроектировали нашу базу данных. Теперь перейдем непосредственно к ее созданию. Для создания базы данных и таблицы давайте воспользуемся sql-патчем. Вот его код:
Создание базы данных

CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE 'utf8_general_ci';

Создание таблицы user

CREATE TABLE `user` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(255) NULL DEFAULT NULL,
`last_name` VARCHAR(255) NULL DEFAULT NULL,
`login` VARCHAR(255) NULL DEFAULT NULL,
`password` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

И создадим сразу одну запись в таблице, это будет админ с логином admin и паролем 12345:

INSERT INTO `user` (`first_name`, `last_name`, `login`, `password`) VALUES ('админ', 'админов', 'admin', '827ccb0eea8a706c4c34a16891f84e7b');

С первым пунктом нашего плана разобрались. Приступим ко второй части – создадим страницу с авторизацией. За эту страницу у нас будет отвечать скрипт login.php. Ниже я напишу код скрипта, расписывать его работу не буду, но сделаю подробные комментарии в коде.

<?php
	session_start(); // запускаем сессию. 
	/*
	* Чуть позже, если авторизация пройдут успешно, мы запишем в сессию login пользователя. 
	* По этой записи будем проверять, авторизован пользователь или нет
	* Теперь создадим несколько констант, необходимых для работы с базой данных
	* а также сделаем подключение к базе данных
	* обычно все константы и подключения к базе данных для удобства выносятся в отдельный файл 
	* и подключаются по необходимости, но сейчас все сделаем в этом скрипте, чтоб было понятней
	*/
	// константы
	define("HOST", "localhost");
	define("USER", "root");
	define("PASSWORD", "");
	define("DB_NAME", "mydb");
	//подключение к бд
	$db_connect = mysql_connect(HOST, USER, PASSWORD, TRUE); 
	mysql_selectdb(DB_NAME,$db_connect);
	mysql_set_charset('utf8'); // задаем кодировку для работы с бд

	/* 
	* проверяем, если пользователь нажал "OK"
	* то делаем запрос к бд и проверяем существует ли такой пользователь и такой пароль
	* если существует, то создадим запись о пользователе в сессии 
	* и отправим пользователя на другую страницу 
	* Примечание:
	* - Пароль в базе данных хранится в хешированном виде, поэтому сверяем с таким же видом MD5($_POST['pass'])
	* - В данном примере, я полученные данные сразу подставляю в запрос, так делать категорически нельзя. 
	* Обязательно нужно экранировать запросы, но сейчас я этого не делаю умышленно, чтобы код был более понятен
	*/
	if(isset($_POST['login']) && isset($_POST['pass'])){
		$sql = mysql_query("
			SELECT count(*) FROM `user` 
				WHERE `login` = '".$_POST['login']."' 
				AND `password` = '".MD5($_POST['pass'])."';
		") or die(mysql_error());
		$row = mysql_fetch_assoc($sql);
		if($row['count(*)']>0){
			$_SESSION['login'] = $_POST['login'];
			header("Location: /user.php");exit;
		}else{
			echo '<b style="color:red;">Введен не верный логин/пароль!</b>';
		}
	}
?>
<form action="" method="post">
	<span>login: </span><input type="text" name="login" /><br/>
	<span>password: </span><input type="password" name="pass" /><br/>
	<input type="submit" value="OK" />
</form>

Как вы можете видеть все просто.
Теперь последний пункт нашего плана, страница с информацией о пользователе, тут тоже нет смысла что-либо описывать, и поэтому я просто приведу код с подробными комментариями. За эту страницу будет отвечать скрипт user.php, а вот и его код:

<?php
	session_start();
	// константы
	define("HOST", "localhost");
	define("USER", "root");
	define("PASSWORD", "");
	define("DB_NAME", "mydb");
	//подключение к бд
	$db_connect = mysql_connect(HOST, USER, PASSWORD, TRUE); 
	mysql_selectdb(DB_NAME,$db_connect);
	mysql_set_charset('utf8');
	
	//проверяем, авторизовал ли пользователь,
	// если нет, то редиректим его на авторизацию
	if(isset($_SESSION['login'])){
		$sql = mysql_query("
			SELECT * FROM `user` 
				WHERE `login` = '".$_SESSION['login']."';
		") or die(mysql_error());
		$row = mysql_fetch_assoc($sql);
?>
<table>
	<tr>
		<td>id</td>
		<td>first_name</td>
		<td>last_name</td>
	</tr>
	<tr>
		<td><?php echo $row['id']; ?></td>
		<td><?php echo $row['first_name']; ?></td>
		<td><?php echo $row['last_name']; ?></td>
	</tr>
</table>

<?php
	}else{
		header("Location: /login.php");exit;
	}
	
	/*
	для разлогинивания можно использовать такой код
	тут удаляются все сессионные куки и сами сессии
	а потом происходит редирект на авторизацию
	*//*
	unset($_COOKIE[session_name()]);
	unset($_COOKIE[session_id()]);
	session_unset();
	session_destroy();
	header("Location: /login.php");
	exit;
	*/
?>

Вот и все. У нас получилось то, что мы и хотели.
В этой статье я показал, как можно брать информацию из базы данных. Надеюсь, что в ближайшем будущем, также как и сегодня появится свободное время, и я напишу статью о том, как можно делать запись и обновлять еже существующую запись.
Вы можете скачать исходники из этой статьи здесь.

Рассказать друзьям:


Простой пример работы с базой данный в php. Часть 1. Авторизация пользователя.: 5 комментариев

  1. Я начинаюший программист, работаю с денвером, я ввожу логин и пароль и нажимаю ок но почемуто выводиться No database selected, как сделать так чтобы пример заработал

    1. Здравствуйте, проверьте правильность имени базы данных.
      В этой строке: define(«DB_NAME», «mydb»);
      Проверьте, чтобы Ваша база данных называлась — mydb

      1. Не подскажите как зашифровать значение логина и пароля при подключений к БД? чтобы не хранить в открытом виде в файле конфигурации

        1. Этого ни кто не делает, ведь ни кто не может посмотреть файл конфига, кроме людей имеющих доступ к серверу

  2. Спасибо! Работает. Но при удачном вводе пароля у меня происходит переход на несуществующую страницу. Где это подправить? Куда подставить?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*