Вадим Дунаев

Отрывок из книги «Самоучитель PHP»

Глава 7. Работа с базами данных

Глава 7. Работа с базами данных

7.1. Общие сведения о базах данных

7.2. Установка СУБД

7.2.1. Установка Microsoft SQL Server 2000

7.2.2. Установка MySQL

7.3. Основные средства PHP для взаимодействия с базой данных

7.3.1. Подключение к базе данных

7.3.2. Передача запросов к базе данных

7.3.3. Обработка данных в сценарии

7.4. Гостевая книга

7.4.1. Создание базы данных

Создание таблицы для хранения данных

Определение регистрационного имени и пароля пользователя

Определение прав пользователя

7.4.2. Сценарии для взаимодействия с посетителем

7.4.3. Сценарии для владельца гостевой книги

7.5. SQLite — базы данных без СУБД

 

7.1. Общие сведения о базах данных

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

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

PHP имеет наборы специальных функций для работы с многими СУБД, такими как Microsoft SQL Server (MS SQL), MySQL, Oracle, PostgreeSQL, mSQL, Informix, Sybase, Ingres и IBM DB2. Кроме того,  PHP поддерживает стандарт ODBC (Open Database Connectivity — открытый интерфейс доступа к базам данных), который поддерживают почти все реляционные СУБД. Используя ODBC, можно обращаться к таким СУБД, как MS Access.

СУБД устанавливается независимо от PHP. Чтобы работать с ней посредством PHP-сценария, следует установить соответствующую данной СУБД библиотеку функций. Например, при работе в Windows для СУБД MySQL версии не старше 4.0 требуется библиотека php_mysql.dll, для MySQL версии 4.1 и старше — php_mysqli.dll; для MS SQL Serverphp_mssql.dll; для PostgreeSQLphp_pgsql.dll. При установке PHP библиотеки для работы с СУБД автоматически не устанавливаются. Как их установить вручную, описано в разд. 1.2.3.

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

Большинство современных СУБД поддерживают язык SQL (Structured Query Language — структурированный язык запросов), посредством которого формируются выражения, называемые запросами к базе данных. Запросы, выполняемые СУБД, позволяют создавать и удалять базы данных, создавать и удалять таблицы, содержащиеся в базах данных, а также добавлять, редактировать, удалять и выбирать данные в таблицах. Кроме того, они позволяют выполнять и обработку данных. Более того, с помощью SQL-запросов можно производить администрирование баз данных: определять пользователей (имя и пароль), устанавливая их права (привилегии) на использование базы данных.

Запросы на языке SQL могут возвращать, а могут и не возвращать данные. Например, запрос на выборку данных по некоторому критерию возвращает данные, а запрос на создание новой таблицы или, например, удаление записей — нет. Результатом выполнения SQL-запроса на выборку данных является набор записей (временная таблица), удовлетворяющих условию запроса. Если таких записей в базе данных не оказалось, то возвращаемая таблица будет пустой. Если же запрос вернул какие-то записи, то их набор доступен PHP-сценарию и вы можете работать с ним как с массивом.

Чтобы работать с базой данных, необходимо знать язык SQL. Наиболее часто используемые выражения этого языка имеют довольно простой синтаксис. Для отправки SQL-запросов к базе данных из PHP-сценария используются специальные функции, принимающие в качестве параметра строку, содержащую SQL-выражение. Язык SQL развивается, что отражается в его версиях. Возможно, не все конструкции этого языка последней версии поддерживаются данной СУБД. Поэтому, прежде чем использовать SQL, вы должны обратиться к справочной документации по СУБД, чтобы узнать особенности SQL-интерпретатора, встроенного в данную СУБД. Так например, если объявлено, что ваша СУБД поддерживает SQL:92, то это еще не означает, что ее SQL-интерпретатор соответствует стандарту SQL:92 в полной мере. Возможны частные отклонения от официального стандарта. Работая с конкретной СУБД, вам следует выяснить все нюансы с помощью документации и/или экспериментов.

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

В случае одной таблицы задача проектирования базы данных сводится к правильному определению столбцов (полей) — их имен, типов и размеров. База данных может состоять из нескольких несвязанных между собой таблиц. Этот случай принципиально не отличается от однотабличной базы данных. Если вам необходимо спроектировать систему из нескольких связанных таблиц, а вы новичок в этом деле,  то обратитесь к специальной литературе по проектированию баз данных. В данной книге мы рассмотрим создание гостевой книги на основе простой однотабличной базы данных. Главная наша цель при этом состоит в том, чтобы понять, как работать с базой данных в PHP-сценариях.

