Автор: Пользователь скрыл имя, 16 Марта 2014 в 15:09, курсовая работа
Стоит заметить, что в 1994 году никаких инструментов для создания различных приложений для Web еще не было, да и сам Web только еще начинался. Поэтому те задачи, которые решала программа Расмуса, были актуальны для очень многих пользователей сети, и к нему хлынул поток писем с просьбами предоставить свой инструментарий. К концу 1997 года два программиста Зив Сураски и Энди Гутманс переписали первоначальный лексический анализатор, и к лету 1998 года в полной мере увидела свет третья версия языка - PHP 3. Развитие PHP стремительно продолжалось, в язык сотнями добавлялись новые функции, и в 1999 году число разработчиков, использующих PHP, превысило 1 миллион, что сделало PHP одним из самых популярных языков для разработки Web - приложений. К этому времени к разработке языка подключилось большое количество программистов со всего мира.
Листинг test_qw.php
<?php
require_once "lib_mysql_qw.php";
require_once "mysql_connect.php";
// Представим, что мы - хакеры...
$name = "' OR '1";
// Допустимый запрос.
echo mysql_make_qw('DELETE FROM people WHERE name=?', $name)."<br>";
// Недопустимый запрос.
echo mysql_make_qw('DELETE FROM people WHERE name=? OR ?', $name)."<br>";
// Вот как выглядит выполнение запроса.
mysql_qw('DELETE FROM people WHERE name=? OR ?', $name)
or die(mysql_error());
?>
В результате работы скрипта будет сгенерирована следующая страница:
DELETE FROM people WHERE name='\' OR \'1'
DELETE FROM people WHERE name=' \ ' OR \ ' 1' OR id=UNKNOWN_PLACEHOLDER_l
Unknown column 'UNKNOWN_PLACEHOLDER_1' in 'where clause1
Перед апострофами в данных появились слэши, a placeholder, которому "не хватило" аргументов функции, оказался замененным на строчку UNKNOWN_PLACEHOLDER_l.
Теперь любая попытка выполнения такого запроса заранее обречена на неудачу (о чем говорит последнее диагностическое сообщение, сгенерированное вызовом die()), что является важным подспорьем при отладке сценариев8.
Рассмотрим некоторые приемы, которые удобно применять в сценариях, требующих обращений к базе данных на примере гостевой книги. С книгой можно проделывать следующие два действия:
- добавлять новую запись; при этом она помечается текущей датой и помещается в таблицу базы данных;
- удалять некоторую запись по ее идентификатору9.
Скрипт упрощен: удалять записи позволяется любому пользователю, а не только администратору сайта. При необходимости ограничить права легко: достаточно вставить в скрипт соответствующие проверки.
Листинг 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);
// Вставляем запись10.
mysql_qw(
'INSERT INTO '.TBLNAME. 'SET name=?, text"?',
$element['name'], $element['text']
)
or die(mysql_error());
// Выполняем "самопереадресацию", чтобы при нажатии кнопки
// "Обновить" в браузере сообщение не добавлялось снова и снова.
Header ("Location: {$_SERVER['SCRIPT_NAME']}?".
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($
$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> </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_
?>
">
[удалить]</a>
<br>
<blockquote>
<?=n12br(htmlspecialchars($
?>
</blockquote>
<hr>
<?
}
?>
Этот скрипт использует удобные на практике приемы.
- Вначале включают код mysql_connect.php для подключения к базе данных, а также библиотеку lib_mysql_qw.php для выполнения "защищенных" запросов11.
Дальше ИСПОЛЬЗУЕТСЯ ТОЛЬКО ФУНКЦИЯ mysql_qw(), и не применяется вызов функции mysql_query() напрямую.
- Создается константа, хранящая имя таблицы гостевой книги в базе данных. Использование константы вместо явного указания имени позволяет в дальнейшем легко сменить имя таблицы (если это понадобится).
- Создается таблица guestbook, имеющая 4 поля (столбца):
- Автоинкрементное поле id, как обычно, служит для идентификации записей.
- Поле stamp типа timestamp хранит время изменения данной записи. Тип timestamp удобен тем, что значение stamp изменяется сервером MySQL автоматически при вставке или модификации записи.
- Благодаря фразе IF NOT EXISTS MySQL создаст таблицу только при первом запуске скрипта, и ничего не будет делать при последующих запусках12.
Рекомендуется всегда создавать таблицы прямо в скриптах, которые с ними работают, потому, что это делает сценарии автономными. К сожалению многие скрипты так не поступают. Обычно к ним прилагается SQL-файл с командами создания таблиц, который нужно запустить перед установкой скриптов. Этот способ не рекомендуется.
- Режим magic_quotes_gpc, устанавливаемый в файле php.ini, заставляет РНР вставлять слэши перед данными, пришедшими из формы. Так разработчики РНР попытались обезопасить программистов, использующих СУБД от распространенной ошибки с апострофами.
Так как мы обрабатываем апострофы самостоятельно (функция mysql_qw()), нам нужно вернуть данные в исходный вид, т. е. убрать из них все лишние слэши13.
Можно подумать, что идея с magic_quotes_gpc хороша, и задаться вопросом: а зачем же вообще нужна функция mysql_qw(), если есть magic_quotes_gpc? Ответ на этот вопрос: данные, помещаемые в базу, могут прийти не только из формы, но и из других источников (a magic_quotes_gpc обрабатывает лишь данные формы).
- Выдавая заголовок Location, мы обеспечиваем так называемую самопереадресацию. Зачем она нужна? Попробуйте убрать вызов Header() (и идущий следом exit()), затем добавить в гостевую книгу запись и тут же нажать кнопку «Обновить» в браузере. Появится запрос: хотите ли вы послать данные формы повторно или нет. Если вы ответите «Да», в книгу добавится еще одна запись, идентичная первой. Если же ответите «Нет», то будет показано старое состояние гостевой книги, без только что добавленной записи. Самопереадресация обеспечивает корректность работы кнопки «Обновить», а добавляемое в query_string текущее время гарантирует, что браузер не станет кэшировать страницу14.
- Интересна 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, что и требовалось.
В качестве проекта было выбрано web-приложение Киноафиши (рисунок 12).
Рисунок 12 – Web - cайт КиноПоиск.Ру.
Для того чтобы вручную создать таблицы в базе данных переходим в phpMyAdmin и слева в меню выбираем нашу БД. После этого ищем на странице поле «Создать новую таблицу в БД» и заполняем данные как показано на изображении(рисунок 13).
Рисунок 13 – Создание Таблицы
Имя – указываем имя таблицы базы данных.
Поля – указываем количество полей в создаваемой таблице базы данных.
После внесения информации сохраняем результат и создаем новую таблицу. В результате этого у нас откроется окно с настройками будущих полей.
Поле – даем имя нашим полям.
Тип – указываем тип данных, которые будут храниться в выбранном поле. Более подробную информацию о типах данных вы можете найти в интернете, воспользовавшись поиском по запросу «Типы данных MySQL».
Длины/Значения – указываем длину будущего поля. Например, если выбран тип VARCHAR, который может хранить до 255 знаков, то в данном поле нужно будет указать длину поля в пределах от 0 до 255 символов. В нашем случае для имени и фамилии, на мой взгляд, вполне будет достаточно 100 символов.
Сравнение – выбираем сравнение для поля. Обычно, выбирается тип сравнения, который отвечает кодировке базы данных.
Дополнительно – можно указать дополнительные свойства. В нашем случае для поля id можно выбрать свойство auto_increment, которое отвечает за автоматическое изменение счетчика. Также для поля ставим переключатель в положение «Первичный ключ», которое говорит о том, что в данном поле значения не могут повторяться.
Остальные поля можно оставить как есть по умолчанию.
После внесения всех данных сохраняем результат и создаем новые поля. Теперь при выборе таблицы слева в меню phpMyAdmin у нас откроется вкладка «Структура» в которой мы можем просмотреть всю информацию по созданным полям.
Если вы по каким-то причинам хотите добавить еще поля в эту таблицу, то для этого выбираем нужную нам таблицу слева в меню phpMyAdmin и в открывшемся окне ищем следующие поля.
В них мы указываем, сколько полей мы хотим добавить и в какое место таблицы. По умолчанию все поля будут добавляться в конец таблицы БД.
Для того чтобы добавить информацию в базу данных через phpMyAdmin, достаточно выбрать нужную таблицу слева в меню phpMyAdmin и перейти во вкладку «Вставить». В результате этого у нас откроется страница с полями для заполнения.
В поле «Значения» вносим информацию, которую мы хотим добавить в базу данных. В нашем случае это имя и фамилия. Поле id оставляется пустым, так как данное поле заполняется автоматически (свойство auto_increment). После внесения всей необходимой информации не забываем сохранить результат.
После сохранения результата переходим во вкладку «Обзор». В результате этого у нас откроется страница, на которой будут отображаться данные, которые находятся в выбранной нами таблице базы данных. В нашем случае данные будут выглядеть следующим образом.
Есть несколько способов работы с MySQL в PHP. Все эти способы появлялись, затем устаревали, заменяясь новыми. И на данный момент самый последний способ - это объекто-ориентированная модель общения с MySQL. Именно с использованием этого самого современного способа мы и будем работать с базами данных.
Прежде, чем перейти к подключение к базе данных в PHP, давайте разберём алгоритм работы с ними:
Подключение.
Отправка запросов и получение результата.
Информация о работе Разработка web - приложениия “КиноПоиск.Ру” на языке PHP