Php соединение с бд. SQL - запросы и их обработка с помощью PHP. Использование механизма транзакций

Средства эффективного хранения и выборки больших объемов информации внесли огромный вклад в успешное развитие Интернета. Обычно для хранения информации используются базы данных. Работа таких известных сайтов, как Yahoo, Amazon и Ebay, в значительной степени зависит от надежности баз данных, хранящих громадные объемы информации. Конечно, поддержка баз данных ориентирована не только на интересы гигантских корпораций -- в распоряжении web-программистов имеется несколько мощных реализаций баз данных, распространяемых по относительно низкой цене (а то и бесплатно).

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

Глава начинается с подробного описания выборки и обновления данных в MySQL -- вероятно, самой популярной СУБД, используемой в PHP (http://www.mysql.com). На примере MySQL будет показано, как в PHP происходят загрузка и обновление данных в базе; мы рассмотрим базовые средства поиска и сортировки, используемые во многих web-приложениях. Затем мы перейдем к реализованной в PHP поддержке ODBC (Open Data Base Connectivity) -- обобщенного интерфейса, который может использоваться для одновременного соединения с разными СУБД. Поддержка ODBC в PHP будет продемонстрирована на примере соединения и выборки данных из базы данных Microsoft Access. Глава завершается проектом, в котором PHP и СУБД MySQL используются для создания иерархического каталога с информацией об избранных сайтах. При включении в каталог новых сайтов пользователь относит их к одной из стандартных категорий, определяемых администратором сайта.

Прежде чем переходить к обсуждению MySQL, я хочу сказать несколько слов об SQL -- самом распространенном языке для работы с базами данных. Язык SQL заложен в основу практически всех существующих СУБД. Чтобы перейти к рассмотрению примеров работы с базами данных, необходимо хотя бы в общих чертах представлять, как работает SQL.

Что такое SQL?

SQL обычно описывается как стандартный язык, используемый для взаимодействия с реляционными базами данных (см. ниже). Однако SQL не является языком программирования, как С, C++ или PHP. Скорее, это интерфейсное средство для выполнения различных операций с базами данных, предоставляющее в распоряжение пользователя стандартный набор команд. Возможности SQL не ограничиваются выборкой данных из базы. В SQL поддерживаются разнообразные возможности для взаимодействия с базой данных, в том числе:

  • определение структуры данных
-- определение конструкций, используемых при хранении данных;
  • выборка данных
  • -- загрузка данных из базы и их представление в формате, удобном для вывода;
  • обработка данных
  • -- вставка, обновление и удаление информации;
  • контроль доступа
  • -- возможность разрешения/запрета выборки, вставки, обновления и удаления данных на уровне отдельных пользователей;
  • контроль целостности данных
  • -- сохранение структуры данных при возникновении таких проблем, как параллельные обновления или системные сбои.

    Обратите внимание: в определении SQL было сказано, что этот язык предназначен для работы с реляционными базами данных. В реляционных СУБД данные организуются в виде набора взаимосвязанных таблиц. Связи между таблицами реализуются в виде ссылок на данные других таблиц. Таблицу можно представить себе как двухмерный массив, в котором расположение каждого элемента характеризуется определенными значениями строки и столбца. Пример реляционной базы данных изображен на рис. 11.1.

    Рис. 11.1. Пример реляционной базы данных

    Как видно из рис. 11.1, каждая таблица состоит из строк (записей) и столбцов (полей). Каждому полю присваивается уникальное (в рамках данной таблицы) имя. Обратите внимание на связь между таблицами customer и orders, обозначенную стрелкой. В информацию о заказе включается короткий идентификатор клиента, что позволяет избежать избыточного хранения имени и прочих реквизитов клиента. В изображенной базе данных существует еще одна связь -- между таблицами orders и products. Эта связь устанавливается по полю prod_id, в котором хранится идентификатор товара, заказанного данным клиентом (определяемого полем custjd). Наличие этих связей позволяет легко ссылаться на полные данные клиента и товара по простым идентификаторам. Правильно организованная база данных превращается в мощное средство организации и эффективного хранения данных с минимальной избыточностью. Запомните эту базу данных, я буду часто ссылаться на нее в дальнейших примерах.

    Итак, как же выполняются операции с реляционными базами данных? Для этого в SQL существует специальный набор общих команд -- таких, как SELECT, INSERT, UPDATE и DELETE. Например, если вам потребуется получить адрес электронной почты клиента с идентификатором 2001cu (см. рис. 11.1), достаточно выполнить следующую команду SQL:

    SELECT cust_email FROM customers WHERE custjd = "2001cu"

    Все вполне логично, не правда ли? В обобщенном виде команда выглядит так:

    SELECT имя_поля FROM имя_таблицы [ WHERE условие ]

    Квадратные скобки означают, что завершающая часть команды является необязательной. Например, для получения адресов электронной почты всех клиентов из таблицы customers достаточно выполнить следующий запрос:

    SELECT cust_email FROM customers

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

    INSERT into products VALUES ("1009pr", "Red Tomatoes", "1.43");

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

    DELETE FROM products WHERE prod_id = 1009r";

    Существует много разновидностей команд SQL, и полное их описание выходит за рамки этой книги. На эту тему вполне можно написать отдельную книгу! Я постарался сделать так, чтобы команды SQL, используемые в примерах, были относительно простыми, но достаточно реальными. В Web существует много учебной информации и ресурсов, посвященных SQL. Некоторые ссылки приведены в конце этого раздела.

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

    Раз вы читаете эту книгу, вероятно, вас интересует вопрос, как же организуется работа с базами данных в среде Web? Как правило, сначала при помощи какого-

    либо интерфейсного языка (PHP, Java или Perl) создается соединение с базой данных, после чего программа обращается к базе с запросами, используя стандартный набор средств. Интерфейсный язык можно рассматривать как своего рода «клей», связывающий базу данных с Web. Я перехожу к своему любимому интерфейсному языку -- PHP.

    Дополнительные ресурсы

    Ниже перечислены некоторые ресурсы Интернета, посвященные SQL. Они пригодятся как новичкам, так и опытным программистам.

    • Учебники по SQL: http://perl.about.com/compute/perl/cs/beginningsql/index.htm .
    • SQLCourse.com (с примером базы данных): http://www.sqlcourse.com .
    • SQL для вундеркиндов Web: http://www.arsdigita.com/books/sql .
    • Введение в SQL (применительно к MySQL): http://www.devshed.com/Server_side/MySQL/Intro .

    Поддержка баз данных в PHP

    Если бы мне предложили назвать самый важный аспект PHP, вероятно, я бы остановился на поддержке баз данных. В PHP реализована обширная поддержка практически всех существующих серверов баз данных, в том числе:

    PostgreSQL
    Solid
    Sybase
    UNIX dbm

    File-Pro (read-only)

    Velods

    Oracle (OCI7 и OC18)

    Как показывает этот список, поддержка баз данных в PHP простирается от совместимости с базами данных, известных всем (например, Oracle), до тех, о которых многие даже не слышали. Мораль -- если вы собираетесь использовать серьезную СУБД для хранения информации, распространяемой через Web, скорее всего, эта база данных поддерживается в PHP. Поддержка базы данных в PHP представлена набором стандартных функций для соединения с базой, обработки запросов и разрыва связи.

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

    Установка

    Одна из причин популярности MySQL среди пользователей PHP заключается в том, что поддержка этого сервера автоматически включается в поставку PHP. Таким образом, вам остается лишь проследить за правильной установкой пакета MySQL СУБД MySQL совместима практически с любой серьезной операционной системой, включая FreeBSD, Solaris, UNIX, Linux и различные верии Windows. Хотя лицензионная политика MySQL отличается большей гибкостью в сравнении с другими серверами баз данных, я настоятельно рекомендую ознакомиться с лицензионной информацией, размещенной на сайте MySQL (http://www.mysql.com).

    Последнюю версию MySQL можно принять с любого зеркального сайта. Полный список зеркальных сайтов приведен по адресу http://www.mysql.com/downloads/ mirrors.html. На момент написания книги последняя стабильная версия MySQL имела номер 3.22.32, а версия 3.32 находилась на стадии бета-тестирования. Конечно, всегда следует устанавливать последнюю стабильную версию, это в ваших интересах. Посетите ближайший «зеркальный» сайт и загрузите версию, соответствующую вашей операционной системе. В верхней части страницы расположены ссылки на новые версии для различных платформ. Обязательно прочитайте всю страницу, поскольку она завершается ссылками для некоторых специфических ОС.

    Группа разработчиков MySQL подготовила подробную документацию с описанием процесса установки. Я советую внимательно изучить все общие аспекты установки, не ограничиваясь информацией, относящейся непосредственно к вашей операционной системе.

    Настройка MySQL

    После успешной установки сервер MySQL необходимо настроить. Процесс настройки в основном состоит из создания новых баз данных и редактирования таблиц привилегий MySQL. Таблицы привилегий управляют доступом к базам данных MySQL. Правильная настройка таблиц играет чрезвычайно важную роль в безопасности ваших баз данных, поэтому перед запуском сайта в рабочем режиме необходимо полностью освоить систему привилегий.

    На первый взгляд, таблицы привилегий MySQL выглядят устрашающе, но если в них как следует разобраться, дальнейшее сопровождение становится очень простой задачей. Полное описание таблиц привилегий выходит за рамки этой книги. Впрочем, в Web существует немало ресурсов, предназначенных для помощи начинающим пользователям MySQL. За дополнительной информацией обращайтесь на сайт MySQL (http://www.mysql.com).

    После успешной установки и настройки пакета MySQL можно начинать эксперименты с базами данных в среде Web! Именно этой теме и посвящен следующий раздел. Начнем с изучения поддержки MySQL в PHP.

    Стандартные функции PHP для работы с MySQL

    Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции PHP, при помощи которых вы сможете легко организовать взаимодействие сценариев PHP с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:

    1. Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.
    2. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.
    3. Обработать запросы к выбранной базе (или базам).
    4. После завершения обработки запросов закрыть соединение с сервером баз данных.

    В примерах этого раздела используются таблицы products, customers и orders (см. рис. 11.1). Если вы захотите самостоятельно проверить все примеры, создайте эти таблицы или скопируйте страницу с описанием структуры, чтобы вам не приходилось постоянно листать книгу.

    Итак, начнем с самого начала -- то есть с подключения к серверу MySQL.

    Функция mysql_connect() устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect():

    int mysql_connect ( [:/путь//к/сокету] [, string имя пользователя] [, string пароль])

    В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры -- номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect() пытается установить связь с локальным хостом.

    Пример открытия соединения с MySQL:

    @mysql_connect(" local host", "web", "4tf9zzzf")

    В данном примере localhost -- имя компьютера, web-- имя пользователя, а 4tf9zzzf -- пароль. Знак @ перед вызовом функции mysql_connect() подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, -- они заменяются сообщением, указанным при вызове die(). Обратите внимание: значение, возвращаемое при вызове rnysql_connect(), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect(), чтобы адресовать последующие команды нужному серверу MySQL. Пример:

    $link1 = @mysql_connect("www.somehost.com", "web", "abcde") or die("Could not connect to

    MySQL server!");

    $linkl = @mysql_connect("www.someotherhost.com", "usr", "secret") or die("Could not connect

    to MySQL server!");

    Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения.

    Функция mysql_pconnect() обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect() вместо mysql_connect() для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect() в точности совпадает c mysql_connect().

    mysql_select_db()

    После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db(). Синтаксис функции mysql_select_db():

    int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения])

    Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор

    которой возвращается функцией mysql_select_db(). Обратите внимание: параметр

    идентификатор_соединения необязателен лишь при одном открытом соединении с

    сервером MySQL. При наличии нескольких открытых соединений этот параметр

    должен указываться. Пример выбора базы данных функцией mysql_select_db():

    or die("Could not connect to MySQL server!");

    Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняявыбранная база данных.

    После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close() закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close() закрывает последнее открытое соединение. Синтаксис функции mysql_close():

    int mysql_close ()

    Пример использования mysql_close():

    @mysql_connect("localhost", "web", "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!"); print "You"re connected to a MySQL database!";

    В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова mysql_close() существует лишь одно открытое соединение с сервером.

    Соединения, открытые функцией mysql_pconnect(), закрывать не обязательно.

    Функция mysql_query() обеспечивает интерфейс для обращения с запросами к базам

    данных. Синтаксис функции mysql_query():

    int mysql_query (string запрос [, int идентификатор_соединения])

    Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соедине-ния, либо, при отсутствии параметра, последнему открытому соединению.

    Неопытные программисты часто ошибочно думают, что функция mysql_query() возвращает результаты обработки запроса. Это не так -- в зависимости от типа запроса вызов mysql_query() может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result() для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE. Функция mysql_result() описана в одном из следующих разделов. Количество записей, участвующих в запросе, определяется при помощи функции mysql_num_rows(). Эта функция также описана далее.

    Учитывая сказанное, я приведу примеры использования mysql_query() лишь после описания функций mysql_result() и mysql_affected_rows().

    Если вас беспокоит то, что при обработке запросов расходуется слишком много памя-ти, вызовите стандартную функцию PHP mysql_free_result. При вызове ей передается идентификатор результата, возвращаемый mysql_query(). Функция mysql_free_result() освобождает всю память, связанную с данным запросом.

    mysqLaff ected_rows ()

    Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows(). Синтаксис функции:

    int mysql_affected_rows ()

    Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws() пытается использовать последнее открытое соединение. Пример:

    // Подключиться к серверу и выбрать базу данных

    @mysql_connect("localhost", "web". "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!");

    // Создать запрос

    $query = "UPDATE products SET prod_name = \"cantaloupe\"

    WHERE prod_id = \"10001pr\";

    // Выполнить запрос

    // Определить количество обновленных записей

    print "Total row updated; ".mysql_affected_rows();

    При выполнении этого фрагмента будет выведен следующий результат:

    Total row updated: 1

    Функция mysql_affected_rows() не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows(), описанная в следующем разделе.

    В одной специфической ситуации функция mysql_affected_rows() работает с ошибкой. При выполнении команды DELETE без секции WHEREmysql_affected_rows() всегда возвращает 0.

    mysql_num_rows()

    Функция mysql_num_rows() определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows():

    int mysql_num_rows(int результат)

    Пример использования mysql_num_rows():

    // Подключиться к серверу и выбрать базу данных @mysql_connect("localhost", "web", "4tf9zzzf")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select company database!");

    // Выбрать все товары, названия которых начинаются с "р"

    $query = "SELECT prod_name FROM products WHERE prod_name LIKE \"p*\"";

    print "Total rows selected: ".mysql_num_rows($result);

    Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:

    Total rows selected: 1

    Функция mysql_result() используется в сочетании с mysql_query() (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():

    int mysql_result (int идентификатор_результата, int запись [. mixed поле"]")

    В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query(). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. Наконец, в необязательном параметре поле могут передаваться:

    • смещение поля в таблице;
    • имя поля;
    • имя поля в формате имя_поля_имя_тдблицы.

    В листинге 11.1 используется база данных, изображенная на рис. 11.1.

    Листинг 11.1. Выборка и форматирование данных в базе данных MySQL

    @mysql_connect("localhost", "web", "ffttss")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company")

    // Выбрать все записи из таблицы products

    $query = "SELECT * FROM products"; $result = mysql_query($query);

    print "

    \n";

    print "

    \n\n\n";

    while ($x < mysql_numrows($result)) :

    $id = mysql_result($result. $x. "prod_id");

    $name = mysql_result($result, $x, "prod_name");

    $price = mysql_result($result. $x, "prod_price");

    print "

    \n";

    print "

    \n\n\n";

    print "

    \n";

    print "

    Product IDProduct NameProduct Price
    $id$name$price
    ";

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

    Листинг 11.2. Результат выполнения листинга 11.1

    Product IDProduct NameProduct Price

    1000pr

    apples

    1.23

    1001pr

    oranges

    2.34

    1002pr

    bananas

    3.45

    1003pr

    pears

    4.45

    Функция mysql_result() удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, -- а именно, функции mysql_fetch_row() и mysql_fetch_array(). Эти функции описаны в следующих разделах.

    mysql_fetch_row()

    Обычно гораздо удобнее сразу присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0), нежели многократно вызывать mysql_result() для получения отдельных полей. Задача решается функцией mysql_fetch_row(), имеющей следующий синтаксис:

    array mysql_fetch_row (int результат)

    Использование функции list() в сочетании с mysql_fetch_row() позволяет сэкономить несколько команд, необходимых при использовании mysql_result(). В листинге 11.3 приведен код листинга 11.1, переписанный с использованием list() и mysql_fetch_row().

    Листинг 11.3. Выборка данных функцией mysql_fetch_row()

    @mysql_connect("localhost", "web", "ffttss") or die("Could not connect to MySQL server!");

    @mysql_select_db("company") or die("Could not select products database!");

    $query = "SELECT * FROM products";

    $result = mysql_query($query);

    print "

    \n";

    print "

    \n\n\n";

    while ($row = mysql_fetch_array($result)) :

    print "

    \n":

    print "

    \n\n\n";

    print "

    \n";

    print "

    Product IDProduct Name

    Product Price

    ".$row["prod_id"]."".$row["prod_name"]."

    " .$row["prod_price"]. "
    ";

    Листинг 11.3 выдает тот же результат, что и листинг 11.1, но использует при этом меньшее количество команд.

    my sq l_f etch_array ()

    Функция mysql_fetch_array() аналогична mysql_fetch_row(), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве. Впрочем, вы можете выбрать тип индексации (ассоциативная, числовая или комбинированная). Синтаксис функции mysql_fetch_array():

    array mysql_fetch_array (int идентификатор результата [, тип_индексации])

    В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query(). Необязательный параметр тип_индексации принимает одно из следующих значений:

    • MYSQL_ASSOC -- функция mysql_fetch_array() возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;
    • MYSQL_NUM -- функция mysql_fetch_array() возвращает массив с числовой индексацией;
    • MYSQL_BOTH -- к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.

    Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array(), возвращающая ассоциативный массив полей.

    Листинг 11.4. Выборка данных функцией mysql_fetch_array()

    @mysql_connect("local host", "web", "ffttss")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company")

    or die("Could not select products database!");

    $query = "SELECT * FROM products";

    $result = mysql_query($query);

    "

    \n";

    print "

    \n\n\n";

    print "

    \n";

    print "

    \n \n \n" ;

    print "

    \n";

    print "

    Product IDProduct Name Product Price
    ".$row["prod_id"]."".$row["prod_name"]."" . $row["prod_price"] . "
    ";

    Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3.

    Того, что сейчас вы знаете о функциональных возможностях MySQL в PHP, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы.

    Пример простейшей поисковой системы на PHP

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

    Поисковая система, приведенная в листинге 11.5, предназначена для поиска информации о клиентах. В форме пользователь вводит ключевое слово и выбирает категорию (имя, идентификатор или адрес электронной почты клиента), в которой будет производиться поиск. Если введенное пользователем имя, идентификатор или адрес существует, поисковая система извлекает из базы данных остальные атрибуты. Затем по идентификатору покупателя из таблицы orders выбирается

    история заказов. Все заказы, оформленные этим клиентом, отображаются по убыванию объема. Если заданное ключевое слово не встречается в категории, указанной пользователем, поиск прекращается, программа выводит соответствующее сообщение и снова отображает форму.

    Листинг 11.5. Простейшая поисковая система (searchengine.php)

    "

    Keyword:


    Search Focus:


    ,

    // Если форма еще не отображалась - отобразить ее

    if (Sseenform != "у") :

    print $form; else:

    @mysql_connect("localhost", "web", "ffttss")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company")

    // Построить и выполнить запрос

    $query = "SELECT cust_id. cust_name, cust_email

    FROM customers WHERE $category = "$keyword"";

    $result = mysql_query($query);

    // Если совпадения не найдены, вывести сообщение

    // и заново отобразить форму

    if (mysql_num_rows($result) == 0) :

    print "Sorry, but no matches were found. Please try your search again:";

    // Найдены совпадения. Отформатировать и вывести результаты, else:

    // Отформатировать и вывести значения полей.

    list($id, $name, $email) = mysql_fetch_row($result);

    print "

    Customer Information:

    ";

    print "Name: $name
    ";

    print "Identification #: $id
    ";

    print "Email: $email
    ";

    print "

    Order History:

    ";

    // Построить и выполнить запрос к таблице "orders"

    $query = "SELECT order_id, prod_id, quantity

    FROM orders WHERE cust_id = "$id"

    ORDER BY quantity DESC";

    $result = mysql_query($query):

    print "

    ";

    print "

    ";

    // Отформатировать и вывести найденные записи.

    while (list($order_id, $prod_id, $quantity) = mysql_fetch_row($result));

    print "

    ";

    print "

    ";

    print "

    ";

    print "

    0rder IDProduct IDQuantity
    $order_id$prod_id$quantity
    ";

    Если ввести ключевое слово Mi 1 апо и выбрать в раскрывающемся списке категорию Customer Name (Имя клиента), программа выводит следующую информацию:

    Customer information:

    Name: Milano

    Identification#: 2000cu

    Email: [email protected]

    Order Id Product Id Quantity
    100003 1000pr 12
    100005 1002pr 11

    Конечно, мы рассмотрели простейшую реализацию поисковой системы. Существует немало дополнительных возможностей -- поиск по нескольким ключевым словам, поиск по неполным ключевым словам или автоматическая выборка записей с похожими ключевыми словами. Попробуйте применить свою творческую фантазию и реализовать их самостоятельно.

    Сортировка таблиц

    При выводе данных из базы необходимо предусмотреть возможность их сортировки по различным критериям. В качестве примера рассмотрим результаты, выведенные нашей поисковой системой, -- обратим особое внимание на следующие после заголовка Order History: (История заказов). Допустим, список получился очень длинным, и вы хотите отсортировать данные по идентификатору товара (или идентификатору заказа). Чтобы вы лучше поняли, о чем идет речь, рекомендую посетить один из моих любимых сайтов, http://download.cnet.com. Если в процессе просмотра программ конкретной категории щелкнуть на заголовке столбца (название, дата размещения, количество загрузок или размер файла), то список автоматически упорядочивается по содержимому указанного столбца. Далее показано, как реализовать подобную возможность.

    В листинге 11.6 мы производим выборку данных из таблицы orders. По умолчанию данные сортируются по убыванию объема заказа (поле quantity). Однако щелчок на любом заголовке таблицы приводит к тому, что страница загружается заново с упорядочением таблицы по указанному столбцу.

    Листинг 11.6. Сортировка таблиц (tablesorter.php)

    // Подключиться к серверу MySQL и выбрать базу данных

    @mysql_connect("localhost". "web", "ffttss")

    or die("Could not connect to MySQL server!");

    @mysql_select_db("company")

    or die("Could not select company database!");

    // Если значение переменной $key не задано, по умолчанию

    // используется значение "quantity" if (! isset($key)) :

    $key = "quantity"; endif;

    // Создать и выполнить запрос.

    // Выбранные данные сортируются по убыванию столбца $key

    $query = "SELECT order_id, cust_id, prod_id, quantity FROM orders ORDER BY $key DESC" $result = mysql_query($query);

    // Создать заголовок таблицы

    print "

    ";

    print "

    ";

    // Отформатировать и вывести каждую строку таблицы

    while (list($order_id,$cust_id,$prod_id, $quantity)

    Mysql_fetch_row($result)) :

    print "

    ";

    print "

    ";

    print "

    ";

    // Завершить таблицу

    print "

    Order ID Customer ID Product ID Quantity

    $order_id$cust_id$prod_id

    $quantity

    ";

    Для базы данных company, изображенной на рис. 11.1, стандартные выходные данные листинга 11.6 выглядят следующим образом:

    Order ID Customer ID Product ID Quantity
    2000cu 1000pr 12
    2000cu 1002pr 11
    2000cu 1000pr 9
    2000cu 1001pr 5
    2000cu 1002pr 3

    Обратите внимание: заголовки таблицы представляют собой гиперссылки. Поскольку по умолчанию сортировка осуществляется по полю quantity, записи отсортированы по убыванию последнего столбца. Если щелкнуть на ссылке Order_ID, страница загружается заново, но на этот раз записи сортируются по убыванию идентификатора заказа. Таблица будет выглядеть так:

    Order ID Customer ID Product ID Quantity
    2000cu 1002pr 11
    2000cu 1000pr 9
    2000cu 1000pr 12
    2000cu 1001pr 5
    2000cu 1002pr 3

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

    На этом наше знакомство с MySQL подходит к концу. Учтите, что материал этой главы отнюдь не исчерпывает всего, что необходимо знать о MySQL. Полный список команд MySQL в PHP приведен в документации (http://www.php.net/manuat).

    ODBC

    Специализированные функции хорошо подходят для работы с одним конкретным типом СУБД. Но что делать, если вам приходится подключаться к MySQL, Microsoft SQL Server и IBM DB2, притом в одном приложении? Аналогичная проблема возникает при разработке приложений, которые не должны зависеть от СУБД; такие приложения работают «над» существующей инфраструктурой клиентской базы данных. ODBC (сокращение от «Open Database Connectivity», то есть «открытая архитектура баз данных») представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. Преимущества подобного подхода очевидны -- вам не придется многократно переписывать один и тот же фрагмент кода только для того, чтобы выполнять одинаковые операции с разнотипными базами данных.

    Работа с сервером баз данных через ODBC возможна лишь в том случае, если этот сервер является ODBC-совместимым. Другими словами, для него должны существовать драйверы ODBC. За дополнительной информацией о драйверах ODBC обращайтесь к документации СУБД. Возможно, вам придется дополнительно загрузить их из Интернета и установить на своем компьютере. Хотя стандарт ODBC, разработанный компанией Microsoft, стал открытым стандартом, он в основном используется для работы с СУБД на платформе Windows; впрочем, драйверы ODBC также существуют и на платформе Linux. Ниже приведены ссылки на драйверы для некоторых популярных СУБД.

    • Драйверы баз данных для Windows 95/98/NT: http://www.microsoft.com/data/odbc
    • Automation Technologies: http://www.odbcsdk.com
    • Easysoft: http://www.easysoft.com/products/oob/main.phtml
    • Драйверы ODBC для MySQL (MyODBC): http://www.mysql.com
    • OpenLinkSoftware: http://www.openlinksw.com

    Драйверы ODBC различаются по целям, платформе и назначению. За информацией о различных аспектах работы с этими драйверами обращайтесь к документации по конкретным пакетам. Впрочем, невзирая на все различия, использование этих драйверов в PHP обходится без проблем.

    Когда вы определите, какой комплект драйверов ODBC лучше подходит для ваших целей, загрузите его и выполните все инструкции по установке и настройке. После этого можно переходить к следующему разделу -- «Поддержка ODBC в PHP».

    Поддержка ODBC в PHP

    Функции ODBC в PHP, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:

    • Adabas D;
    • IODBC;
    • IBM DB2;
    • Solid;
    • Sybase SQL Anywhere.

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

    Поддержка ODBC встроена в комплект поставки PHP, поэтому вам за редкими исключе-ниями практически не придется заниматься специальной настройкой.

    В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в PHP приведен в документации (http://www.php.net/manual).

    Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect(). Синтаксис функции odbc_connect():

    int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])

    Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе"н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:

    • SQL_CUR_USE_IF_NEEDED;
    • SQL_CURSOR_USE_ODBC;
    • SQL_CUR_USE_DRIVER;
    • SQL CUR DEFAULT.

    Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет ODBC не справится с обработкой того или иного запроса.

    Использовать odbc_connect() в программе несложно. Пример:

    Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect() проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.

    После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close():

    void odbc_close ()

    В параметре идентификатор_соединения передается идентификатор открытого соединения. Рассмотрим небольшой пример:

    obdc_connect("myAccessDB", "user", "secret")

    or die("Could not connect to ODBC database");

    print "Currently connected to ODBC database!"; odbc_close($connect);

    Перед непосредственной обработкой запрос необходимо «подготовить». Задача решается функцией odbc_prepare():

    int odbc_prepare (int идентификатор_соединения, string запрос)

    В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect(). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute() (см. ниже).

    Запрос, подготовленный функцией odbc_prepare(), выполняется функцией odbc_execute(). Синтаксис функции odbc_execute():

    int odbc_execute (int идентификатор результата [, array параметры])

    В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare(). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.

    Рассмотрим следующий пример:

    $connect = @obdc_connect("myAccessDB", "user", "secret")

    or die("Could not connect to ODBC database");

    $query = "UPDATE customers SET cust_id = \"Milano, Inc.\"

    WHERE cust_id \"2000cu\"";

    $result = odbc_prepare($connect, $query) or die("Couldn"t prepare query!");

    $result = odbc_execute($result) or die("Couldn"t execute query!");

    odbc_close($connect);

    В приведенном примере продемонстрирована транзакция ODBC, при которой данные запроса не отображаются в браузере (как это обычно делается при использовании команды SELECT). Транзакция ODBC с использованием запроса QUERY описана ниже, в разделе «odbc_result_all()».

    Функция odbc_exec() объединяет odbc_prepare() и odbc_execute(). Синтаксис функции odbc_exec():

    int odbc_exec (int идентификатор_соединения, string запрос)

    В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect(). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:

    obdc_connect("myAccessDB", "user", "secret")

    or die("Could not connect to ODBC database");

    odbc_close($connect) ;

    В этом примере функция odbc_exec() пытается выполнить запрос, текст которого содержится в переменной $query. При успешном выполнении переменной $result присваивается идентификатор результата; в случае неудачи ей присваивается значение FALSE и выводится сообщение, передаваемое при вызове die().

    odbc_result_all()

    Очень удобная функция odbc_result_all() форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec() или odbc_execute(). Синтаксис функции odbc_result_all():

    int odbc_result_all (int идентификатор_результата [, string формат_таблицы])

    В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec() или odbc_execute(). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML. Рассмотрим следующий пример:

    obdc_connect("myAccessDB", "user", "secret")

    or die("Could not connect to ODBC database");

    $query = "SELECT * FROM customers";

    $result = odbc_exec($connect, $query) or die("Couldn"t execute query!");

    odbc_result_all($result, "BGCOLOR="#c0c0c0" border="1" ");

    odbc_close($connect);

    В результате выполнения этого примера содержимое таблицы customers будет выведено в таблице на светло-сером фоне с рамкой толщиной 1. Внешний вид таблицы для данных, приведенных на рис. 11.1, изображен на рис. 11.2.

    Рис. 11.2. Данные ODBC в браузере

    odbc_free_result ()

    Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result(). Синтаксис функции odbc_free_result():

    int odbc_free_result (int идентификатор_результата)

    В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result() необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result(). Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.

    obdc_connect("myAccessDB", "user", "secret")

    or die("Could not connect to ODBC database");

    $query = "SELECT * FROM customers":

    $result = odbc_exec($connect, $query) or die("Couldn"t execute query!");

    odbc_result_all($result, "BGCOLOR="#c0c0c0" border="1" "");

    odbc_free_result($result);

    odbc_close($connect);

    После того как функция odbc_result_all() завершила использование идентификатора результата, память возвращается в систему при помощи odbc_free_result().

    На этом завершается наше знакомство с функциями ODBC в PHP, незаменимыми при создании простых интерфейсов на базе ODBC для доступа через Web. В следующем разделе многие из этих функций будут использованы для демонстрации того, как легко на базе PHP организуется взаимодействие с одной из самых популярных СУБД -- Microsoft Access.

    Microsoft Access и PHP

    Популярность СУБД Microsoft Access (http://www.microsoft.com/office/access) отчасти объясняется ее удобным графическим интерфейсом. Помимо использования Access в качестве самостоятельной СУБД, вы можете использовать ее графический интерфейс для организации работы с другими базами данных -- например, MySQL или Microsoft SQL Server.

    Чтобы продемонстрировать поддержку ODBC в PHP, я опишу процесс подключения к базам данных Microsoft Access на PHP. Делается это на удивление просто, но благодаря популярности Microsoft Access это станет полезным дополнением в вашем творческом арсенале. Я опишу этот процесс шаг за шагом:

    1. Создайте базу данных Access. Предполагается, что вы уже умеете это делать, а если не умеете, но все равно хотите проследить за выполнением этого примера, -- воспользуйтесь услугами программы-мастера. Я создал стандартную базу данных для хранения контактных данных при помощи мастера. Обязательно создайте в таблице несколько записей и запомните имя таблицы, оно нам вскоре понадобится!
    2. Сохраните базу данных на своем компьютере.
    3. На следующем шаге мы организуем доступ к базе Access средствами ODBC. Выполните команду Пуск > Настройка > Панельуправления (Start > Settings > Control Panel). Найдите на панели управления значок Источники данных ODBC (32) (ODBC Data Sources (32 bit)). При помощи этого значка запускается Администратор ODBC, предназначенный для настройки различных драйверов и источников данных в вашей системе. Запустите программу, дважды щелкнув на этом значке. Окно Администратора по умолчанию открывается на вкладке Пользовательский DSN (User DSN). На этой вкладке перечисляются источники данных-, которые относятся к конкретному пользователю и могут использоваться только на этом компьютере. В данном примере будет использоваться именно такой источник данных.
    4. Нажмите кнопку Добавить... (Add...) в правой части окна. Открывается новое окно для выбора драйвера, предназначенного для работы с новым источником. Выберите строку Microsoft Access Driver (*.mdb) и нажмите кнопку Finish (Готово).
    5. На экране появляется новое окно Установка драйвера ODBC для Microsoft Access (ODBC Microsoft Access Setup). Найдите в форме текстовое поле Имя источника данных (Data Source Name) и введите в нем имя созданной вами базы данных Access. При желании можете ввести описание в текстовом поле, расположенном непосредственно под полем Имя источника данных.
    6. Нажмите кнопку Выбрать... (Select...) -- появляется окно в стиле Проводника Windows. В нем вам предлагается найти базу данных, доступ к которой будет осуществляться средствами ODBC.
    7. Найдите в дереве каталогов свою базу данных и дважды щелкните на ней. Вы снова возвращаетесь к окну Установка драйвера ODBC для Microsoft Access. Путь к выбранной базе данных отображается над кнопкой Выбрать.... Нажмите кнопку ОК.
    8. Готово! Теперь вы можете работать с базой данных Access средствами ODBC.

    Все, что вам остается сделать -- создать сценарий, в котором вы будете работать с базой данных через ODBC. В приведенном ниже сценарии общие функции ODBC (см. выше) будут использоваться для вывода всей информации из таблицы контактов, созданной при помощи мастера Access. Однако перед рассмотрением сценария желательно знать, как таблица Contacts выглядит в Access (рис. 11.3).

    Рис. 11.3. Таблица Contacts в MS Access

    Теперь вы знаете, какая информация будет извлекаться из базы данных, и мы можем перейти к сценарию. Если вы забыли, что делает та или иная функция, обращайтесь к описанию в начале этой главы. Результаты работы листинга 11.7 представлены на рис. 11.4.

    Листинг 11.7. Применение функций ODBC для работы с MS Access

    // Подключиться к источнику данных ODBC "ContactDB" ;connect = odbc_connect("ContactDB", "","")

    or die("Couldn"t connect to datasource.");

    // Создать текст запроса

    $query = "SELECT First_Name, Last_Name, Cell_Phone, Email FROM Contacts";

    // Подготовить запрос

    $result = odbc_prepare($connect,$query);

    // Выполнить запрос и вывести результаты

    odbc_execute($result);

    odbc_result_all($result, "BGCOLOR="#c0c0c0" border=1");

    // Обработка результатов закончена, освободить память odbc_free_result($result);

    // Закрыть соединение odbc_close($connect);

    Не правда ли, все просто? А самое замечательное -- то, что этот сценарий полностью совместим с любой другой СУБД с поддержкой ODBC. Для тренировки попробуйте повторить все описанные действия для другой СУБД, запустите сценарий -- и вы получите те же результаты, которые изображены на рис. 11.4.

    Рис. 11.4. Содержимое таблицы Contacts в web-браузере

    Проект: Каталог ссылок на PHP

    Самый простой способ наполнить ваш сайт реальным содержанием -- дать пользователю возможность сделать это за вас. Конечно, для ввода данных удобнее всего воспользоваться формой HTML.

    Введенную пользователем информацию необходимо обработать и сохранить. В проекте предыдущей главы было показано, как легко эта задача решается при помощи PHP и текстового файла. Бесспорно, текстовые файлы хорошо подходят для хранения относительно маленьких и простых фрагментов данных, но в полноценных web-приложениях информация обычно хранится в базах данных. В настоящем примере база данных MySQL используется для хранения информации о web-сайтах. Для упрощения навигации сайты разделены на несколько категорий. Пользователь может ввести информацию о сайте в форме HTML и отнести его к одной из стандартных категорий, определенных администратором сайта. Кроме того, пользователь может загрузить индексную страницу и просмотреть список всех сайтов той или иной категории, щелкнув на ее названии.

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

    mysql>create table bookmarks (category INT, site_name char(35), url char(50),

    date_added date, description char(254));

    В определении таблицы bookmarks имеется пара моментов, заслуживающих внимания. Во-первых, информация о категории сайта почему-то хранится в виде целого числа -- но разве не правильнее было бы сделать названия категорий более содержательными и понятными для пользователя? Не беспокойтесь, в ини-циализационном файле будет создан массив, связывающий целочисленные индексы с названиями категорий. В будущем администратор может изменять и даже удалять отдельные категории. Хранение информации о категориях заметно упрощает эту задачу. Кроме того, целочисленное поле обеспечивает экономию места на диске, поскольку название категории многократно сохраняется в таблице. Другое обстоятельство, относящееся к структуре таблицы, -- ограничение длины описания 254 символами. В зависимости от этого объема описаний вместо типа char() можно воспользоваться типом medium или text. За дополнительной информацией о типах полей обращайтесь к документации MySQL.

    Следующим шагом в работе над этим приложением будет создание инициализа-ционного файла. Помимо глобальных переменных, в инициализационном файле определяются две функции: add_bookmark() и view_bookmark(). Функция add_bookmark() получает пользовательский ввод из формы и включает его в базу. Функция view_bookmark() получает индекс категории, читает из базы данных все записи, относящиеся к указанной категории, и отображает их в браузере. Инициализацион-ный файл приложения init.inc с комментариями приведен в листинге 11.8.

    Листинг 11.8. Инициализационный файл каталога ссылок (init.inc)

    // Файл: init.inc

    // Назначение: глобальные переменные и функции.

    // используемые в проекте

    // Стандартный заголовок страницы $title = "My Bookmark Repository":

    // Цвет фона $bg_color = "white";

    $post_date = date("Ymd");

    "entertainment",

    // Данные сервера MySQL $host = "localhost"; $user = "root"; $pswd = "";

    // Имя базы данных $database = "book";

    // Имя таблицы $bookmark_table = "bookmarks";

    // Цвет ячеек таблицы $cell_color = "#c0c0c0";

    // Установить соединение с сервером MySQL

    @mysql_pconnect($host, $user, $pswd) or die("Couldn"t connect to MySQL server!");

    // Выбрать базу данных

    @mysql_select_db($database) or die("Couldn"t select Sdatabase database!");

    // Функция: add_bookmark()

    function add_bookmark (Scategory, Ssitejname. $url, $description) {

    GLOBAL $bookmark_table, $post_date;

    $query = "INSERT INTO $bookmark_table

    VALUES(\"$category\", \"$site_name\", \"$url\", \"$post_date\", \"$description\")";

    $result = @mysql_query($query) or die("Couldn"t insert bookmark information!");

    } // add_bookmark <

    // Функция: view_bookmark()

    // Назначение: выборка из таблицы bookmark всех ссылок,

    function view_bookmark ($category) {

    GLOBAL $bookmark_table, $cell_color, $categories;

    $query = "SELECT site_name, url, DATE_FORMAT(date_added,"%m-%d-%Y") AS date_added, description

    FROM $bookmark table WHERE category = $category ORDER BY datejdded DESC";

    $result = @mysql_query($query);

    print "

    ";

    print "

    ";

    if (mysql_numrows($result) > 0) ;

    while ($row = mysql_fetch_array($result)) ;

    Posted: ".$row["date added"]."
    "

    print "

    ";

    print "

    ";

    print "

    ";

    print "

    ";

    print "

    ";

    print "

    Category: $categories[$category]
    ";

    print "".$row["site_name"]."

    print "

    ";

    print "http://".

    $row["url"]."
    ";

    print "

    ";

    print $row["description"]."
    ";

    print "


    There are currently no bookmarks falling under this category. Why don"t you add one?
    Return to index

    print "Add a bookmark

    ";

    // view bookmark

    Следующая страница, add_bookmark.php (листинг 11.9), предназначена для ввода информации о новой ссылке, включаемой в базу данных. Для обработки пользовательских данных вызывается функция add_bookmark().

    Листинг 11.9. Программа add_bookmark.php

    INCLUDE("init.inc");

    <?=$title:?>

    if (! $seenform) :

    <1nput type="hidden" name="seenform" value="y">

    Category:


    Site Name:


    URL: (do not include "http://"!)


    Description:


    add_bookmark($category, $site_name, $url, $description);

    print "

    Your bookmark has been added to the repository.

    Click here to return to the index.

    ";

    При исходной загрузке страницы в браузере отображается форма (рис. 11.5).

    Рис. 11.5. Форма, отображаемая страницей add_bookmark.php

    Следующая страница, view_bookmark.php, просто вызывает функцию view_bookmark(). Код этой страницы приведен в листинге 11.10.

    Листинг 11.10. Программа view_bookmark.php

    INCLUDE("Listing11-8.php"); ?>

    <?=$title:?>

    view_bookmark($category) :

    Рис. 11.6. Выполнение страницы view_bookmark.php для категории dining

    Остается лишь создать страницу, на которой пользователь выбирает ссылки из списка. Я назвал этот файл index.php (листинг 11.11).

    Листинг 11.11. Программа index.php

    INCLUDE("init.inc");

    alink="#808040">

    while (list($key, Svalue) = each(Scategories)) :

    print "$value
    ";

    Add a new bookmark

    Если оставить в массиве $categories значения, сохраненные в файле init.inc, в результате выполнения листинга 11.11 в браузер будет отправлен код HTML, приведенный в листинге 11.12.

    Листинг 11.12. Выходные данные, сгенерированные при выполнении index.php

    Choose bookmark category to view:

    computers

    entertainment

    dining

    lifestyle

    government

    travel

    Add a new bookmark

    Итоги

    Эта глава получилась довольно большой, причем для некоторых читателей она может оказаться самой важной во всей книге. Бесспорно, работа с базами данных

    относится к числу самых заметных возможностей языка PHP, поскольку базы данных заметно расширяют функциональные возможности web-сайтов. В частности, мы рассмотрели следующие темы:

    • общие сведения о SQL;
    • стандартную поддержку баз данных в PHP;
    • вводную информацию о сервере MySQL;
    • стандартные функции PHP для работы с MySQL;
    • реализацию простейшей поисковой системы;
    • сортировку таблиц;
    • общие сведения об ODBC;
    • стандартные функции PHP для работы с ODBC;
    • взаимодействие с Microsoft Access в PHP;
    • хранение пользовательских данных на web-сайте.

    Читателю, занимающемуся разработкой больших, подлинно динамических web-сайтов на PHP, предстоит снова и снова возвращаться к теме баз данных. Я рекомендую тщательно изучить не только документацию PHP, но и другие ресурсы, посвященные технологиям баз данных. В этой области, как и во многих современных технологиях, даже эксперты не всегда успевают следить за всеми новшествами.

    Следующая глава посвящена шаблонам -- одной из нетривиальных тем web-программирования. Применение шаблонов при программировании на PHP обеспечивает заметную экономию времени и усилий при работе над крупномасштабными web-сайтами.

    РАБОТА С БАЗОЙ ДАННЫХ MySQL СРЕДСТВАМИ РНР

    Лекция. Подготовлена Прохоровым В.С.


    1. СОЕДИНЕНИЕ РНР-СЦЕНАРИЕВ с таблицами MySQL

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

    При взаимодействии РНР и MySQL программа взаимодействует с СУБД посредством совокупности функций.

    1.1 Соединение с сервером. Функция mysql_connect

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

    resource mysql_connect(]])

    Эта функция устанавливает сетевое соединение с базой данных MySQL, расположенной на хосте $server (по умолчанию это localhost, т.е. текущий компьютер) и возвращает идентификатор открытого соединения. Вся дальнейшая работа ведется именно с этим идентификатором. Все другие функции, принимающие этот идентификатор (дескриптор) в качестве аргумента, будут однозначно определять выбранную базу данных. При регистрации указывается имя пользователя $username и пароль $password (по умолчанию имя пользователя, от которого запущен текущий процесс – при отладке скриптов: root, и пустой пароль):

    $dbpasswd = ""; //Пароль

    //Выводим предупреждение

    echo("

    ");

    Переменные $dblocation, $dbuser и $dbpasswd хранят имя сервера, имя пользователя и пароль.

    1.2 Разрыв соединения с сервером. Функция mysql_close

    Соединение с MySQL – сервером будет автоматически закрыто по завершении работы сценария, либо же при вызове функции mysql_close

    bool mysql_close ()

    Эта функция разрывает соединение с сервером MySQL, и возвращает true при успешном выполнении операции и false в противном случае. Функция принимает в качестве аргумента дескриптор соединения с базой данных, возвращаемый функцией mysql_connect.

    $dblocation = "localhost"; //Имя сервера

    $dbuser = "root"; //Имя пользователя

    $dbpasswd = ""; //Пароль

    //Осуществляем соединение с сервером базы данных

    //Подавляем вывод ошибок символом @ перед вызовом функции

    $dbcnx = @ mysql_connect($dblocation, $dbuser, $dbpasswd);

    if (!$dbcnx) //Если дескриптор равен 0, соединение не установлено

    //Выводим предупреждение

    echo("

    B настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.");

    if (mysql_close($dbcnx)) //разрываем соединение

    echo("Соединение с базой данных прекращено");

    echo("He удалось завершить соединение");

    1.3 Создание базы данных. Функция CREATE DATABASE

    Команда - создание базы данных доступна только администратору сервера, и на большинстве хостингов ее нельзя выполнять:

    CREATE DATABASE ИмяБазыДанных

    Создает новую базу данных с именем имяБазыданных.

    Пример работы с этой функцией:

    @mysql_query("CREATE DATABASE $dbname");

    Рекомендуется везде использовать апострофы ("SQL – команда") в качестве ограничителей строк, содержащих SQL – команды. Этим можно гарантировать, что никакая $ - переменная случайно не будет интерполирована (т.е. не заменится на свое значение), и увеличится безопасность скриптов.

    Команда создания базы данных CREATE DATABASE доступна только суперпользователю, и на большинстве хостингов простому пользователю ее выполнить невозможно. Она доступна только администратору сервера.

    Для экспериментов создадим базу данных testbase, выполнив SQL-запрос из командной строки. Для этого нужно войти в систему MySQL и ввести в командной строке MySQL:

    mysql> create database testbase;

    После этого следует набрать:

    mysql>use testbase;

    База данных создана:



    1.4 Выбор базы данных. Функция mysql_select_db

    До того как послать первый запрос серверу MySQL, необходимо указать, с какой базой данных мы собираемся работать. Для этого предназначена функция mysql_select_db:

    bool mysql_select_db(string $database_name [,resource $link_identifier])

    Она уведомляет PHP, что в дальнейших операциях с соединением $link_identifier будет использоваться база данных $database_name.

    Использование этой функции эквивалентно вызову команды use в SQL-запросе, т. е. функция mysql_select_db выбирает базу данных для дальнейшей работы, и все последующие SQL-запросы применяются к выбранной базе данных. Функция принимает в качестве аргументов название выбираемой базы данных database_name и дескриптор соединения resource. Функция возвращает true при успешном выполнении операции и false - в противном случае:

    //Код соединения с базой данных

    if (! @mysql_select_db($dbname, $dbcnx))

    //Выводим предупреждение

    echo("

    B настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно. ");

    1.5 Обработка ошибок

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

    Важно аккуратно и своевременно использовать эти функции, потому что иначе отладка сценариев может усложниться.

    ● Функция:

    int mysql_errno ()

    возвращает номер последней зарегистрированной ошибки. Идентификатор соединения $link_identifier можно не указывать, если за время работы сценария было установлено только одно соединение.

    ● Функция:

    string mysql_error()

    возвращает не номер, а строку, содержащую текст сообщения об ошибке. Ее удобно применять в отладочных целях. Обычно mysql_error используют вместе с конструкцией or die (), например:

    @mysql_connect("localhost", "user", "password")

    or die("Ошибка при подключении к базе данных: ".mysql_error());

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

    В последних версиях РНР предупреждения в MySQL-функциях по умолчанию не регистрируются.

    1.6 Автоматизация подключения к MySQL. Файл ( config.php )

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

    Код, ответственный за подключение к MySQL рекомендуется выделить в отдельный файл, а затем подключать с помощью функции include к нужным скриптам.

    Имеет смысл помещать функции для соединения, выбора и создания базы данных в тот же файл (config.php), где объявлены переменные с именем сервера $dblocation, именем пользователя $dbuser, паролем $dbpasswd и именем базы данных $dbname:

    Листинг config.php:

    //config.php код файла, содержащего параметры соединения с сервером и выбора базы данных

    //выводит сообщения об ошибках соединения в браузер

    $dblocation = "localhost"; //Имя сервера

    $dbname = "вставить имя базы" //Имя базы данных: создаваемой или уже существующей

    $dbuser = "root"; //Имя пользователя базы данных

    $dbpasswd = ""; //Пароль

    //Осуществляем соединение с сервером базы данных

    //Подавляем вывод ошибок символом @ перед вызовом функции

    $dbcnx=@mysql_connect($dblocation,$dbuser,$dbpasswd);

    if (!$dbcnx) //Если дескриптор равен 0, соединение с сервером базы данных не установлено

    //Выводим предупреждение

    echo("

    В настоящее время сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.

    ");

    //Создаем базу данных $dbname – это может делать только суперпользователь

    //Если база данных уже существует, будет некритическая ошибка

    @mysql_query("CREATE DATABASE if not exists $dbname’);

    //Код соединения с базой данной: осуществляем однозначный выбор только что созданной базы или уже существующей базы данных

    //Подавляем вывод ошибок символом @ перед вызовом функции

    if(!@mysql_select_db($dbname, $dbcnx)) //Если дескриптор равен 0, соединение с базой данных не установлено

    //Выводим предупреждение

    echo("

    В настоящее время база данных не доступна, поэтому корректное отображение страницы невозможно.

    ");

    //Небольшая вспомогательная функция, которая выводит сообщение

    //об ошибке в случае ошибки запроса к базе данных

    function puterror($message)

    echo("");



    2. ВЫПОЛНЕНИЕ ЗАПРОСОВ К БАЗЕ ДАННЫХ

    2.1 Создание таблицы. Функция CREATE TABLE:

    CREATE TABLE Имя Таблицы (ИмяПоля тип, ИмяПоля тип,)

    Этой командой в базе данных создается новая таблица с колонками (полями), определяемыми своими именами (ИмяПоля) и указанными типами. После создания таблицы в нее можно будет добавлять записи, состоящие из перечисленных в данной команде полей.

    Листинг test_11.php. Программа, создающая новую таблицу в базе данных:

    include "config.php";//Подключение к серверу и выбор базы данных

    mysql_query("CREATE TABLE if not exists people

    id INT AUTO_INCREMENT PRIMARY KEY,

    or die("MySQL error: ".mysql_error());



    Этот сценарий создает новую таблицу people с двумя полями. Первое поле имеет тип INT (целое) и имя id. Второе - тип TEXT (текстовая строка) и имя name.

    Если таблица существует, сработает конструкция or die ().

    Необязательная фраза if not exists, если она задана, говорит серверу MySQL, что он не должен генерировать сообщение об ошибке, если таблица с указанным именем уже существует в базе данных.

    3 метода подключения к MySQL с PHP с примерами кода


    Чтобы начать пользоваться базой данных MySQL, надо в первую очередь понять, как подключиться из вашей пользовательской PHP-программы (скрипта) к этой самой базе данных MySQL.

    В этой статье описаны следующие три метода, а также соответствующие примеры PHP-кода, в которых объясняется, как подключиться к вашей базе данных из PHP.

    Для всех приведенных ниже примеров мы будем подключаться к уже существующей базе данных MySQL. Примечание: все, что объясняется здесь, также будет работать с MariaDB, так же как и с MySQL.

    1. Подключение к PHP с помощью расширения mysqli
    *mysqli означает MySQL Improved

    Создайте следующий файл mysqli.php

    connect_error) { die("Ошибка: невозможно подключиться: " . $conn->connect_error); } echo "Подключились к базе.
    "; $result = $conn->query("SELECT id FROM goroda"); echo "Количество строк: $result->num_rows"; $result->close(); $conn->close(); ?> В приведенном выше коде:

    • mysqli - эта функция инициирует новое соединение с использованием расширения mysqli. Функция принимает четыре аргумента:
      1. localhost имя хоста, на котором запущена база данных MySQL
      2. name - имя пользователя MySQL для подключения
      3. pass - пароль для пользователя mysql
      4. db - база данных MySQL для подключения.
    • qvery - функция запроса MySQL. В этом примере мы выбираем столбец id из базы данных городов.
    • Наконец, мы показываем количество строк, выбранных с использованием переменной num_rows в результате. Мы также закрываем как результат, так и переменную соединения, как показано выше.
    Когда вы вызываете вышеуказанный mysqli.php из своего браузера, вы увидите следующий вывод, который указывает, что PHP смог подключиться к базе данных MySQL и получить данные.

    Подключились к базе. Количество строк: 6 2. Подключение из PHP MySQL PDO Extension
    *PDO означает объекты данных PHP

    Драйвер PDO_MYSQL реализует интерфейс PDO, предоставляемый PHP, для подключения из вашего PHP-скрипта к базе данных MySQL.

    Создайте следующий файл mysql-pdo.php:

    setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Подключились к базе.
    "; $sql = "SELECT id FROM goroda"; print "Список id:
    "; foreach ($conn->query($sql) as $row) { print $row["id"] . "
    "; } $conn = null; } catch(PDOException $err) { echo "Ошибка: невозможно подключиться: " . $err->getMessage(); } ?> В приведенном выше:

    • new PDO - создаст новый объект PDO, который примет следующие три аргумента:
      1. mysql connect string: он будет в формате «mysql:host=localhost;dbname=db». В приведенном выше примере db работает на localhost, и мы подключаемся к базе данных db.
      2. Имя пользователя MySQL для подключения
      3. Пароль для пользователя mysql
    • переменная $sql - создать запрос sql, который вы хотите выполнить. В этом примере мы выбираем столбец id из таблицы городов.
    • query ($sql). Здесь мы выполняем запрос sql, который мы только что создали.
    • foreach. Здесь мы перебираем результат из указанной выше команды запроса и сохраняем ее в переменной $row, а затем выводим ее с помощью echo.
    • В MySQL PDO, чтобы закрыть соединение, просто установите переменную $conn в значение null.
    Когда вы вызываете вышеуказанный скрипт mysqli.php из своего браузера, вы увидите следующие строки; они означают, что PHP смог подключиться к базе данных MySQL и получить информацию:

    Подключились к базе. Список id: 1 2 3 4 5 6 3. Подключение из PHP c использование устаревших функций mysql

    Используйте этот метод, только если вы используете более старую версию PHP и по какой-то причине не можете обновить ее до новой версии. Рекомендуется использовать метод №2 и метод №3, показанные выше, вместо этого метода. Я включил этот метод только для справки, а не как рекомендацию для использования.

    Это конкретное расширение было устарело от версии PHP 5.5. Но, начиная с версии PHP 7.0, это даже не будет работать, поскольку оно было удалено. Начиная с версии PHP 5.5, когда вы используете эти функции, она будет генерировать ошибку E_DEPRECATED.

    Создайте файл mysql.php:

    "; $result = mysql_query("SELECT id FROM goroda"); $row = mysql_fetch_row($result); echo "id 1: ", $row, "
    \n"; mysql_close($conn); ?> В приведенном выше:

    • Функция mysql_connect принимает три аргумента:
      1. имя хоста, в котором запущена база данных MySQL;
      2. имя пользователя MySQL для подключения;
      3. пароль для пользователя mysql. Здесь он подключается к базе данных MySQL, которая выполняется на локальном сервере с использованием имени пользователя и его пароля.
    • Функция mysql_select_db. Как следует из названия, она выбирает базу данных, к которой вы хотите подключиться. Эквивалентно команде «use». В этом примере мы подключаемся к базе данных db.
    • Функция mysql_query - используется для указания вашего запроса MySQL. В этом примере мы выбираем столбец id из базы данных городов.
    • mysql_fetch_row. Используйте эту функцию для извлечения строк из SQL-запроса, который мы только что создали.
    • Наконец, закройте соединение, используя команду mysql_close, как показано выше.
    Когда вы вызываете вышеуказанный mysql-legacy.php из своего браузера, вы увидите следующий вывод, который указывает, что PHP смог подключиться к базе данных MySQL и получить информацию:

    Подключились к базе. id 1: 1 Вот таким образом можно подключаться к MySQL. Повторюсь, лучше использовать два первых способа; о

    В данной статье мы рассмотрим способы обращения к таблицам баз данный MySQL с помощью языка запросов SQL. SQL - это аббревиатура, которая так и "раскрывается" - структуризированный язык запросов.
    В языке PHP для это цели существует целый ряд функций с префиксом "mysql". Нам для рассмотрения запросов понадобится не так много из них. Функция, без которой в языке PHP выполнение SQL-запросов было бы просто невозможным:

    Resource mysql_query(запрос)

    Данная функция посылает запрос к базе данных и возвращает в случае успешного обращения идентификатор ресурса.
    Для того чтобы подключиться к базе данных MySQL необходимо выполнить следующую последовательность:

    $host="localhost"; // имя хоста (уточняется у провайдера) $database="db_name"; // имя базы данных, которую вы должны создать $user="user_name"; // заданное вами имя пользователя, либо определенное провайдером $pswd="your_pass"; // заданный вами пароль $dbh = mysql_connect($host, $user, $pswd) or die("Не могу соединиться с MySQL."); mysql_select_db($database) or die("Не могу подключиться к базе.");

    Итак mysql_connect() - функция для подключения к серверу MySQL на Вашем хостинге.
    А mysql_select_db() выбирает базу данных на сервере для подключения.
    Иными словами подключаемся к серверу, выбираем базу и начинаем работать.
    Функция die() вызывается в случае ошибки и выводит в окно браузера сообщение, которое вы указали.
    Для завершения работы с базами данных используется функция:

    Mysql_close($dbh);

    Здесь $dbh - дескриптор, которые при соединении возвратила функция mysql_connect .
    Закончив стартовый обзор, начнем рассмотрение собственно SQL-запросов.
    Для этого прежде всего вам необходимо создать базу данных с определенном именем. А в ней создать таблицу, тоже с конкретным именем. В наших примерах будем обращаться к таблице my_sql_table . Чтобы создать эту таблицу давайте выполним в phpmyadmin нашего localhost следующий запрос:

    CREATE TABLE `my_sql_table` (`id` INT NOT NULL , // идентификатор будущих записей таблицы `firstname` VARCHAR(50) NOT NULL , // текстовое поле VARCHAR `surname` VARCHAR(50) NOT NULL , // max длиной 50 символов PRIMARY KEY (`id`) // первичный ключ - идентификатор id);

    Итак таблица создана. Выполним первый запрос, который сразу оформим в виде PHP-кода:

    \n"; echo "Имя: ".$row["firstname"]."
    \n"; echo "Фамилия: ".$row["surname"]."


    \n"; } ?>

    Разберем PHP-код файла firstsql.php . Начнем с собственно запроса к таблицам базы данных (БД).

    $query = "SELECT * FROM `my_sql_table`";

    Данный запрос можно расшифровать так: выбрать из таблицы my_sql_table БД все записи из всех полей. Таким образом знак * после слова SELECT означает "выбрать абсолютно все". Итак, запрос сформирован. Теперь его надо выполнить:

    $res = mysql_query($query);

    В случае успешного выполнения запроса функция mysql_query() вернет нам идентификатор ресурса $res .
    Его мы должны передать в качестве параметра в функцию mysql_fetch_array() . Название этой функции говорит само за себя. Т.е. она формирует и выдает массив по выборке из таблицы БД. В случае нашей таблицы массив будет состоять из числа элементов, равных количествам записей (строк) в таблице и содержать значения id, firstname, surname для каждой строки таблицы. Следовательно, следующий код:

    While($row = mysql_fetch_array($res)) { echo "Номер: ".$row["id"]."
    \n"; echo "Имя:".$row["firstname"]."
    \n"; echo "Фамилия:".$row["surname"]."


    \n"; }

    можно прокомментировать так: пока введенная нами переменная $row получает не нулевые результаты работы функции mysql_fetch_row следует выдать в броузер значение полей $row["id"], $row["firstname"], $row["surname"] с помощью echo .
    Если запрос выполнить так:

    $query = "SELECT firstname FROM `my_sql_table`";

    то это будет означать, что из всех строк выбирается только значения поля firstname.
    Следовательно предыдущий код следует переписать как:

    $res = mysql_query($query); while($row = mysql_fetch_array($res)) { echo "Имя:".$row["firstname"]."
    \n"; }

    Если Вы хотите выбрать строки таблицы с конкретным значением id где фамилия (surname) будет Петров , то запрос перепишется следующим образом:

    $query = "SELECT id FROM `my_sql_table` where surname="Петров"";

    А вот если потребуется узнать фамилию того, кто находится под номером, к примеру, 5, то запрос будет таким:

    $query = "SELECT surname FROM `my_sql_table` where id=5";

    В этом случае Вы знаете, что результатом запроса будет всего одна строка из таблицы. Т.е. нет смысла организовывать цикл с использованием while . И обработка запроса будет следующей

    $res = mysql_query($query); $row = mysql_fetch_row($res); echo "Фамилия пятого человека в списке: ".$row."\n";

    Здесь вместо mysql_fetch_array() мы применили mysql_fetch_row() . Т.е. получить значение поля (или полей) конкретной строки. Поскольку поле у нас было одно - surname - мы можем обратиться к единственному элементу массива $row как $row; .

    Итак, рассмотрим наиболее типичные примеры запросов MySQL. Рассмотрение проведем на базе таблицы my_sql_table :
    1. Добавим в таблицу my_sql_table поле middle_name (отчество) после surname :

    $query = "ALTER TABLE `my_sql_table` ADD `middle_name`
    VARCHAR(50) NOT NULL AFTER `surname`";

    2. Теперь удалим поле surname из таблицы my_sql_table:

    $query = "ALTER TABLE `my_sql_table` DROP `surname`";

    3. Удаляем записи из таблицы my_sql_table с фамилией Сидоров:

    $query = "DELETE FROM `my_sql_table` where surname="Сидоров"";

    4. Помимо знаков равенства, также "больше" или "меньше", в языке MySQL запросов существует понятие "похоже на ". Выберем записи из таблицы my_sql_table, где в фамилии встречается "дор " :

    $query = "SELECT * FROM `my_sql_table` where surname like "%дор%"";

    Здесь наличие "% " в начале и конце "дор" и означает, что запрос будет искать именно "дор", причем не важно в начале, конце, или середине фамилии он находится. Рассмотрим следующий пример
    5. Выберем записи из таблицы my_sql_table с фамилией, которая начинается на П . Обратите внимание на расположение "% ":

    $query = "SELECT * FROM `my_sql_table` where surname like "П%"";

    6. Вычислим максимальное значение id :

    $query = "SELECT MAX(id) FROM `my_sql_table`";

    7. Вычислим количество полей в my_sql_table с фамилией, которая начинается на П .

    $query = "SELECT COUNT(*) FROM `my_sql_table` where surname like "П%"";

    8. Удаление таблицы my_sql_table:

    $query = "DROP TABLE `my_sql_table`";

    Для запросов 1-3 на языке PHP достаточно просто выполнить запрос:

    Mysql_query($query);

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




    Есть еще вопросы или что-то непонятно - добро пожаловать на наш

    Всё, что я могу сказать в качестве рекомендации к использованию БД - это то, что жизнь без них - просто смерть! База данных - луч exe-шного света в тёмном царстве обработки данных интерпретируемой программой. База данных приносит немножко головной боли, но снимает гораздо больше.

    В качестве примера взят сервер баз данных MySQL (полагаю, что освоив его, вы без большого труда освоите и другие. Когда-нибудь я напишу и о них, если сам освою:).

    Первый разговор пойдет о функциях PHP, используемых для работы с MySQL. Итак, начнём.

    1. Администрирование базы данных

    Способы администрирования БД в порядке убывания удобства:

    • phpMyAdmin (весьма рекомендую!)
    • Написать скрипт, который бы передёргивал базу (см. пример)
    • mysql.exe в пакете mysql
    • mysql_manager.exe (там, вроде, как-то можно, только на грани шаманства)

    Особенно рекомендую первый способ. С ним не придётся изучать запросы ALTER TABLE, ADD COLUMN и т.п. Я их не знаю до сих пор. Тем более, что "такие вопросы, товарищ посол, с кондачка не решаются" - когда вам понадобится автоматически изменить структуру базы или таблицы? Пару слов о втором способе. Это так сказать обходная технология, которую я применял, не зная про phpMyAdmin и утилиту mysqldump. В скрипте пишутся команды, удаляющие базу и создающие её вновь. Когда-то помогало, но вообще это, ещё раз скажу, обходная технология, "подпорка".

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

    2. Соединение с сервером БД

    Осуществляется при помощи функции mysql_connect: $connect = mysql_connect(<хост>, <логин>, <пароль>); По умолчанию, на mysql-сервере в таблице пользователей есть пользователь root, который может иметь доступ только с localhost-а, то бишь с того же самого компьютера, где стоит сервер mysql. ВНИМАНИЕ! "Иметь доступ с localhost-а" значит, что доступ имеет ваш скрипт PHP, а вы можете обращаться к нему с любого другого компьютера.

    Что происходит, когда мы вызываем функцию mysql_connect? С началом выполнения вашего скрипта, php выделяет в своей памяти место для информации о нём и его переменных. В информации о выполняемом скрипте хранится, в том числе, и информация о соединениях с базами данных. Переменная $connect - грубо говоря указатель на место, где данная информация хранится. Переменная эта точно такая же, как и остальные - если вы используете функции, то надо объявлять глобальные переменные, чтобы обратиться к ней.

    Почему вообще используется переменная? Это на случай, если для работы вам необходимо использовать несколько серверов баз данных (или, например, для обеспечения бОльшей безопасности вы используете разные логины, у которых могут быть разные привилегии). В таких случаях в каждом запросе нужна определённость, по какому, так сказать, каналу идёт команда. Но если вы используете только одно соединение, указывать его в параметрах функций запросов (о них - ниже) не нужно - php находит первое (и в данном случае единственное) установленное соединение и использует его.

    Механизм работы функций запросов к БД такой же, как и у функции соединения: функции передаются параметры запроса и (если надо) соединения, а результат записывается в переменную:

    $result = mysql_db_query(string база данных, string запрос [, переменная соединения]);

    $result = mysql_query(string запрос [, переменная соединения]);

    ВНИМАНИЕ! Чтобы использовать функцию mysql_query, в которой база данных не указывается, надо предварительно выбрать используемую базу данных:

    mysql_select_db(string база данных);

    Теперь у нас есть переменная $result. Это указатель на результат выполнения запроса. Там есть сколько-то строк таблицы. Получить эти строки можно через функции mysql_fetch_row и mysql_fetch_array:

    Echo "

    "; while ($row = mysql_fetch_array($result)) echo ""; echo "
    ", $row["field1"], "", $row["field2"], "
    ";

    Функция mysql_fetch_array выдаёт в указанную переменную (в данном случае $row) массив, индексы которого - имена полей (причём, если вы в списке полей запроса пишете table.field, то индекс массива будет field). mysql_fetch_row выдаёт массив, индексы которого - числа, начиная с 0.

    Какой функцией лучше пользоваться? Если вы запрашиваете звёздочку, т.е. все поля таблицы, а выводить поля нужно в определённой последовательноси (когда, например, у таблицы рисуется шапка), лучше пользоваться mysql_fetch_array. Если вы запрашиваете одно-два-три поля, чётко зная их последовательность, можно делать mysql_fetch_row - это уменьшит объем кода программы.

    Это команды DELETE и UPDATE. Подобные запросы - в "правах" такие же, как и SELECT, поэтому отправка команды серверу происходит тем же способом - mysql_query (mysql_db_query). Но в данном случае функция не возвращает результата:

    $result = mysql_query("SELECT * FROM sometable"); но mysql_query("DELETE FROM sometable WHERE id=...");

    Соответственно, если мы выполним запрос-выборку и не запишем результат в переменную, данные не будут храниться нигде.

    5. Обработка ошибок запросов

    Сообщение о последней ошибке можно получить через функцию mysql_error:

    echo "Ошибка базы данных. MySQL пишет:", mysql_error();

    Если результат функции пишется в переменную, можно проверить её:

    $result = mysql_query($request); if (!$result) echo "Ошибка базы данных. MySQL пишет:", mysql_error(); else { echo "

    "; while ($row = mysql_fetch_array($result)) echo ""; echo "
    ", $row["field1"], "", $row["field2"], "
    "; };

    Если в переменную не пишем, то так.