Глава 4. ИСПОЛЬЗОВАНИЕ ЯЗЫКА PHP ДЛЯ ДОСТУПА К БАЗАМ ДАННЫХ

РНР - это действующий на стороне сервера встраиваемый в HTML межплатформенный язык сценариев, имеющий синтаксис, близкий к языку Си [19, 20]. Язык РНР дает возможность вставлять в файлы HTML инструкции языка PHP для создания динамического содержания. Эти инструкции обрабатывает препроцессор-интерпретатор РНР и заменяет их тем содержимым, которое производит этот код. PHP-программа может целиком состоять из конструкций языка PHP, а может быть смесью конструкций языков PHP и HTML. Стандартное расширение файла с PHP-программой - php.

Одним из распространенных применений РНР является работа с базами данных. Для целого ряда баз данных РНР имеет собственную поддержку, а другие доступны через ODBC-функции РНР. При вызове PHP-программы URL-адрес должен содержать номер порта, через который работает PHP:

html://fpm.ami.nstu.ru:81/~pmxxyy/t1.php

4.1. СИНТАКСИC ЯЗЫКА PHP

В именах переменных РНР верхний и нижний регистр различаются, т.е. $variable и $Variable - две разные переменные. Однако в именах функций РНР регистр не играет роли. Операторы РНР заканчиваются точкой с запятой.

В РНР присутствует три типа комментариев:

Встраивание PHP в HTML

При встраивании кода РНР в документ HTML нужно использовать для этого файла одно из следующих расширений: .phtml, .РНР, .РНР3, чтобы сервер знал о необходимости послать файл на обработку РНР.

Код РНР встраивается в обычную страницу HTML. Существует несколько способов встраивания код РНР в документ HTML.

Можно встраивать сразу несколько команд, разделяя их точкой с запятой:

Допустимо в любой момент переключатся между HTML и РНР. Следующий пример иллюстрирует процедуру вывода десяти строк, переключаясь между контекстами HTML и РНР:

Включение файлов

Важной функцией РНР является возможность включения файлов, в которых могут содержаться дополнительные тэги РНР. Для включения файла используется ключевое слово include, включающее файл page.inc:

в PHP-программу, как показано ниже:

Переменные

В РНР имена всех переменных начинаются с символа $. В РНР не нужно объявлять переменные. РНР автоматически объявляет переменную при первом присвоении ей значений. Переменные РНР не типизированы; им можно присваивать значения любого типа.

Типы данных

РНР поддерживает три простых типа данных: целые числа, числа с плавающей запятой и строки, а также два составных типа данных: массивы и объекты. В зависимости от контекста выполняется приведение типов.

Строки

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

Конкатенация (присоединение) строк осуществляется с помощью оператора "точка" (.);

Массивы

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

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

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

Аналогично организуется работа с многомерными массивами.

Создать массив можно путем вызова функции array():

Встроенная функция count() выдает число элементов в массиве.

Объекты

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

Управляющие структуры

Управляющие конструкции РНР напоминают конструкции языка С.

1. Оператор If - обычный условный оператор.

2. Оператор Switch можно использовать вместо серии операторов if.

3. Оператор While - это программная конструкция цикла, в котором выполнение некоторого кода повторяется, пока истинно некоторое выражение.

4. Оператор do/while - аналогичен while, но выражение, представляющее условие выполнения цикла, вычисляется в конце каждой итерации, а не перед ее началом.

5. Цикл for

Функции

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

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

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

Существует два способа передачи аргументов функции: по значению и по ссылке. При передаче аргумента по значению значение аргумента присваивается соответствующему параметру, определенному в функции. Изменение этого параметра внутри тела функции не влияет на аргумент, переданный функции.

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

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

Язык PHP имеет целый набор встроенных функций, выполняющих стандартные действия, например:

4.2. РАБОТА С ФОРМАМИ

Одна из наиболее удобных особенностей PHP - это способность автоматически передавать значения переменных из HTML-форм в переменные PHP. PHP автоматически генерирует массивы $_POST, $_GET, $_REQUEST и другие, имена элементов которых совпадают с именами объектов в HTML-форме и содержащих значения данных объектов. Массивы эти ассоциативные, т.е. если в форме присутствовала переменная "a", то она будет передана как $_POST["a"], $_GET["a"] или $_REQUEST["a"] соответственно.

Например, после нажатия кнопки "SUBMIT" на странице, содержащей HTML-форму

во время выполнения программы script.php, элемент массива $_REQUEST['name'] будет иметь значение "Smith", которое можно использовать в соответствующем контексте, например,

Разница в простоте написания данного PHP-скрипта по сравнению со скриптом, написанным на языке С, требующем разбора последовательности

очевидна.

В завершение приведем пример обработки данных, введенных посредством формы. Ниже приведен текст HTML-скрипта формы и ее внешний вид:

После ввода данных в форму как показано выше запускается PHP-программа, выполняющая обработку параметров формы:

4.3. ИНТЕГРАЦИЯ С БАЗАМИ ДАННЫХ

