3.3 Пример применения СУБД MySQL

Рассмотрим некоторые приемы, которые удобно применять в сценариях, требующих обращений к базе данных на примере гостевой книги. С книгой можно проделывать следующие два действия:

● добавлять новую запись; при этом она помечается текущей датой и помещается в таблицу базы данных;

● удалять некоторую запись по ее идентификатору.

Скрипт упрощен: удалять записи позволяется любому пользователю, а не только администратору сайта. При необходимости ограничить права легко: достаточно вставить в скрипт соответствующие проверки.

Листинг guestbook.php

<? php ## Простейшая гостевая книга.

require_once "mysql_connect.php";

require_once "lib_mysql_qw.php";

// Имя таблицы.

define("TBLNAME", "guestbook");

// Создаем таблицу, если она еще не существует.

mysql_qw ('CREATE TABLE IF NOT EXISTS '.TBLNAME.' (

id INT AUTO_INCREMENT PRIMARY KEY,

stamp TIMESTAMP,

name VARCHAR(60),

text TEXT

)

')

 or die(mysql_error()) ;

// Обрабатываем кнопки и действия.

if (@$_REQUEST['doAdd'])

{

// Получаем данные из формы.

$element = $_REQUEST['element'];

// Удаляем слэши в данных, которые РНР вставил в режиме

// magic_quotes_gpc (если он включен).

if (ini_get("magic_quotes_gpc"))

$element = array_map('stripslashes', $element);

// Вставляем запись.

mysql_qw(

'INSERT INTO '.TBLNAME. 'SET name=?, text"?',

$element['name'], $element['text']

)

or die(mysql_error());

// Выполняем "самопереадресацию", чтобы при нажатии кнопки

// "Обновить" в браузере сообщение не добавлялось снова и снова.

Header ("Location: {$_SERVER['SCRIPT_NAME']}?".time());

exit ();

}

// Удаление сообщения с указанным ID.

if ($delid = @$_REQUEST['delete'])

{

mysql_qw ('DELETE FROM '.TBLNAME.' WHERE id=?', $delid)

or die(mysql_error());

}

// Выбираем все записи из таблицы, начиная с самой новой.