Большая часть данной главы посвящена работе с базами данных под управлением СУБД. Однако в разд. 7.5 описывается применение PHP-расширения SQLite, которое позволяет создавать не очень сложные базы данных и манипулировать ими посредством SQL, не используя СУБД.

7.2. Установка СУБД

Чтобы создать и отладить приложение, работающее с базой данных, необходимо иметь доступ к СУБД. В данном разделе мы рассмотрим установку на локальном компьютере двух наиболее популярных СУБД: Microsoft SQL Server 2000 и MySQL. Разумеется, при создании своего серверного приложения устанавливать и настраивать СУБД вам не придется. Все необходимые настройки СУБД выполнит системный администратор Web-сервера вашей хостинговой компании. Однако, поскольку отладка приложения обычно производится на локальном компьютере (в локальной сети), будет полезно хотя бы ознакомиться с тем, что необходимо сделать по установке и настройке сервера базы данных. Необходимые операции довольно просты, но требуют некоторого внимания, чтобы в последствии избежать досадных недоразумений.

7.2.1. Установка Microsoft SQL Server 2000

Процедура инсталляции Microsoft SQL Server 2000 с установочного CD довольно проста. Если инсталлятор не запустился автоматически, то следует запустить программу \x86\setup\setupsql.exe, расположенную на установочном CD. Ниже приведен один из возможных вариантов установки, пригодный для большинства новичков, работающих на локальном компьютере:

1.       Local Computer (локальный компьютер).

2.       Server and Client Tools (инструменты сервера и клиента). При этом будет инсталлирован сам сервер и средства администрирования.

3.       Настройка учетных записей служб:

·                 Use the same account for each service. Auto start SQL Server Service (использовать одну учетную запись для всех служб с их автоматическим запуском при загрузке операционной системы).

·                 Use the Local System account (использовать локальную учетную запись).

·                Auto Start Service (автоматический запуск служб при загрузке операционной системы).

4.       Typical (установка всех компонентов).

 

После инсталляции сервера баз данных в меню Windows Пуск/Программы/Microsoft SQL Server запустите утилиту Enterprise Manager, которая предоставляет пользовательский интерфейс для настройки, управления и доступа к данным на сервере (рис. 7.1).  В левой части этого окна отображается древовидный список, в котором щелчком левой кнопкой мыши следует раскрыть узел Microsoft SQL Servers/SQL Server Group. Если установка прошла успешно, то в этом узле должен находиться узел, имя которого состоит из имени вашей учетной записи, за которым следует “(Windows NT)”. На рис. 7,1 это — DVV (Windows NT). В правой части окна отображаются элементы того узла, который выделен в левой части окна (в дереве).

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

Рис. 7.1. Окно утилиты Enterprise Manager

Чтобы создать базу данных, в древовидном списке окна утилиты Enterprise Manager раскройте узел, соответствующий вашей учетной записи (на рис. 7.1 это — DVV (Windows NT)). Среди содержащихся в нем подузлов имеется Databases (Базы данных). Щелкните на нем правой кнопкой мыши и в раскрывшемся контекстном меню выберите New Database (Новая база данных). В результате откроется диалоговое окно Database Properties (Свойства базы данных). В поле Name (Имя) введите имя базы данных (например, “Моя база данных”) и щелкните на кнопке OK. В результате в узле Databases появится узел с именем, совпадающим с именем базы данных.

Итак, создана пустая база данных, которая пока не содержит ни одной таблицы с пользовательскими данными. Теперь создайте какую-нибудь таблицу, например, Клиенты с символьными столбцами Имя, Адрес, Телефон. Для этого щелкните правой кнопкой мыши на имени вашей базы данных в древовидном списке и в раскрывшемся контекстном меню выберите Создать/Table. В результате откроется окно New Table in имя_базы_данных (Новая таблица в имя_базы_данных), показанное на рис. 7.2. В этом окне следует ввести имена столбцов (Column Name), тип данных (Data Type) и длину данных (Length). В рассматриваемом примере все столбцы являются символьными (строковыми, текстовыми), т.е. имеют тип char.

 

Рис. 7.2. Окно для определения столбцов таблицы

 

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

Если в древовидном списке раскрыть узел с именем вашей базы данных и щелкнуть на узле Tables (Таблицы), то в правой части окна Enterprise Manager отобразятся все таблицы, входящие в эту базу данных. Среди множества служебных таблиц вы найдете и только что созданную свою таблицу.

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

Для изменения структуры таблицы щелкните правой кнопкой мыши на ее имени  и в контекстном меню выберите Design Table (Разработка таблицы). В результате откроется окно, аналогичное показанному на рис. 7.2. Теперь можно добавить новые или удалить имеющиеся столбцы, изменить их имена и/или другие параметры.

