Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка_PHP

.pdf
Скачиваний:
26
Добавлен:
09.05.2015
Размер:
2.63 Mб
Скачать

Самостоятельное задание 2.

Усовершенствуйте выражение для проверки пароля:

Пароль не должен совпадать с email-ом, именем, фамилией, отчеством

В пароле должна быть хотя бы 1 цифра и 1 буква

Сохранение информации о пользователях в базе данных.

Для работы с базой данных мы будем использовать возможности PHP– PHP Data Objects (PDO) (требует PHP 5.1 или выше).

1.Для работы с базой данных MySQL запустите сервис MySQL через контрольную панель XAMPP.

Рисунок 5. Запуск MySQL

2.Откройте панель администрирования MySQL базы по ссылке http://localhost/phpmyadmin/ Кликните на закладку базы данных и создайте новую базу данных mydb (рисунок 6).

Рисунок 6. Создание базы данных

3.В файле register.php из предыдущего задания (Sample2/Register.php), удалите эти строчки:

echo "Пользователь зарегистрирован: $fullname <br/>"; echo "Почтовый адрес: $email <br/>";

echo "Хэш-пароля: " . crypt($pass);

и вставьте вместо них код из листинга 10.

try

{

$host = "localhost"; $user = "root"; $pass = "";

$dbname = "mydb";

$con = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

}

catch(PDOException $e)

{

echo($e->getMessage());

file_put_contents('DBErrors.txt', $e->getMessage(), FILE_APPEND);

}

Листинг 10.Подключение к базе данных (файл sample2\register.php)

4.Разбираем код из листинга 10:

4.1.С помощью $con = new PDO(..) мы устанавливаем подключение к базе данных. Для локального сервера хост всегда будет localhost, имя пользователя по умолчанию стоит root, пароль пустой (хотя можно поменять). На реальном хостинге, естественно это значение будут совсем другими.

4.2.PDO может использовать исключения для обработки ошибок. Все операции с PDO должны быть заключены в блок try/catch.

С помощью setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

мы устанавливаем уровень контроля ошибок. С уровнем PDO::ERRMODE_EXCEPTION мы получаем исключение при любой ошибке.

4.3.В блоке catch мы выводим информацию об ошибке (такое лучше делать только для отладки, а для готовых проектов оставлять запись в лог-файл, т.к. некоторые сообщения об ошибках могут содержать сведения, которые могут помочь злоумышленникам в взломе сайта) и добавляем информацию об ошибке в файл DBErrors.txt.

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

Синтаксис SQL запроса на создание таблицы может показаться сложным, поэтому для начала можно создавать таблицы в PhpMyAdmin, а затем получать готовый SQL запрос через закладку Экспорт.

6. Добавьте код из листинга 11 в файл register.php

$host = "localhost"; $user = "root"; $pass = "";

$dbname = "mydb";

$con = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// создаём таблицу, если не существует $createSQL = <<<END

CREATE TABLE IF NOT EXISTS `users`

(

`UserId` int(11) NOT NULL AUTO_INCREMENT, `EMail` varchar(255) NOT NULL, `Password` varchar(32) NOT NULL,

`FName` varchar(255) NOT NULL, `SName` varchar(255) NOT NULL, `MName` varchar(255) NOT NULL, PRIMARY KEY (`UserId`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 END;

// подготавливаем запрос

$query = $con->prepare($createSQL); // выполняем запрос $query->execute();

Листинг 11.Создание таблицы(файл sample2\register.php)

7.Зарегистрируйте нового пользователя через http://localhost/Sample2 и проверьте в PhpMyAdmin, что таблица users была успешно создана.

8.Далее нужно выполнить проверку – существует ли такой пользователь в базе данных?

// подготавливаем запроса

$query = $con->prepare($createSQL);

//выполняем запрос $query->execute();

//проверяем нет ли такого пользователя уже

$query = $con->prepare("SELECT 1 FROM `users` WHERE EMail=?"); $query->bindParam(1, $email);

$query->execute();

$result = $query->fetch();

echo $result ? "Уже зарегистрирован<br/>" : "Ещё не зарегистрирован...<br/>";

Листинг 12.Проверка – создан ли пользователь?(файл sample2\register.php)

Знак вопроса в запросе на выборку (SELECT) – неименованный плейсхолдер (placeholder), следующей строчкой bindParam(1, $email); мы указываем, что вместо 1-ого плейсхолдера должен быть вставлено значение переменной $email. Вставлять переменную в подготовленный запрос так "SELECT 1 FROM `users` WHERE EMail=$email" – небезопасно, в этом случае не выполняется экранирование и запрос становится уязвимым для SQL-инъекций. Например, если пользователь укажет email aaa@mail.ru’; DELETE FROM users;#” то выполнится 2 запроса:

SELECT 1 FROM `users` WHERE EMail= ‘aaa@mail.ru’

DELETE FROM users

И все пользователи будут удалены.

Метод fetch. Метод fetch используется для получения данных. Для получения всех записей, которые вернул запрос SELECT метод fetch следует вызывать в цикле. В данном случае мы вызываем его только 1 раз, этого достаточно, чтобы узнать существует пользователь или нет.

9. Следующий шаг – если пользователь не существует, то добавляем его (листинг 13).

$result = $query->fetch();

echo $result ? "Registered<br/>" : "Not Registered!<br/>";

if (!$result)

{

$query = $con->prepare("INSERT INTO `users` (EMail, Password, FName, SName, MName) VALUES(?, ?, ?, ?, ?)");

$result = $query->execute([$email, $pass, $fname, $sname,

$mname]);

if ($result)

{

echo "Пользователь зарегистрирован!";

}

}

Листинг 13.Добавление пользователя (файл sample2\register.php)

Альтернативный и более удобный способ подстановки плейсхолдеров – это

передача массива в метод execute (порядок элементов должен быть такой же как в

запросе!).

$result = $query->execute( [$email, $pass, $fname, $sname, $mname] );

10.Зарегистрируйте несколько новых пользователей через http://localhost/Sample2

Самостоятельное задание 3.

Добавьте подтверждение регистрации через отправку почтового сообщения.

1.Добавьте в таблицу users новое поле complete_registered (булевское), которое будет по умолчанию FALSE, после подтверждения регистрации будет устанавливаться в TRUE (смотри UPDATE-запрос).

2.Добавить новую таблицу user_confirm, таблица должна содержать некоторая уникальная строка confirm_str для проверки и userid из таблицы users

3.Письмо должно генерироваться функцией mail (только на реальном хостинге)

4.В письме должна быть ссылка на некоторый скрипт, которому запросом GET

передаётся уникальная строка пользователя (confirm_str) (например так http://myHost.ru/regComplete.php?id=98734240432070432098).

5.В скрипте проверяется есть ли такая confirm_str в таблице user_confirm, после чего пользователю регистрация пользователя подтверждается (см. пункт 1) и

такая запись удаляется из таблицы user_confirm.

Приложение 1. Автозагрузка файлов на удалённый сервер.

1.Теперь добавим удалённый сервер (рисунок 5). Файлы будут передаваться по протоколу ftp.

Рисунок 5. Добавление ссылки на удалённый сервер

2.Настроим закладку Connection (рисунок 6).

FTP host может не всегда совпадать с названием сайта, это нужно уточнять в панели управления на сайте, который предоставляет вам хостинг.

Username и Password получаются так же – через панель управления на сайте

(cPanel) или приходят на почту.

Root path – корень сайта, обычно бывает public_html или htdocs.

Рисунок 6. Закладка Connection

3. Настроим закладку Mappings (рисунок 7)

Рисунок 7. Закладка Mappings