≪
≫

ФУНКЦИИ РНР ДЛЯ РАБОТЫ С СУБД

Поддержка БД в РНР

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

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

В РНР реализована обширная поддержка практически всех существующих серверов БД, в том числе: AdabasD, Informix, PostgreSQL, Dbase, Ingres, Solid, DirectMS-SQL, InterBase, Sybase, Empress, mSQL, UNIXdbm, File-Pro (read-only), MySQL, Velods, FrontBase, ODBC, IBM DB2, Oracle (OCI7 и OC18).

Настройка РНР и InterBase

Для корректной работы с InterBase посредством РНР необходимо произвести ряд настроек.

В корневую директорию РНР необходимо скопировать файл библиотеки gds32.dll (по умолчанию находится в директории windows/system32).

Следует убедиться, что в директории php/ext присутствует файл библиотеки php_interbase.dll, если его нет, необходимо скачать библиотеку для данной версии РНР.

Затем надо включить в конфигурации РНР использование библиотеки для InterBase. Для этого в файле php.ini (корневая директория РНР) следует снять комментарий (символ «;») со строки «extension=php_interbase.dll». После чего можно переходить к работе с InterBase.

Стандартные функции РНР для работы с InterBase

В примерах данной темы используются таблицы «products», «customers» и «orders» (рис. 20).

Реляционная БД

Рис. 20. Реляционная БД

Общая последовательность действий при взаимодействии с сервером InterBase выглядит так:

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

Подключение к серверу InterBase

1) ibase_connect().

Функция устанавливает связь с сервером InterBase и БД.

Синтаксис:

Ша8е_соппес1(51пп§[хост:][порт:]/путь/к/БД, [string имя поль- зователя] [, string пароль]).

Желательно, чтобы сервер БД InterBase и РНР находились на одном хосте. Наряду с именем хоста может указываться необязательный параметр - номер порта. Параметры «имя_пользователя» и «пароль» должны соответствовать имени пользователя и паролю, заданным InterBase.

Пример:

$host = 'localhost:C:/DBdirectory/demo.gdb';

$user = 'SYSDBA';

$password = ’masterkey';

@ibase_connect($host; $user; $password) or die(«He удается подключиться к БД»);

В данном примере localhost — имя компьютера, SYSDBA — имя пользователя, a masterkey — пароль. Знак «@» перед вызовом функции ibase_connect() подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, они заменяются сообщением, указанным при вызове die(). Следует обратить внимание, что значение, возвращаемое при вызове ibase_ connect(), в данном примере не указывается. Если в программе используется всего одно соединение с сервером InterBase, это вполне нормально. Но если программа устанавливает соединения с несколькими БД, InterBase следует сохранить идентификатор соединения, возвращаемый при вызове ibase_connect(), чтобы адресовать последующие команды нужной БД.

Пример:

?

$linkl = @ibase_connect(«'localhost:C:DBdirectorydemo.gdb'», «web», «abcde») or die(«He удается подключиться к БД!»);

$link2 = @ibase_connect(«'localhost:D:DBdirectory2dirsample. gdb’», «usr», «secret») or die(«He удается подключиться к БД!»);

?.

Идентификаторы $linkl и $link2 передаются при последующих обращениях к БД с запросами.

Функция ibase_pconnect() работает почти так же, как ibase_ connect(), но с двумя отличиями. Во-первых, при соединении эта функция сначала пытается найти ссылку (постоянную), уже открытую с теми же параметрами. Если она найдена, возвращается ее идентификатор вместо открытия нового соединения. Во-вторых, соединение с InterBase-сервером не будет закрыто по окончании выполнения скрипта. Ссылка остается открытой для последующего использования (ibase_close() не будет закрывать ссылки, установленные функцией ibase_pconnect()). Ссылки этого типа называются «persistent/постоянные».

2) ibase_close().

После завершения работы с БД соединение необходимо закрыть. Функция ibase_close() закрывает соединение, определяемое необязательным параметром. Если id соединения опущен, принимается последняя открытая ссылка. Транзакция по умолчанию для ссылки подтверждается, другие транзакции откатываются.

Синтаксис:

int ibase_cIose([int идентификатор_соединения]).

Пример:

?

$1 i n k 1 = @ ibase_con nect(«' local host: C:DBdi rectorydemo.gdb'», «web», «abcde») or die(«He удается подключиться к БД!»);

$link2 = @ibase_connect(«’localhost:D:DBdirectory2dirsample. gdb'», «usr», «secret») or die(«He удается подключиться к БД!»);

ibase_close($linkl);

ibase_close($link2);

?.

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

1) ibase_query().

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

Синтаксис:

int ibase query (string 3anpoc[,int идентификаторсоединения]). Параметр «запрос» содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром «идентификатор соединения», либо при отсутствии параметра последнему открытому соединению.