Для ввода, редактирования и удаления данных в таблице щелкните правой кнопкой мыши на ее имени  и в контекстном меню выберите Open Table/Return all rows (Открыть таблицу/Вернуть все записи). В результате откроется окно, в котором можно вводить и изменять значения столбцов, добавлять и удалять строки (записи).

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

 

7.2.2. Установка MySQL

MySQL, как и PHP, является системой с открытым кодом  и может быть получена бесплатно по адресу www.mysql.ru/download. Если ваша хостинговая компания поддерживает PHP, то практически наверняка она поддерживает и MySQL. Другими словами, PHP и MySQL почти всегда вместе на Web-серверах.

Установка СУБД MySQL заключается в распаковке ее дистрибутива в нужную папку, например, C:\mysql. В отличие от Microsoft SQL Server, работать с MySQL придется, ипользуя интерфейс командной строки.

Все исполнимые файлы MySQL находятся в папке \mysql\bin. Чтобы запустить MySQL, достаточно в этой папке выполнить команду mysql. Однако если вы работаете в Windows, то вместо этого рекомендуется запустить исполняемый файл winmysqladmin.exe. До первого запуска сервера MySQL его конфигурационный файл my.ini еще не существует. Поэтому при первом запуске появится диалоговое окно (рис. 7.3), позволяющее зарегистрировать пользователя — ввести его имя и пароль. Эти данные будут сохранены в файле my.ini, который можно корректировать в обычном текстовом редакторе.

 

 

Рис. 7.3. Окно регистрации пользователя MySQL

 

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

 

Рис. 7.4. Окно администрирования MySQL

Если сервер MySQL работает, то выбрать или создать базу данных, таблицы, выполнить запросы можно из командной строки с помощью команд MySQL и выражений языка SQL. Для этого, прежде всего, необходимо сделать папку \mysql\bin текущей  с помощью команды ch c:\mysql\bin. Далее, в ответ на приклашение ввода >, следует ввести mysql и нажать на клавишу <Enter>. Теперь можно вводить команды собственно MySQL, а также выражения на языке SQL, завершая их точкой с запятой. В одной строке можно ввести несколько команд и выражений, разделяя их точкой с запятой, а для их выполнения следует нажать на <Enter>.  

Чтобы посмотреть, какие базы данных имеются на сервере MySQL, достаточно в командной строке набрать и выполнить команду

show databases;

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

Чтобы создать новую базу данных с именем, например, my_db следует выполнить следующую команду:

create database my_db;

На рис. 7.5 показано окно командной строки, в которое были введены и ыполнены команды для создания новой базы данных my_db.

 

 

Рис. 7.5. Окно командной строки с командами для создания базы данных

 

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

use  имя_БД;

При инсталяции MySQL устанавливаются несколько баз данных: mysql и test. База данных mysql является системной. В частности, она содержит сведения о зарегистрированных пользователях и их права, а также список имеющихся баз данных. Эта информация сосредоточена в пяти таблицах. На рис. 7.6 показаны команды, позволяющие вывести список таблиц системной базы данных mysql.

 

Рис. 7.6. Список таблиц системной базы данных mysql

 

В таблицах columns_priv и tables_priv хранятся права пользователей для доступа к столбцам и таблицам соответственно. В таблице db находятся права доступа к базам данных. Таблица host содержит информацию о компьютерах пользователей, которые подключаются к серверу баз данных MySQL. Так например, чтобы посмотреть зарегистрированные имена и пароли пользователей сервера баз даны MySQL, достаточно в командной строке набрать и выполнить команды, показанные на рис. 7.6.

 

Рис. 7.7. Вывод информации о пользователях сервера баз данных MySQL

Здесь пользователь (user) root — администратор базы данных, имеющий все права; компьютер пользователя (host) — IP-адрес или имя (localhost — локальный компьютер, % — любой удаленный компьютер).

Вы можете изменить содержимое таблицы user базы данных mysql с помощью SQL-запросов. Например, чтобы установить пароль ‘mypw’ пользователя с именем v, сохранив его в зашифрованном виде, достаточно выполнить следующий SQL-запрос:

update user set password=PASSWORD(‘mypw’) where user=’v’ ;

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

Если вы создали базу данных, то права на ее использование (выборку, добавление, изменение и удаление данных, а также создание и удаление собственно таблиц) задаются с помощью SQL-запросов вида:

grant список_прав on объект to список_пользователей

 

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

 

7.3. Основные средства PHP для взаимодействия с базой данных

При взаимодействии сценария с базой данных обычно выполняются следующие действия:

1.     Подключение к серверу базы данных (предполагается, что сервер базы данных запущен)

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

3.     Получение от СУБД данных, соответствующих переданному ранее  SQL-запросу. С помощью специальных функций можно получить данные и далее их обработать (например, просто вывести на экран).

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