РНР поддерживает работу с базами данных различных СУБД:

  • Oracle
  • Microsoft SQL Server
  • Informix
  • Sybase
  • InterBase

.

  • PostgreSQL
  • mSQL
  • MySQL
  • DBase
  • Adabas D
  • . . .

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

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

1. resource Pg_connect (строка_соединения) - cоздать соединение с сервером PostgreSQL
. Входные параметры:

Строка,содержащая параметры соединения (адрес сервера, порт, имя базы данных, имя пользователя, пароль и пр.)

Пример: $dbconn = pg_connect ("host=fpm2 port=5432 dbname=students user=pm2101 password=pass");
. Возвращаемое значение: идентификатор соединения, если соединение прошло успешно, и FALSE в противном случае.
2. resource Pg_query (id_соединения, строка_запроса) - выполнить запрос к базе
. Входные параметры:

id_соединения - идентификатор соединения;

строка_запроса - строка SQL-запроса;

. Возвращаемое значение: Результат в виде ресурса или FALSE
3. array Pg_fetch_row(resource результат_запроса, int номер_строки) - получить строку запроса как нумерованный массив
  array Pg_fetch_assoc (resource результат_запроса, int номер_строки) - получить строку запроса как ассоциативный массив
. Входные параметры:

результат_запроса - идентификатор результата, возвращенный функцией Pg_query() (только для запросов типа select);

номер_строки - целое число.

. Возвращаемое значение: строка таблицы базы данных, возвращаемая как массив.
4. string current (array row) - получить очередное поле из строки таблицы базы данных.
. Входные параметры: array row- строка таблицы базы данных, возвращенная функцией ifx_fetch_row().
. Возвращаемое значение: очередное поле строки таблицы.
5. string next (array row) - получить следующее поле из строки таблицы базы данных.
. Входные параметры: array row - строка таблицы базы данных, возвращенная функцией ifx_fetch_row().
. Возвращаемое значение: следующее поле строки таблицы.
6. int reset( array$row) - перейти в начало строки.
. Входные параметры: array row - строка таблицы базы данных, возвращенная функцией ifx_fetch_row().
. Возвращаемое значение: нулевая позиция строки результата.
7. string key( array$row) - перейти в начало строки.
. Входные параметры: array row - строка таблицы базы данных, возвращенная функцией ifx_fetch_row().
. Возвращаемое значение: имя очередного поля строки результата.
8. int Pg_affected_rows (resource result_id) - получить число столбцов, обработанных запросом
. Входные параметры: result_id - результат, возвращенный функцией Pg_query().
. Возвращаемое значение: Возвращается число столбцов, обработанных запросом, ассоциированных с result_id. Для вставок, обновлений и удалений - это реальное количество обработанных столбцов. Для выборок - ожидаемое количество.
9. bool pg_free_result (resource result_id) - освободить ресурсы запроса
. Входные параметры: result_id - результат, возвращенный функцией Pg_query().
. Возвращаемое значение: Освобождает ресурсы, занятые запросом с идентификатором результата result_id. Возвращает 0 в случае ошибки.
10. bool pg_close ( resource link_identifier) - закрыть соединение с PostgreSQL
. Входные параметры: link_id - идентификатор соединения;
. Возвращаемое значение:

Общая схема написания PHP-программы, выполнеяющей взаимодействие с базой данных, мало отличается от структура CGI-скрипта, разница состоит лишь в используемых средствах:

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

Альтернативой к использованию функций current(), next() служит выбор полей из стороки результата по именам полей:

Посредством функций можно произвести несложный разбор строки результата $row на пары "имя поля-значение":

Следующая PHP-программа объединяет действия по вводу данных посредством формы и последующую работу с базой данных:

Для хранения информации (небольших объемов) на стороне клиента существует технология "cookies". Хранение информации реализует web-сервер, а передачу - протокол http.

Для создания и модификации значения cookie можно использовать функцию PHP setcookie(). Функция setcookie() может иметь до шести аргументов, в зависимости от того, какие функции cookie используются и кто будет считывать ее значения.

Простейший способ установки cookie в виде setcookie('name', 'bret') обеспечивает для каждой последующей страницы на WWW-сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт), для переменной $name значение 'bret', что позволяет контролировать значение этой переменной средствами PHP. Этот тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.

Если желательно, чтобы значение cookie запоминалось браузером после того, как пользователь закончит сессию, необходимо передать функции setcookie() третий параметр - дату истечения срока действия cookie. Вспомогательная функция mktime(), параметрами которой являются час, минуту, секунду, месяц, день и год, возвращает число секунд, прошедших с 1 января 1970 г. до указанного момента времени.

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

Последний параметр функции setcookie(), значение которого равно 1, требует, чтобы значение cookie передавалось только на те Web-сервера, которые используют безопасный протокол соединения (SSL - Secure Socket Layer). Для удаления cookie достаточно передать функции setcookie() единственный параметр - имя cookie : setcookie('name').