Сохранение пользователей в базу данных онлайн урок.


Итак, у нас в распоряжении есть таблица users (id, email, username, password). При этом поля для пароля имеет длину ровно 32, т.к. строки паролей будут хешированы при помощи алгоритма md5. Поэтому тип этого поля будет CHAR.

Для получения хешированного пароля, создадим небольшой класс Password. Он будет состоять из свойств соли, чистого пароля, хешированного пароля. Также поместим туда константу, которая содержит нехешированный текст соли.

class Password
{
const SALT_TEXT = 'Yes, Mr White! Yes, science!';

private $password;
private $hashedPassword;
private $salt;
}


Конструктор будет заполнять эти свойства соответствующими значениями, принимая строку пароля и текст соли в качестве аргументов

function __construct($password, $saltText = null)
{
$this->password = $password;
$this->salt = md5( is_null($saltText) ? self::SALT_TEXT : $saltText );
$this->hashedPassword = md5($this->salt . $password);
}


Для удобства отображения с классом, мы добавим магический метод __toString(), который возвращает хешированный пароль

public function __toString()
{
   return $this->hashedPassword;
}


Это дает нам возможность использовать экземпляр этого класса как строку из пароля.

Осталось добавить скрипт для добавления в базу пользователя, если валидация прошла. Для этого надо создать объект подключения к базе и выполнить соответствующие запросы:

if ($form->validate()) {
$email = $db->escape($form->getEmail());
$username = $db->escape($form->getUsername());
$password = new Password( $db->escape($form->getPassword()) );

$res = $db->query("SELECT * FROM users WHERE username = '{$username}'");
if ($res) {
$msg = 'Such user already exists!';
} else {
$db->query("INSERT INTO users (email, username, password) VALUES ('{$email}','{$username}','{$password}')");
header('location: index.php?msg=You have been registered');
}
}


Обратите внимание на использование объекта $password. Дополнительно мы проверяем, есть ли уже такой пользователь в базе. В конце мы перенаправляемся на индексный файл и выводим сообщение об успехе.