5.     Отключение от базы данных, если не предполагается повторно выполнить этапы 2 — 4. Отключаться от базы данных рекомендуется всякий раз, как только вы прекращаете работать с ней на более или менее длительный срок.

Эти и другие действия в PHP-сценарии выполняются посредством соответствующих функций.

7.3.1. Подключение к базе данных

Будем считать, что база данных (возможно, пустая) уже создпна (см. разд. 7.2). Чтобы выполнить все остальное, необходимо к ней подключиться.

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

r    Местоположение (host) — для многих серверов БД это доменное имя или IP-адрес компьютера, на котором расположена БД; если она находится на том же компьютере, что и модуль PHP, то достаточно указать localhost. Для MS SQL Server указывается его имя. При необходимости можно указать череp двоеточие порт, который прослушивается сервером базы данных.

r    Регистрационное имя (username) — строка символов, соответствующая имени пользователя, под которым он может получить доступ к БД; сообщается администратором БД.

r    Пароль (password) — строка символов, которая вместе с регистрационным именем, служит для обеспечения доступа к БД; сообщается администратором БД.

r    Имя базы данных. — СУБД может поддерживать несколько БД, каждая из которых должна иметь уникальное имя. Вы должны указать имя конкретной БД, с которой хотите работать.

При подключении к базам данных под управлением разных СУБД в PHP используются различные функции. Ниже приведены примеры подключения к базе данных для двух популярных СУБД.

r    MS SQL Server

$connect=mssql_connect(имя_сервера_БД, username, password);

$db=mssql_select_db(имя_БД, $connect);

r     MySQL  4.0:

$connect=mysql_connect(host, username, password)  ;                   

$db=mysql_select_db($connect, имя_БД);

 

Для подключения к БД MySQL и MS SQL Server требуется две функции:

r    Первая функция (…_connect()) выполняет соединение с сервером БД и возвращает идентификатор соединения при успехе и false — при неудаче. При этом для MySQL в первом параметре этой функции указывается host (доменное имя или IP-адрес компьютера), а для MS SQL Server — имя сервера БД, устанавливаемое при регистрации сервера. Идентификатор соединения, возвращаемый функцией, используется в сценарии, в частности, при выборе базы данных, создании запросов и т.д.

r    Вторая функция (…_select()) выбирает конкретную базу данных на сервере, на который указывает идентификатор $connect, возвращенный первой функцией. Эта функция возвращает true при успешном завершении операции и false — в противном случае. Если требуемая база данных еще не создана, то это необходимо сделать. Так, в MS SQL Server базу данных (хотя бы пустую) можно создать с помощью утилиты Enterprise Manager или с помощью соответствующих выражений SQL, которые могут быть введены с помощью оконного интерфейса, либо сформированы и выполнены посредством PHP-сценария. В MySQL вы можете ввести необходимые SQL-выражения в командной строке, либо написать соответствующий PHP-сценарий, а затем выполнить его.

Для отключения от базы данных используется функция, которой передается идентификатор соответствующего подключения. Например, mysql_close($connect) — для MySQL, mssql_close($connect) — для MS SQL Server.

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

7.3.2. Передача запросов к базе данных

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

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

Для различных СУБД функции передачи запроса похожи, но все же имеют некоторые отличия:

r    MS SQL Server

mssql_query(SQL_запрос, идентификатор_соединения); 

r    MySQL  4.0:

mysql_query(SQL_запрос, идентификатор_соединения);                          

 

Пример подключения к серверу MS SQL Server:

/* Подключение к серверу БД: */

$connect=mssql_connect(“VADIM”, “guest”)or

exit("Не удалось соединиться с сервером");

/* Выбор БД: */

$db=mssql_select_db(“gbook”, $connect)

exit("Не удалось выбрать БД");

$strsql=”SELECT * FROM gb”;    // строка с SQL-запросом

$selectall=mssql_query($strsql, $connect);     // выполнение SQL-запроса

$mssql_close($connect); // отключение от БД

 

Здесь производится подключение к MS SQL Server с именем VADIM (устанавливается при регистрации сервера) для пользователя с регистрационным именем guest без пароля. Затем выбирается база данных gbook и выполняется SQL-запрос на выборку из таблицы gb всех полей (столбцов)и записей (строк). Наконец, соединение с БД разрывается.

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

 

Пример подключения к серверу MySQL:

/* Подключение к серверу БД: */

$connect=mysql_connect(“localhost”, “guest”) or

exit("Не удалось соединиться с сервером".mysql_error());

/* Выбор БД: */

$db= mysql_select_db(“gbook”, $connect) or

