Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Сама идея отправки писем с сообщениями сразу на почтовый ящик очень хороша. Но есть и недостатки. Вы можете случайно удалить нужное письмо или оно попадёт в спам и т.д. Неплохо бы сохранять сообщения в надёжном месте, используя какую-нибудь другую функциональность как дополнение к отправке писем.
Для этих целей используется база данных MySQL. И ваша задача - сохранить сообщение в базе данных. База данных MySQL представляет собой набор таблиц, в колонках и рядах которых хранятся данные определённым образом. Удобство баз данных заключается в том, что мы можем извлечь информацию по определённому критерию, например, получить сообщения за прошедшую неделю или только сообщения от пользователей по имени Васька и т.д. Таким образом вы можете анализировать данные.
В большинстве случаев для работы с базами данных MySQL используют популярную программу phpMyAdmin, которая также написана на PHP.
Многие хостинговые компании используют именно эту утилиту для работы с базами данных, поэтому мы тоже будем использовать её. О том, как подключиться к phpMyAdmin, узнавайте у вашего хостера.
Чтобы ввести SQL-запрос в phpMyAdmin, нужно нажать сначала кнопку SQL и в текстовом поле ввести команду. Чтобы выполнить запрос, нужно нажать кнопку OK.
Но мы не будем вводить запросы вручную, так как все необходимые команды будет выполнять PHP-код.
Чтобы вставить новые данные в таблицу базы данных, используется команда INSERT INTO:
INSERT INTO имя_таблицы (имя_колонки1, имя_колонки2, ...) VALUES ('значение1', 'значение2', ... )
Ключевое слово INSERT INTO сообщает, что мы собираемся вставить данные.
Далее идёт имя таблицы, в которую нужно вставить данные.
Потом в скобках перечисляются имена колонок, в которых требуется вставка данных. Не всегда бывает необходимость вставлять данные во все колонки. Не обязательно указывать порядок колонок, как вы создавали в базе. Но обычно стараются придерживаться такого же порядка, чтобы не путаться.
После идёт ключевое слово VALUES, которое сообщает, что далее последует список значений для колонок.
И, наконец, в скобках идёт список данных через запятую, которые нужно вставить в колонки. Количество данных должно совпадать с количеством колонок. А также важен порядок. Первые данные попадут в первую колонку и т.д.
Таблица для сохранения сообщений с сайта может выглядеть следующим образом:
first_name | last_name | when | msg | |
Тогда запрос можно составить таким образом:
INSERT INTO `abduction` (`first_name`, `last_name`, `when`, `email`, `msg`) VALUES ('Арни', 'Шварц', '27 июля', '[email protected]', 'Я всё видел')
Для начала создадим таблицу abduction (Похищение) с помощью phpMyAdmin. При создании таблицы указывается число столбцов. Затем выводится страница настройки таблицы, в которой нужно указать тип данных и другую информацию.
Создадим таблицу в соответствии с скриптом:
CREATE TABLE `abduction` (
`first_name` VARCHAR(30),
`last_name` VARCHAR(30),
`when` VARCHAR(30),
`email` VARCHAR(30),
`msg` VARCHAR(30)
);
Теперь мы можем вручную добавлять данные в таблицу при помощи команды INSERT INTO. Но это не совсем удобно. Нужна автоматизация. PHP позволяет самостоятельно добавлять данные в базу данных, когда пользователь будет заполнять форму.
Осуществление MySQL-запроса с помощью РНР-сценария требует от вас:
Существуют три основные РНР-функции, используемые для обмена информацией с базой данных MySQL:
Кстати, существуют старые функции с префиксом mysql_, которые не следует использовать. Буква i обозначает "улучшенный" (improved).
Функция mysqli_connect() открывает соединение с базой данных MySQL, используя информацию, содержащуюся в четырех параметрах. Укажите адрес размещения сервера (1), имя пользователя (2) и его пароль (3), а также имя базы данных, так как соединение осуществляется с конкретной базой. Как правило, первые три параметра выдаются хостером. Имя базы данных можно задать самостоятельно или тоже выдаётся хостером. Все параметры являются строками и их следует заключить в кавычки. Существует аналогичная функция с первыми тремя параметрами без указания имени базы данных в четвёртом. В этом случае вы можете указать имя базы данных в функции mysqli_select().
Функция mysqli_query() осуществляет запрос к базе данных MySQL (добавление или извлечение данных). Очень часто для имени переменной используют $query.
Сам запрос в методе mysqli_query() может быть очень длинным. Для удобства строку можно разбить для большей читаемости на несколько маленьких строк. Для склейки строк в PHP используется символ точки (.).
Функция mysqli_close() закрывает соединение с базой данных. Если вы не закроете соединение, то ничего страшного не произойдёт. Но сервер баз данных позволяет иметь несколько соединений, работающих одновременно. И при сложном проекте незакрытые соединения, которые вам больше не нужны, будут вызывать тормоза.
Для обработки ошибок можно использовать функцию die(). Функция прерывает ход выполнения сценария и выводит сообщение о коде, который выполнить не удалось. Если что-то не так с одним из четырех аргументов, необходимых для соединения в функции mysqli_connect(), или сервер баз данных не может быть найден, функция die() останавливает ход выполнения сценария и выводит сообщение об ошибке, которое передается ей в качестве аргумента в скобках.
Перепишем пример, который вместо отсылки письма будет добавлять запись в базу данных.
Код будет выглядеть следующим образом (для файла report.php).
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>Поиск пропавших котов - сценарий</title>
</head>
<body>
<h2>Сообщения о поиске моего кота</h2>
<p>Сообщение будет добавлено в базу данных</p>
<?php
$description = $_POST['description'];
$email = $_POST['email'];
$first_name = $_POST['firstname'];
$last_name = $_POST['lastname'];
$when = $_POST['when'];
echo 'Спасибо за заполнение формы.<br>';
echo 'Кота похитили ' . $when . '<br>';
echo 'Похитители: ' . $description . '<br>';
echo 'Ваш email: ' . $email;
$db = mysqli_connect('hosting.com', 'tehnolog', 'qwerty', 'mydatabase')
or die('Error in established MySQL-server connect');
$query = "INSERT INTO abduction (first_name, last_name, email, date, msg) VALUES ('$first_name', '$last_name', '$email', '$when', '$description')";
$result = mysqli_query($db, $query)
or die ('Error in query to database');
mysqli_close($db);
?>
</body>
</html>
Неожиданно встретился с проблемой, когда сценарий не работал. Оказалось, что столбец when конфликтует с ключевым словом when и код не выполнялся. Я заменил имя столбца на date. Строго говоря, это имя тоже является ключевым словом, но почему-то это сработало. Возможно, это из-за особенностей конкретного хостера и его настроек. Но в любом случае лучще давать столбцам таблицы имена, которые не будут совпадать с ключевыми словами воз избежание недоразумений.