$result = mysql_qw('

-- Функция MySQL UNIX_TIMESTAMP() конвертирует, timestamp

-- из формата MySQL в число секунд с начала эпохи Unix.

SELECT *, UNIX_TIMESTAMP(stamp) AS stamp

FROM ' . TBLNAME. '

ORDER BY stamp DESC

')

or die(mysql_error());

for ($book=array();

$row=mysql_fetch_array($result);

$book[]=$row);

?>

<! -- Далее идет шаблон книги. -->

<form action="" method="post">

<table>

<tr valign="top">

<td>Baшe имя:</td>

<td><input type ="text" name="element [name] "></td>

</tr>

<tr valign="top">

<td>Teкст сообщения:</td>

<td><textarea name="element[text]" cols="60" rows="5"></textarea></td>

</tr>

<tr>

<td>&nbsp;</td>

<td><input type="submit" name="doAdd" value="Добавить"</td>

</table>

</form>

<hr>

<?

foreach($book as $element)

{

?>

<b>

<? =date ("d.m.Y", $element ['stamp'])?>

<? =htmlspecialchars ($element ['name'])?>

</b>

написал:

<a href="<?=$_SERVER['SCRIPT_NAME']?>?delete=<?=$element['id']

?>

">

[удалить]</a>

<br>

<blockquote>

<?=n12br(htmlspecialchars($element['text']))

?>

</blockquote>

<hr>

<?

}

?>

Этот скрипт использует удобные на практике приемы.

● Вначале включают код mysql_connect.php для подключения к базе данных, а также библиотеку lib_mysql_qw.php для выполнения "защищенных" запросов.

Дальше ИСПОЛЬЗУЕТСЯ ТОЛЬКО ФУНКЦИЯ mysql_qw(), и не применяется вызов функции mysql_query() напрямую.

● Создается константа, хранящая имя таблицы гостевой книги в базе данных. Использование константы вместо явного указания имени позволяет в дальнейшем легко сменить имя таблицы (если это понадобится).

● Создается таблица guestbook, имеющая 4 поля (столбца):

○ Автоинкрементное поле id, как обычно, служит для идентификации записей.

○ Поле stamp типа timestamp хранит время изменения данной записи. Тип timestamp удобен тем, что значение stamp изменяется сервером MySQL автоматически при вставке или модификации записи.

● Благодаря фразе IF NOT EXISTS MySQL создаст таблицу только при первом запуске скрипта, и ничего не будет делать при последующих запусках.

Рекомендуется всегда создавать таблицы прямо в скриптах, которые с ними работают, потому, что это делает сценарии автономными. К сожалению многие скрипты так не поступают. Обычно к ним прилагается SQL-файл с командами создания таблиц, который нужно запустить перед установкой скриптов. Этот способ не рекомендуется.

● Режим magic_quotes_gpc, устанавливаемый в файле php.ini, заставляет РНР вставлять слэши перед данными, пришедшими из формы. Так разработчики РНР попытались обезопасить программистов, использующих СУБД от распространенной ошибки с апострофами.

Так как мы обрабатываем апострофы самостоятельно (функция mysql_qw()), нам нужно вернуть данные в исходный вид, т. е. убрать из них все лишние слэши.

Можно подумать, что идея с magic_quotes_gpc хороша, и задаться вопросом: а зачем же вообще нужна функция mysql_qw(), если есть magic_quotes_gpc? Ответ на этот вопрос: данные, помещаемые в базу, могут прийти не только из формы, но и из других источников (a magic_quotes_gpc обрабатывает лишь данные формы).

● Выдавая заголовок Location, мы обеспечиваем так называемую самопереадресацию. Зачем она нужна? Попробуйте убрать вызов Header() (и идущий следом exit()), затем добавить в гостевую книгу запись и тут же нажать кнопку «Обновить» в браузере. Появится запрос: хотите ли вы послать данные формы повторно или нет. Если вы ответите «Да», в книгу добавится еще одна запись, идентичная первой. Если же ответите «Нет», то будет показано старое состояние гостевой книги, без только что добавленной записи. Самопереадресация обеспечивает корректность работы кнопки «Обновить», а добавляемое в query_string текущее время гарантирует, что браузер не станет кэшировать страницу.

● Интересна SQL-команда

SELECT *, UNIX_TIMESTAMP(stamp) AS stamp

Тип данных TIMESTAMP хранит информацию о времени в следующем представлении: 20051222000307. Первые 4 цифры определяют год, следующие две — месяц, и т. д. В то же время, для функции PHP date()нужен Unix timestamp-формат — число секунд, прошедших с 1 января 1970 года. Чтобы преобразовать первое представление во второе, используется функция UNIX_TIMESTAMP(), встроенная в MySQL. Суффикс " AS stamp " позволяет добавить вычисленное поле под именем stamp к остальным полям, которые были извлечены звездочкой (*).

В итоговый набор данных поле stamp должно бы было добавиться в конец списка полей, и результат должен бы получиться из 5 колонок (id, stamp, name, text и еще другая stamp, полученная при помощи " AS stamp " — не важно, что она имеет то же имя, что и вторая). Однако использование функции mysql_fetch_assoc() "гасит" первое поле stamp и заменяет его значением последнего.

Таким образом, в итоге переменная $row равна массиву из четырех элементов: (id, stamp, name, text), причем stamp идет в формате Unix timestamp, что и требовалось.

● При выводе данных в браузер их в обязательном порядке обрабатывают функцией htmlspecialchars(), чтобы злоумышленник не смог вставить в сообщение теги и "разрушить" структуру страницы. Обратите внимание, что данные хранятся в БД в исходном виде, а их обработка производится уже в самом конце, непосредственно перед выводом. Такая практика позволяет, например, легко написать скрипт редактирования записей в гостевой книге, или же изменить ее дизайн (например, добавить


Информация о работе «Работа с базой данных MySQL средствами PHP»
Раздел: Информатика, программирование
Количество знаков с пробелами: 32804
Количество таблиц: 0
Количество изображений: 25

Похожие работы

Скачать
70189
1
170

... Apache на русском языке: Если открылась начальная страница, значит Apache установлен правильно. ● Перейдите в окно Web-сервера Apache с помощью Панели задач операционной системы Windows и завершите работу сервера с помощью кнопки [X] в правом верхнем углу окна. 1.3. Установка PHP Загрузить дистрибутивов PHP можно с официальной страницы http://www.php.net/downloads.php из секции Windows ...

Скачать
85123
2
8

... от необходимости самим создавать соответствующие программы. Присутствует в ASP и PHP, отсутствует в XML. Создание серверных сценариев. Основа любого языка для создания динамических сайтов. Присутствует в ASP и PHP, отсутствует в XML. Описание данных. Важная функция, позволяющая представлять данные в едином формате, единым способом записи. Отсутствует в ASP и PHP, присутствует в XML. Наличие ...

Скачать
35425
0
0

... и программных решений, на которых основаны. Серверы размещаются в так называемых серверных комнатах. Управление серверами осуществляют системные администраторы. 2. Базы данных   2.1 Понятие базы данных (БД) Основы современной информационной технологии составляют базы данных (БД) и системы управления базами данных (СУБД), роль которых как единого средства хранения, обработки и доступа к ...

Скачать
194681
23
7

... поставленной задачи показала правильность выбранного подхода. Тем не менее, работа требует дальнейше доработаки для организации постоянного доступа читателей к библиографическим ресурсам библиотекам города через Интернет. Литература 1.          Глушаков С.В., Ломотьков Д.В. Базы данных: Учебный курс. – К.: Абрис, 2000. -504с. 2.          Джейсон Мейнджер. Java: основы программирования :Пер ...

0 комментариев


Наверх