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

metoda / Ml_ITIn_2013

.pdf
Скачиваний:
17
Добавлен:
16.03.2016
Размер:
6.66 Mб
Скачать

 

241

 

 

DROP INDEX index

Удалить указанный индекс.

RENAME[AS] new_table_name

Переименовать таблицу. в операторе

 

ALTER TABLE

Рис. 3.263. Возможные преобразования оператором ALTER TABLE.

Рассмотрим наиболее типичные случаи употребления ALTER TABLE. Частенько случается так, что Вы вдруг осознаете: какой-то столбец "недостаточно велик", чтобы вместить в себе необходимые данные. Например,в нашей таблице Customers имена и фамилии могут иметь длину до 30 символов. И вскоре может оказаться, что некоторые имена и фамилии слишком длинны и сохраняются в таблице в искаженном виде. Однако это можно исправить, изменив тип данных столбца, после чего он сможет принимать имена и фамилии длиной до 35 символов.

alter table customers

modify name char(35) not null;

Другая часто встречающаяся необходимость связана с добавлением столбца. Представьте, что в каждом регионе существует свой налог с продаж, поэтому магазину приходится учитывать этот налог, но делать это раздельно, поскольку он везде разный. В таблицу Orders потребуется добавить столбец налога:

alter table orders

add tax float(6,2) after amount;

В мониторе результат добавления столбца и состав столбцов таблицы

Orders:

Рис. 3.264. Модифицированный состав структуры таблицы Orders.

Иногда какой-нибудь столбец может оказаться лишним. Удалим столбец, который мы только что добавили:

alter table orders

242

drop tax;

Задание 10. Удаление записей, таблиц и базы данных (DELETE)

Удалять строки из базы данных производится оператором DELETE, который выглядит следующим образом:

DELETE FROM table

[WHERE condition] [LIMIT number]

Если просто записать

DELETE FROM table;

то удаляются все строки в таблице, так что будьте осторожны! Обычно ненужными оказываются какие-то определенные строки и они указываются при помощи конструкции WHERE. Это может случиться, если какая-то книга больше не продается или кто либо из клиентов длительное время ничего не заказывает:

delete from customers where customerid=5;

Ниже (на рис. 3.265) приводится окно монитора с использованием оператора DELETE и результат его работы.

Рис. 3.265. Состав таблицы Customers после удаления пятой строки.

Конструкция LIMIT ограничивает количество удаляемых строк.

Удаление таблиц

Для этого используют оператор DROP TABLE.

DROP TABLE table;

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

243

Удаление целой базы данных

Удаление базы данных осуществляется оператором - DROP DATABASE:

DROP DATABASE database;

В результате удаляются все строки, таблицы, индексы и сама база данных.

Дополнительная информация

В этой теме был рассмотрен обычный SQL, с которым приходится иметь дело при работе с базами данных MySQL.

Если хотите получить дополнительную информацию по SQL, обратитесь к истокам, почитайте о стандартах ANSI SQL, обратившись по адресу: http://www.ansi.org/

Дополнительные возможности MySQL по сравнению с ANSI SQL описаны на Web-сайте MySQL: http://www.mysql.com/.

244

Тема № 14. PHP и MySQL. Доступ к базе данных MySQL из Web с помощью РНР

Цель работы: Получение практических навыков по связке MySQL и

PHP.

В заданиях данной темы используется база данных BOOKS, схема которой представлена на рис. 3.171, создание таблиц осуществлено с помощью SQL-сценария показанного на рис. 3.174. Вы узнаете, как используя PHP читать базу и вносить в нее данные, и как фильтровать потенциально опасные входные данные.

Втеме рассматриваются следующие вопросы:

Как работает архитектура Web-баз данных

Основные шаги выполнения запросов к базе данных через Web

Установка соединения

Получение информации о доступных базах данных

Выбор базы данных

Выполнение запроса к базе данных

Получение результатов запроса

Отсоединение от базы данных

Внесение новой информации в базу данных

Обеспечение безопасности базы данных

Прочие полезные функции PHP-MySQL

Задание 1. Изучение работы архитектуры Web-баз данных