exit("Не удалось выбрать БД"".mysql_error()); 

$strsql=”SELECT * FROM gb”;    // строка с SQL-запросом

$selectall= mysql_query($strsql, $connect);    // выполнение SQL-запроса

$ mysql_close($connect);       // отключение от БД

 

Здесь функция mysql_error() возвращает описание возникшей ошибки.

Примечание

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

$connect=pg_connect(“host=host user=username password=password

dbname=имя_БД”);

 

7.3.3. Обработка данных в сценарии

Выбор нужных данных из одной или нескольких таблиц выполняется с помощью SQL-запроса, начинающегося с ключевого слова (оператора) SELECT. Критерий (условие) выбора данных формулируется в выражении SQL-запроса вслед за ключевым словом WHERE. Результатом выполнения такого запроса является временная таблица (возможно, пустая, если нет данных, удовлетворяющих условию запроса). Функция PHP, выполняющая запрос, возвращает указатель на полученную в результате временную таблицу. Этот указатель используется в PHP-сценарии для доступа к данным с помощью специальных функций.

Довольно часто данные из временной таблицы читают в массив, а затем его обрабатывают в сценарии (например, выводят на экран, изменяют значения, производят вычисления и т.п.).  Если требуется изменить значения полей таблицы, добавить новую или удалить имеющуюся запись, то формируют строку с соответствующим SQL-запросом, а затем передают ее в качестве параметра функции, выполняющей запрос (например, mssql_query()).

Чтение в массив записей временной таблицы, полученной в результате выполнения SQL-запроса, производится функциями, в имени которой находится слово fetch (достать). Например, функция mssql_fetch_assok() читает текущую запись таблицы БД MS SQL Server в массив с символьными индексами (ключами). При этом значения индексов совпадают с именами соответствующих полей таблицы. mssql_fetch_row() создает аналогичный массив, но с числовыми индексами, значения которых совпадают с номерами полей таблицы. Для MySQL существуют аналогичные функции: mysql_fetch_assok(), mysql_fetch_row().

7.4. Гостевая книга

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

r    Создание БД для хранения сообщений посетителей. Для гостевой книги достаточно одной таблицы в этой БД.

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

В данном разделе описывается использование MS SQL Server 2000. Применение других серверов БД (например, MySQL) более или менее аналогично. Администрирование  MS SQL Server, создание базы данных, ее таблиц, а также заполнение таблиц данными производится с помощью специальной утилиты Enterprise Manager, которая имеет удобный пользовательский интерфейс.

7.4.1. Создание базы данных

Для создания базы данных под управлением MS SQL Server запуститите утилиту Enterprise Manager (рис. 7.8). В древовидном списке в левой части окна этой утилиты раскройте группу узлов с именем сервера БД: Microsoft SQL Servers/SQL Server Group/Имя_сервера (Windows ТЕ). В рассматриваемом примере сервер БД называется VADIM. Щелкните правой кнопкой мыши на узле Databases  и в раскрывшемся контекстном меню выберите New Database (Новая база данных). В открывшемся диалоговом окне введите имя БД, например, Гостевая книга и щелкните на кнопке OK. В результате это имя появится в древовидном списке в группе Databases.

 

Рис. 7.8. Окно SQL Server Enterprise Manager

 

Создание таблицы для хранения данных

Созданная база данных пока не содержит ни одной пользовательской таблицы. Теперь необходимо создать таблицу, в которой будут храниться данные гостевой книги. Для этого следует щелкнуть правой кнопкой мыши на имени БД в древовидном списке и в контекстном меню выбрать  Создать, а затем — Table. В результате откроется диалоговое окно New Table inимя БДonИмя сервера БД(рис. 7.9), в котором можно определить поля (столбцы) таблицы, т.е. задать их имена, типы, размеры и другие характеристики. Помимо полей, которые предназначены для хранения данных, зададим поле, значения которого присваиваются автоматически и являются уникальными идентификаторами записей. Это — поле с именем recid, а его характеристики показаны на рис. 7.9.

Рис. 7.9. Окно для определения полей таблицы

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

Определение регистрационного имени и пароля пользователя

Теперь следует определить пользователя (регистрационное имя и пароль), а также его права по работе с таблицей. Сначала определим пользователя.  Для этого в древовидном списке окна SQL Server Enterprise Manager щелкните правой кнопкой мыши на узле Users (Пользователи) и в контекстном меню выберите New Database User (Новый пользователь БД). В результате откроется диалоговое окно Database User PropertiesNew User (Свойства пользователя БД — Новый пользователь). В раскрывающемся списке Login name (Регистрационное имя) выберите <new>. Откроется окно SQL Server Login Properties (Свойства регистрации), в котором в поле Name введите какое-нибудь значение, например, Гость; установите переключатель SQL Server Athentication (Идентификация сервером), а в поле Password введите значение пароля или оставьте его пустым, если пароль не нужен. Для посетителей гостевой книги пароль можно не вводить. Щелкните на кнопке ОК, чтобы сохранить настойки и вернуться к окну Database User PropertiesNew User. В этом окне в раскрывающемся списке Login name выберите  имя, которое было создано ранее (например, Гость) и щелкните на кнопке ОК. В результате имя пользователя появится в списке пользователей базы данных Гостевая книга.

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

Определение прав пользователя

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

В окне SQL Server Enterprise Manager найдите в списке пользователей имя Гость, щелкните на нем правой кнопкой мыши и выберите Все задачи | Manage Permissions (Управление разрешениями). В раскрывшемся окне Database User Properties — Гостевая книга (рис. 7.10) в строке, значение поля Object которой равно gbook (имя таблицы), установите флажки в полях SELECT и INSERT. Тем самым пользователю предоставляется право выполнять указанные SQL-операторы, обеспечивающие выборку и добавление данных соответственно. Это — типичные права посетителя гостевой книги.

Рис. 7.10. Окно установки прав пользователя по работе с данными

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

7.4.2. Сценарии для взаимодействия с посетителем

Для взаимодействия гостевой книги с посетителем потребуются два сценария. Первый сценарий формирует страницу, содержащую все записи из базы данных гостевой книги. Кроме того, на этой странице находится кнопка Добавить запись, щелчок на которой приводит к переходу ко второму сценарию, предоставляющему форму для ввода данных и выполняющему запись их в БД. Страницы, созданные этими сценариями,  выглядят в окне браузера так же, как на рис. 6.5 и 6.10. Пусть эти сценарии сохранены в файлах gbookdb.php и gbadd_db.php.

В листинге 7.1 представлен код сценария из файла gbookdb.php.

Листинг 7.1. Вывод содержимого гостевой книги (gbookdb.php)

<?php

/* Форма с кнопкой  для перехода к странице добавления записи */

echo "<center><h2>Моя гостевая книга</h2>";

echo "<form action=gbadd_db.php method=POST>

<input type=submit name=addrecord value='Добавить запись'>

</form><br>";

/**** Подключение к БД ***********************************************/

$servername="VADIM";    // имя сервера БД

$dbname="[Гостевая книга]";    // имя БД

$user='Гость';          // login пользователя

/* Cоединение с сервером: */

$connect=mssql_connect($servername,$user) or

exit("Не удалось соединиться с сервером");    

/* Выбор БД: */

$db=mssql_select_db($dbname, $connect) or

exit("Не удалось выбрать БД");

/**** Выбор всех записей ********************************************/

$strsql="SELECT * FROM gbook ORDER BY date DESC";

$rez=mssql_query($strsql,$connect);    // выполнение запроса

/**** Вывод содержимого БД *****************************************/

while ($row=mssql_fetch_assoc($rez)){ // цикл по всем записям таблицы

        $i++;

$t=$row['date'];

        echo "<b>$i.  {$row['username']}</b>  {$row['city']}  $t<br>

        <b>Сайт:</b> <a href={$row['site']}>{$row['site']}</a>

<b> E-mail:</b> <a href={$row['email']}>{$row['email']}</a><br>

        <br><textarea rows=4 cols=60>{$row['msg']}</textarea><br>";

        if ($row['answer']) {

                echo "<b>Ответ:</b><br>

<textarea rows=4 cols=60>{$row['answer']}</textarea>";

        }

        echo "<hr><br>";

}

mssql_close($connect); // отключение от БД

?>

 

Внимание

Еесли имя базы данных содержит пробелы, дефисы и некоторые другие специфические символы, то его следует заключить в квадратные скобки. Например, $dbname="[Гостевая книга]";.

SQL-запрос в данном сценарии возвращает все записи и все поля таблицы gbook, упорядоченные по убыванию значений поля date (дата и время).  Таким образом, новые записи располагаются в таблице выше старых.

 

В листинге 7.2 представлен код сценария из файла gbadd_db.php.

Листинг 7.2. Отображение формы ввода и добавление данных в гостевую книгу (gbadd_db.php)

<?php

if ($_POST['addrecord']){      // если требуется добавить запись

        /* Вывод формы для ввода сообщения */

        echo "<html>

        <center><h2>Моя гостевая книга</h2></center>

        <form action=gbadd_db.php method=POST>

        <table>

        <tr><td>Ваше имя:</td>

        <td><input type=text name=username size=20></td></tr>

        <tr><td>Город:</td>

        <td><input type=text name=city size=20></td></tr>

        <tr><td>URL Вашего сайта:</td>

        <td> <input type=text name=site size=40></td></tr>

        <tr><td>E-mail:</td>

        <td><input type=text name=email size=40></td></tr>

        </table>

        Сообщение:<br>

        <textarea  name=msg rows=4 cols=60></textarea><br>

        <input type=submit name=addok value='Добавить запись'>

        <input type=reset name=reset value='Отмена'>

        </form><br>

        </html>";

} elseif ($_POST['addok']) { // если подтвердили ввод в форму

        header("Location:gbookdb.php"); /* Переход к странице показа

гостевой книги */

        if (!$_POST['msg']){exit;};    // если сообщение пусто, то выход

$t=date("Y-m-d H:i:s");        // текущие дата и время

/**** Подключение к БД **************************************/

$servername="VADIM";    // имя сервера БД

$dbname="[Гостевая книга]";    // имя БД

$user='Гость';          // login пользователя

$connect=mssql_connect($servername,$user);     // соединение с сервером

$db=mssql_select_db($dbname, $connect);        // выбор БД

$strsql="INSERT INTO gbook

(username, city, site, email, msg, date)

VALUES (\"{$_POST['username']}\", \"{$_POST['city']}\",

\"{$_POST['site']}\",\"{$_POST['email']}\",

\"{$_POST['msg']}\",

CAST('".$t."' AS datetime))";

$rez=mssql_query($strsql,$connect);    // выполнение запроса

mssql_close($connect);  // отключение от БД

}

?>

 

SQL-запрос в данном сценарии содержит SQL-функцию CAST() для преобразования типов данных. В нашем случае необходимо привести строковое значение даты-времени $t к типу datetime поля date таблицы БД.

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

В данном примере мы не предусмотрели обработку возможных ошибок подключения и выполнения запроса к БД. В реальном проекте это следует сделать.

7.4.3. Сценарии для владельца гостевой книги 

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

Страница  для владельца книги внешне может быть аналогична странице для обычного посетителя, но есть и отличия. Видимо, проще всего каждую выводимую запись гостевой книги заключить в HTML-теги формы с кнопками типа submit Принять изменения и Удалить. Кроме того, в скрытое поле формы следует поместить значение поля БД recid (идентификатор записи). Тогда в сценарии обработки щелчков на этих кнопках полученное значение скрытого поля можно использовать в условии SQL-запроса к БД. Например, пусть кнопка Удалить имеет имя (значение атрибута name) delete, а скрытое поле со значением поля БД recid recid (т.е. такое же, что и поле БД). Тогда для удаления записи может быть применен следующий фрагмент PHP-кода:

if ($_POST[‘delete’]){

$strsql=”DELETE FROM gbookdb WHERE recid={$_POST[‘recid’]}”;

mssql_query($strsql,$connect);

}

 

Предположим, кнопка Принять изменения имеет имя (значение атрибута name) update, а поле формы для ввода ответа — answer (т.е. такое же, что и поле БД). Допустим, вы хотите сохранить только введенный вами ответ. Тогда можно воспользоваться следующим фрагментом PHP-кода:

if ($_POST[‘update’]){

$strsql=”UPDATE gbookdb SET answer=\”{$_POST[‘recid’]}\”

 WHERE recid={$_POST[‘recid’]}”;

mssql_query($strsql,$connect);

}

 

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

7.5. SQLite — базы данных без СУБД

В PHP имеется расширение SQLite, которое позволяет сохранять данные в текстовых файлах и манипулировать ими посредством языка SQL. Если объем ваших данных относительно не велик, структура базы данных проста, а требования по защите данных не высоки, то применение SQLite — хорошее решение. При этом вам не нужны ни СУБД, ни знание команд для работы с файлами. Достаточно знать только SQL. Так например, гостевую книгу или форум для личного сайта вполне можно сделать на основе SQLite.

В гл. 6 мы уже рассматривали проекты, основанные на использовании текстовых файлов с табличной структурой данных (CSV-файлы). Однако там мы не могли использовать SQL для манипулирования данными. SQLite сочетает хранение табличных данных в текстовых файлах с возможностью работы с ними посредством SQL. В Windows расширению SQLite соответствует библиотека php_sqlite.dll. Как ее установить вручную, описано в разд. 1.2.3.

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

Чтобы открыть базу данных (установить соединение с базой данных), необходимо применить функцию:

sqlite_open(имя_БД);

Данная функция возвращает указатель на открытую базу данных или false, если операция не удалась. Если указанная в качестве параметра база данных не существует, то предпринимается попытка ее создать. Имя базы данных — абсолютный или относительный путь к файлу. Например, sqlite_open(“/db/mydb”) попытается открыть или создать файл базы данных mydb, расположенный в папке db, которая находится в домашнем каталоге Web-сервера.

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

r     sqlite_query(SQL_запрос) — для выполнения SQL-запросов, возвращающих данные (например, SELECT …); при успешном выполнении запроса возвращает указатель на временную таблицу данных, а в противном случае — false

r    sqlite_exec(SQL_запрос) — для выполнения SQL-запросов, не возвращающих данные (например, DELETE…); при успешном выполнении запроса возвращает true, а в противном случае — false

В частности, после создания новой базы данных следует выполнить SQL-запрос на создание таблицы, в которой будут храниться собственно данные.

По завершении работы с базой данных ее следует закрыть с помощью функции

sqlite_close(идентификатор_БД).

 

В листинге 7.3 в качестве примера приведен сценарий, который выполняет следующие действия:

1.     Открывается база данных mydatabase. Если она не существует, то предпринимается попытка создать ее. Идентификатор базы данных присваивается переменной $db.

2.     Создается таблица mytable с тремя столбцами: first_name, last_name и zarplata. Перед вызовом функции выполнения запроса sqlite_query() использован оператор @ подавления вывода сообщений об ошибке. Дело в том, что если таблица mytable уже существует, то запрос на ее создание не выполненится, но будет выведено соответствующее сообщение, которое в данном случае не желательно. При первом выполнении сценария таблица должна быть создана, а при последующих — нет.

3.     В таблицу mytable добавляются две записи.

4.     Из таблицы mytable выбираются все имеющиеся в ней записи.

5.     В цикле с помощью функции sqlite_fetch_array() и оператора echo данные выборки отображаются в окне браузера. Функция sqlite_fetch_array() возвращает значения столбцов текущей записи таблицы как массив и переводит указатель на следующую запись.

6.     База данных с идентификатором $db закрывается.

 

При первом выполнении данный сценарий выведен в окно браузера две строки данных.

Листинг 7.3. Пример использования SQLite

<?php

/* Открытие БД: */

$db=sqlite_open("mydatabase") or exit("Не удалось открыть БД");

/* Создание таблицы: */

$strsql="CREATE TABLE mytable1 (

first_name varchar(20),

last_name varchar(20),

zarplata numeric(8,2))";