Если при обработке расходуется слишком много памяти, следует вызвать стандартную функцию РНР — ibase_free_ result, она освобождает всю память, связанную с данным запросом. При вызове ей передается идентификатор результата, возвращаемый ibase_query().

2) ibase_affected_rows().

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

Синтаксис:

int ibase_affected_rows([int идентификаторсоединения]). Замечание. Параметр «идентификатор соединения» не является обязательным. Если он не указывается, ibase_affected_ rows() пытается использовать последнее открытое соединение. Пример:

?

// Подключиться к серверу и выбрать БД @ibase_connect(«'localhost:C:DBdirectorydemo.gdb'»,«web», «abcde») or die(«He удается подключиться к БД!»);

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

$query = «UPDATE products SET prod name = «cantaloupe» WHERE prod_id = T0001prV;

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

$result = ibase_query($query);

// Определить количество обновленных записей echo «Всего обновлено записей:» ibase_affected_rows();

ibase_ck>se();

?.

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

Всего обновлено записей: 1.

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

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

3) ibase_mim_rows().

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

Синтаксис:

int ibase_mim_rows(int результат).

Пример:

?

// Подключиться к серверу и выбрать БД @ibase_connect(«'localhost:C:DBdirectorydemo.gdb'»,«web», «abcde») or die(«He удается подключиться к БД!»);

// Выбрать все товары, названия которых начинаются с 'р' $query = «SELECT prod name FROM products WHERE prodname LIKE «p*»»;

// Выполнить запрос $result = ibase_query($query); echo «Всего выбрано записей:» ibase num rows(Sresult); ibase_close();

?.

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

Всего выбрано записей: 1.

4) ibase_fetch_row().

Возвращает массив, соответствующий извлеченному ряду, или FALSE, если рядов больше нет. Ряд возвращается как массив. Каждый результирующий столбец хранится в смещении массива, начиная со смещения 0.

Последующий вызов ibase_fetch_row() возвратит следующий ряд результирующего набора или FALSE, если рядов больше нет.

Синтаксис:

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

Пример 1. Выборка данных функцией ibase_fetch_row().

?

@ibase_connect(«'localhost:C:DBdirectorydemo.gdb'»,«web», «abcde») or die(«He удается подключиться к БД!»);

$query = «SELECT * FROM products»;

$result = ibase_query($query); echo «

»;

echo «

»;

while (Srow = ibase_fetch_row($result)) { echo «

»:

foreach($row as $key => $value) { echo «

»;

}

echo «

»;

};

echo «

Product IDProduct Name Product Price
».$value.«
»; ibase_close();

?.

Пример 2. Результат выполнения листинга 1.

Product I DProduct NameProduct Price
1000pr apples 1.23
1001pr oranges 2.34
1002pr bananas 3.45
1003pr pears 4.45
.

6) ibase_fetch_assoc().

Функция аналогична ibase_fetch_row(), однако значения полей записи сохраняются в ассоциативном массиве. Синтаксис:

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

Пример 3 содержит вариант кода примера 1. На этот раз используется функция ibase_fetch_assoc(), возвращающая ассоциативный массив полей.

?

@ibase_connect(«'localhost:C:DBdirectorydemo.gdb'»,«web», «abcde») or die(«He удается подключиться к БД!»);

$query = «SELECT * FROM products»;

Sresult = ibase_query($query); echo «

»;

echo «

»;

while ($row = ibase_fetch_assoc($result)) { echo «

»;

echo«

»; echo « »;

};

echo «

Product IDProduct Name Product Price
». $row[«prod_id»]. « ». $row[«prod_name»]. « ». $row[«prod_price»]. «
»; ibase_close();

?.

Пример 3 выдает тот же результат, что и пример 2.

Внесение данных через РНР

Для добавления данных в базу посредствам РНР можно использовать функцию ibase_query() и оператор INSERT. Синтаксис оператора INSERT:

INSERT INTO Имя таблицы [(Список полей)]VALUES (Список констант);

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

INSERT INTO Clients

VALUES (1, 'Иванов И.И.', 'Вокзальная 3', 'Москва', '09599911100');

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

// Функция добавления данных в БД function get INSERT ($name, $age) {

// Создаем запрос к БД

$INSERT = ibase_query(«INSERT INTO test (name, age) VALUES ('$name', '$age')»); if (!$INSERT) {

return exit ('Ошибка добавления данных в БД');

}

// Если данные добавились успешно echo «Данные успешно добавлены»;

}•

  • Ш ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
  • 1. Приведите порядок настройки РНР и InterBase.
  • 2. Опишите функции РНР для подключения к серверу InterBase.
  • 3. Опишите функции РНР для выборки набора данных.
  • 4. Представьте функцию добавления данных.
 
Посмотреть оригинал