Ранее мы в общих чертах выяснили, как работает архитектура Web-баз данных. Алгоритм работы содержит следующие шаги:

1.Web-браузер пользователя выдает HTTP-запрос определенной Webстраницы. Например, пользователь ищет в таблице BOOKS, все книги, используя HTML-форму (рис. 3.266), исходный код HTML файла Lab15_00.php (рис. 3.267). Страница с результатами поиска будет называться Lab15_01.php (обработчик формы).

2.Web-сервер принимает запрос на Lab15_01.php, извлекает этот файл и передает на обработку механизму РНР.

3.Механизм РНР приступает к разбору сценария. Сценарий содержит команду соединения с базой данных и выполнения запроса (поиска книг). РНР открывает соединение с MySQL-сервером и отправляет соответствующий запрос.

4.Сервер MySQL принимает запрос к базе данных, обрабатывает его и отправляет результат (список книг) обратно механизму РНР.

5.Механизм РНР завершает выполнение сценария, что обычно включает в себя форматирование результатов запроса в HTML файл. После этого результат в виде HTML возвращается Web-серверу.

245

6. Web-сервер пересылает HTML в браузер, и пользователь имеет возможность просмотреть запрошенный список книг.

База данных MySQL с именем BOOKS создана в предыдущей лабораторной работе, поэтому создадим поисковую HTML форму и подготовим код РНР для обработки формы, чтобы проиллюстрировать шаги алгоритма работы архитектуры Web-баз данных.