$result = @sqlite_query($db,$strsql);  /* @ — для подавления вывода

 сообщений об ошибке */

/* Вставка записи: */

$strsql="INSERT INTO mytable1 VALUES ('Петр', 'Петров', 1500.50)";

$result=sqlite_query($db,$strsql);

/* Вставка еще одной записи: */

$strsql="INSERT INTO mytable1 VALUES ('Иван','Иванов', 3500)";

$result=sqlite_query($db,$strsql);

/* Выборка всех записей из таблицы: */

$strsql="SELECT *FROM mytable1";

$result=sqlite_query($db,$strsql);

/* Отображение записей: */

while ($row = sqlite_fetch_array($result)){

        echo    $row['first_name']." ".

$row['last_name']." - ".

$row['zarplata']."<br>";

}

sqlite_close($db);      // закрытие БД

?>

 

Получив с помощью SQL-запроса набор записей, можно воспользоваться функциями для перемещения по записям:

r    sqlite_next() — переход к следующей записи; возвращает true в случае успеха и false, если предпринята попытка перейти к несуществующей записи;

r    sqlite_prev() — переход к предыдущей записи; возвращает true в случае успеха и false, если предпринята попытка перейти к несуществующей записи;

r    sqlite_rewind() — переход к первой записи; возвращает false, если набор не содержит записей, и true — в противном случае;

r    sqlite_current(указатель) — возвращает текущую запись в указанном наборе как массив; если указатель текущей записи находится за последней записью набора, то функция возвращает false;

r    sqllite_seek(указатель, номер_записи) — переход к записи с указанным номером (нумерация начинается с 0) в указанном наборе; если указанная запись отсутствует в наборе, то возвращается false, иначе — true.

Глава 7. Работа с базами данных

7.1. Общие сведения о базах данных

7.2. Установка СУБД

7.2.1. Установка Microsoft SQL Server 2000

7.2.2. Установка MySQL

7.3. Основные средства PHP для взаимодействия с базой данных

7.3.1. Подключение к базе данных

7.3.2. Передача запросов к базе данных

7.3.3. Обработка данных в сценарии

7.4. Гостевая книга

7.4.1. Создание базы данных

Создание таблицы для хранения данных

Определение регистрационного имени и пароля пользователя

Определение прав пользователя

7.4.2. Сценарии для взаимодействия с посетителем

7.4.3. Сценарии для владельца гостевой книги

7.5. SQLite — базы данных без СУБД

 

Hosted by uCoz