Начнем с поисковой HTML формы (рис. 3.266). Код для этой формы показан на рис. 3.267 (http://localhost/php/lab15_00.php).

Поисковая страница для базы данных BOOKS:

Рис. 3.266. Начальное содержимое формы (а) и форма с информацией (б).

Рис. 3.267. Листинг Lab15_00.php HTML формы для рис. 3.266.

246

После того как пользователь нажмет на кнопке , вызывается сценарий Lab15_01.php. Все это представлено в листинге (рис. 3.268). Здесь мы рассмотрим, что делает упомянутый сценарий и как он работает.

Рис. 3.268. Листинг сценария обработчика Lab15_01.php формы для рис. 3.266.

247

Lab15_01.php - извлекает результаты запроса в базе данных MySQL и форматирует их для целей отображения.

Если в форму будет введена информация, как показано на рис. 3.266 (б), то результат показан на рис. 3.269.

Рис. 3.269. Результат вывода на экран обработчика Lab15_01.php

Если пользователь в качестве аргумента поиска укажет символ ―М‖ (рис. 3.270), то результат показан на рис. 3.271.

Рис. 3.270. Исходные данные для обработчика Lab15_01.php

Рис. 3.271. Результат вывода на экран обработчика Lab15_01.php

Установка соединения

Для подключения к серверу MySQL в сценарии (рис. 3.268) присутствует такая строка:

@ $db = mysql_pconnect($Host, $User, $Password);

248

Потребуется указать имя узла (Host), на котором размещен сервер MySQL, имя пользователя (User), чтобы войти в него, и пароль (Password). Все это в принципе необязательно и если не указать все вышеперечисленное, функция воспользуется значениями по умолчанию — локальная машина вместо узла, имя пользователя, под которым запущен РНР, и пустой пароль.

В случае успеха функция вернет идентификатор связи с базой данных (который следует сохранить для дальнейшего использования), а в случае неудачи — значение false. Результат не стоит игнорировать, поскольку без соединения с базой данных работа невозможна. Это делает следующий код:

Как альтернативу, можно использовать другую функцию, которая делает практически то же самое — mysql_connect(). Единственное отличие состоит в том, что mysql_pconnect() устанавливает постоянное соединение с базой данных.

Обычное соединение с базой данных закрывается, когда сценарий завершает свое выполнение или когда обращается к функции mysql_close(). Постоянное соединение остается открытым и после того, как сценарий выполнен, а функцией mysql_close() его закрыть нельзя.

Может возникнуть вопрос, для чего это нужно. Ответ таков: соединение с базой данных предполагает некоторые непроизводительные затраты, что требует времени. Когда вызывается mysql_pconnect(), прежде чем она попытается подключиться к базе данных, она автоматически проверит, нет ли уже открытого постоянного соединения. Если есть, она не станет открывать новое. Это и время экономит, и предотвращает перегрузку сервера.

Однако если РНР выполняется как CGI, то постоянное соединение окажется не таким уж и постоянным. (Каждый вызов сценария РНР запускает новую копию механизма РНР и закрывает ее, когда сценарий завершает свою работу. Это, в свою очередь, также закрывает любое постоянное соединение.)

Помните, что количество соединений в MySQL, которые существуют одновременно, ограничено. Границу устанавливает параметр max_connections. Его задача (как и родственного ему параметра Apache MaxClients) — заставить сервер отвергать новые запросы на соединение,

249

когда ресурсы узла заняты или когда программное обеспечение не функционирует.

Значения этих параметров можно изменять, редактируя файл конфигурации. Чтобы настроить MaxClients в Apache, следует править файл httpd.conf. Настройка max_connections в MySQL осуществляется за счет редактирования файла my.conf. Если вы пользуетесь постоянными соединениями, и практически каждой странице на вашем сайте требуется доступ к базе данных, вам понадобится постоянное соединение для каждого процесса Apache. Если же используются значения параметров, принятые по умолчанию, могут возникнуть определенные сложности. По-умолчанию Apache допускает до 150 соединений, a MySQL — только 100. В особо напряженное время соединений может не хватить. Поэтому лучше всего настроить параметры так, чтобы у каждого процесса Web-сервера было свое соединение, конечно, с оглядкой на технические возможности применяемых аппаратных средств.

Выбор базы данных

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

use books;

То же самое необходимо и при подключении из Web. Это может сделать РНР-функция

В результате будет использоваться база данных с именем BOOKS. Можно также использовать соединение с базой данных, для которого требуется выполнить эту операцию (в нашем случае $db), однако, если его не указать, будет использоваться последнее открытое соединение. Если открытое соединение не существует, оно открывается по умолчанию, как если бы вызывалась mysql_connect().

Выполнение запроса к базе данных

Чтобы осуществить запрос, можно воспользоваться функцией mysql_query(). Однако прежде запрос необходимо настроить:

В этом случае будет отыскиваться значение, введенное пользователем ($term), в поле, которое указал пользователь ($search). Вы, наверное, обратили внимание на то, что мы употребили like, отдав ему предпочтение перед equal — толерантность никогда не бывает излишней.

250

Не забывайте, что запрос, отправляемый вами в MySQL, не требует в конце точки с запятой, в отличие от запроса, который вводится в среде монитора MySQL.

Теперь можно выполнить запрос:

В функцию передается запрос, который должен быть выполнен; можно также передать еще и соединение с базой данных (в нашем случае $db). Если его не указать, будет использоваться последнее открытое соединение. Если такового нет, функция откроет соединение точно так же, как при выполнении mysql_connect().

Возможно, вместо функции mysql_query() воспользоваться функцией mysql_db_query(). Рассмотрим ее прототип:

int mysql_db_query(string database, string query, [int database_connection] ) ;

Почти то же самое, только здесь можно указать базу данных, в которой требуется производить поиск. В каком-то смысле это комбинация функций mysql_select_db() и mysql_query().

Обе функции возвращают идентификатор результата (что позволяет получить результаты поиска) в случае успеха и значение false в случае неудачи. Идентификатор результата следует сохранить (так же, как в нашем случае с $result), чтобы извлечь из него некоторую пользу.

Получение результатов запроса

Разнообразие функций дает возможность получить результат различными способами. Идентификатор результата — это ключ доступа к строкам, возвращенным запросом, которых может быть нуль, одна и более.

В нашем примере использовались две функции: mysql_num_rows()

и mysql_fetch_array().

Функция mysql_numrows() сообщает количество строк, которые возвращает запрос. В нее следует передать идентификатор результата.

Это полезно знать, если планируется обрабатывать или отображать результаты. Зная их количество, можно организовать цикл:

Соседние файлы в папке metoda