Глава 16. Базs данных

Содержание

16.1. Доступ к базам данных
16.1.1. Доступ ODBC
16.1.2. Соединения ODBC с помощью DSN
16.1.3. Соединения ODBC без DSN
16.1.4. Добавление записей
16.1.5. Выбор записей
16.1.6. Удаление записей
16.1.7. Изменение записей

В главе использованы материалы [FLOYD].

16.1. Доступ к базам данных

16.1.1. Доступ ODBC

PHP обеспечивает поддержку ODBC (Open DataBase Connectivity), что позволяет обращаться к любой совместимой с ODBC системе управления базами данных (СУБД), если в системе или сети доступно Имя источника данных (DSN — Data Source Name) или доступна строка соединения без DSN. Это включает доступ к таким реляционным базам данных, как Oracle, DB2, MS SQL Server, MySQL, и MS Access. Так как PHP включает функции доступа к базам данных MySQL без DSN, которые не требуют ODBC, в этом разделе для демонстрации методов ODBC будет применяться MS Access. Примеры можно использовать также с другими СУБД, совместимыми с ODBC.

16.1.2. Соединения ODBC с помощью DSN

Чтобы соединиться с базой данных, используя ODBC, сначала необходимо создать системное имя источника данных.

Вот как создается соединение ODBC с базой данных MS Access

Откройте в Панели управления значок Администрирование.

Сделайте в раскрывшемся окне двойной щелчок на значке Источники данных (ODBC).

Выберите вкладку Системный DSN.

На вкладке Системный DSN щелкните на кнопке Добавить.

Выберите Microsoft Access Driver. Щелкните на кнопке Готово.

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

Задайте для базы данных Имя источника данных (DSN).

Щелкните на кнопке OK.

Конфигурация DSN должна задаваться на компьютере, на котором размещен сайт Web. Если сайт располагается на удаленном сервере, необходимо задать конфигурацию на этом сервере.

После установления соединения ODBC можно использовать специальные функции PHP для соединения с базой данных и извлечения записей. Эти функции PHP описаны ниже.

16.1.3. Соединения ODBC без DSN

Соединения без DSN не требуют создания DSN системного уровня для соединения с базами данных и предоставляет некоторую альтернативу DSN. Вместо использования DSN для соединения с базой данных, разработчик определяет необходимую информацию прямо в приложении. При соединении без DSN разработчик может использовать стандарты соединения, отличные от ODBC, такие, как OLE DB. Соединения без DSN должны применяться в том случае, когда отсутствует доступ к серверу для регистрации DSN.

В Microsoft Access для создания соединений без DSN используется следующая строка соединения:

Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb

odbc_connect(dsn/строка соединения без dsn,имя_пользователя,пароль) – функция, используемая для соединения с источником данных ODBC. Функция получает четыре параметра: имя источника данных ( dsn ) или строку соединения без dsn, имя пользователя, пароль и необязательный тип курсора. В тех случаях, когда имя пользователя, пароль, и тип курсора не требуются, параметры можно заменить пустой строкой — ''. id соединения, возвращаемый этой функцией, требуется другим функциям ODBC. Можно иметь одновременно открытыми несколько соединений, если они либо имеют различные id, либо используют различные имя пользователя и пароль.

odbc_exec(id_соединения, строка_запроса SQL) – функция, используемая для выполнения оператора SQL. Функция получает два параметра: объект соединения id, созданный функцией odbc_connect(), и оператор SQL. При возникновении ошибки возвращает FALSE. Возвращает множество записей, если команда SQL выполняется успешно.

odbc_fetch_array(имя множества записей) – используется для извлечения записей или строк из множества записей как ассоциативного массива. Имя множества записей создается при вызове функции odbc_exec(). Эта функция возвращает массив строк, либо — FALSE.

odbc_num_rows(имя множества записей) – возвращает число строк в множестве результатов ODBC. Функция возвращает -1, если возникает ошибка. Для операторов INSERT, UPDATE и DELETE функция odbc_num_rows() возвращает число затронутых строк. Для предложения SELECT это может быть число доступных строк. Примечание: использование odbc_num_rows() для определения числа доступных строк после оператора SELECT возвращает -1 для драйверов MS Access.

odbc_close(id соединения) – закрывает соединение с сервером базы данных, связанное с данным идентификатором соединения.

16.1.4. Добавление записей

Применяя функции ODBC, рассмотренные в предыдущем разделе, вместе с языком SQL можно добавлять записи в таблицы базы данных. Записи добавляют в таблицу базы данных с помощью формы, представляющей поля ввода данных. Затем с помощью кнопки вызывается сценарий PHP для записи новой информации в таблицу с помощью команды SQL INSERT. Типичная форма ввода для добавления новой записи в таблицу Survey показана ниже.

Рисунок 16.1. Форма ввода

Форма ввода

Поля формы именуются соответствующим образом:

Name — 'Name', Email — 'Email',

Web Connection — 'Connection',

Residence (City/ST/Country) — 'Residence',

Age — 'Age', Gender — 'Gender',

Comments — 'Comments'.

Прежде чем переходить к коду, покажем синтаксис оператора SQL INSERT:

INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)

Более подробно оператор INSERT рассматривается в "Доступ к базе данных MySQL" .

Следующий код применяется для обработки данных формы VisitorSurvey.php:

VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit")

{

// Получение данных формы и присвоение скалярным переменным

$Name = $_POST[Name];

$Email = $_POST[Email];

$Connection = $_POST[Connection];

$Residence = $_POST[Residence];

$Age = $_POST[Age];

$Gender = $_POST[Gender];

$Comments = $_POST[Comments];

//Установление соединения с базой данных

$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

// Оператор SQL

$sqlstring = "INSERT INTO Survey " .

        "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection',                

                '$Residence', '$Age', '$Gender', '$Comments')";

       

//Выполнение оператора SQL и сохранение результатов в множестве записей

       

$rs = odbc_exec($conn,$sqlstring);

odbc_close($conn);

}

?>

Пример 9.1.

После щелчка на кнопке отправки создается суперглобальный массив $_POST, содержащий значения формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор odbc_connect(). Этому оператору требуется три параметра – DSN или строка соединения без DSN, имя пользователя и пароль. Здесь для соединения с базой данных Access используется строка соединения без DSN. Так как Access для доступа к данным не требует имя пользователя или пароль, то параметры username и password кодируются как значения NULL. Ссылка на соединение сохраняется в переменной $conn. Это пример ссылочной переменной PHP.

В отличие от скаляров или переменных массивов, ссылочные переменные не применяются в программе непосредственно, но часто используются в качестве параметров для других функций. После оператора соединения составляется оператор SQL INSERT и присваивается переменной $sqlstring. Затем функция odbc_exec() выполняет оператор SQL, создающий множество записей (множество записей из базы данных). Это множество записей присваивается $rs, другой ссылочной переменной PHP. Отметим, что функция odbc_exec() требует два параметра — $conn (ссылка на текущее соединение базой данных) и $sql (ссылка на текущий оператор SQL). В конце вызывается функция odbc_close() для закрытия текущего соединения с базой данных.

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

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

Предположим в предыдущем коде, что функция odbc_exec() содержит вместо $sql параметр $sqlString. PHP немедленно остановит выполнение страницы и выведет следующее сообщение:

Warning: odbc_exec() [function.odbc-exec]:

SQL error: [Microsoft][ODBC Microsoft Access Driver]

  Invalid use of null pointer ,

SQL state S1009 in SQLExecDirect in

  C:\ApacheRoot\VisitorSurvey.php on line 38

Ошибку PHP можно подавить с помощью оператора управления ошибками "@". После подавления ошибки можно добавить код для создания более понятного пользователю ответа. Такой подход показан ниже:

VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit")

{

//Извлечение данных формы и присвоение скалярным переменным

$Name = $_POST[Name];

$Email = $_POST[Email];

$Connection = $_POST[Connection];

$Residence = $_POST[Residence];

$Age = $_POST[Age];

$Gender = $_POST[Gender];

$Comments = $_POST[Comments];

//Установление соединения с базой данных

$conn = @odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

//Оператор SQL

$sql = "INSERT INTO Survey " .

        "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection',                

                '$Residence', '$Age', '$Gender', '$Comments')";

       

//Выполнение оператора SQL и сохранение результатов в множестве записей

       

$rs = @odbc_exec($conn,$sqlstring);

if (!$rs)

{

echo "Произошла ошибка. Попробуйте еще раз. ";

}

else

{

echo "Запись была успешно добавлена.";

}

odbc_close($conn);

}

?>

Пример 9.2.

После функции odbc_exec() используется оператор if для проверки статуса множества записей — $rs. Если множество записей успешно создано, то выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."

16.1.5. Выбор записей

Кроме использования функций ODBC с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT. Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания Company XYZ, имеет онлайновую форму, которая позволяет пользователям ввести фамилию сотрудника и найти имя и фамилию сотрудника, номер телефона и адрес e-mail.

Рисунок 16.2. Форма ввода

Форма ввода

Оператор SQL SELECT показан ниже:

SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria

  ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...

Более подробное рассмотрение оператора SELECT дано в "Доступ к базе данных MySQL" .

Следующий код используется для обработки формы DirectorySearch.php:

DirectorySearch.php

<?php

if ($_POST[submit] == "Search")

{

       

  //Извлечение данных формы

               

  $string = $_POST['SearchName'];

               

  //Установление соединения с данными

               

  $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

               

  //Выполнение оператора SQL SELECT

               

  $sql = "SELECT * FROM Directory WHERE LName = '$string'";

               

  $rs = odbc_exec($conn, $sql);

        }

?>

<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN"

        "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

       

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

<title>Страница Web</title>

<style>

 

  body {margin:15px;font:10pt Verdana}

  td {vertical-align:top;border:solid 1px gray}

  input,textarea{border:0px}

 

  </style>

 

 </head>

 

 <body>

 

 <form action="DirectorySearch.php" method="post">

 <p> Введите ниже фамилию и щелкните на кнопке "Search",

чтобы найти номер телефона сотрудника и адрес e-mail </p>

 <table>

 <tr>

 <td colspan="2">Company XYZ Directory</td>

 </tr>

 <tr>

 <td><input type="text" size="15" name="SearchName"/></td>

 <td><input type="submit" value="Search" name="submit"/>

 </tr>

 </table>

  </form>

 

 <div>

 

 <?php

 

 if(!empty($_POST))

 {

        while($row = odbc_fetch_array($rs))

       

        {

        echo "Name: " .$row['FName'] . "  ";

        echo  $row['LName'] . "<br/>";

        echo "Telephone: " . $row['Telephone'] . "<br/>";

        echo "Email: " . $row['Email'] . "<br/>";

        }

       

        odbc_close($conn);

 }      

 ?>

 

 </div>

 </body>

 </html>

Пример 9.3.

Эта страница содержит два блока кода PHP. Первый выполняется, когда делается щелчок на кнопке отправки "Search". Введенное пользователем имя ( first name ) присваивается скалярной переменной '$string'. Затем с базой данных устанавливается соединение и выполняется оператор SQL SELECT для выбора всех (*) полей записей таблицы, где значение поля 'lastname' совпадает со строкой фамилии, введенной пользователем. Наконец, выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

Второй блок кода появляется в разделе тела XHTML-документа. Код, содержащий операторы echo или print, помещается обычно между открывающим и закрывающим тегами <body>, чтобы он выводился или форматировался в соответствии с другими элементами страницы. Операторы echo и print в блоках PHP, появляющиеся выше <html>, всегда появляются в верху страницы и предшествуют всем другим ее элементам.

Назначение этого блока кода состоит в выводе записей, извлеченных при выполнении оператора SQL в предыдущем блоке кода. Сначала оператор if используется для определения, что массив $_POST не является пустым. Если массив пустой, то это означает, что форма не была отправлена и никакие записи не были извлечены. Если этот условный оператор будет отсутствовать, то возникнет ошибка, так как массив odbc_fetch_array не будет содержать никаких значений.

Затем используется цикл while для итераций на множестве записей. Во время каждой итерации по множеству записей, функция odbc_fetch_array() создает ассоциативный массив (здесь массив называется $row ), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элементы массива — значениям полей. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] – значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, при этом каждый раз массив $row содержит новые значения, пока не будет достигнут конец множества записей.

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

Ниже показан пример вывода, созданного после поиска в каталоге компании XYZ.

Рисунок 16.3. Пример вывода

Пример вывода

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

DirectorySearch.php

 <?php

 

 if(!empty($_POST))

 {

        $results = 0;

        while($row = odbc_fetch_array($rs))

        {

        echo "Name: " .$row['FName'] . "  ";

        echo  $row['LName'] . "<br/>";

        echo "Telephone: " . $row['Telephone'] . "<br/>";

        echo "Email: " . $row['Email'] . "<br/>";

       

        $results += 1;

        }

       

        if ($results == 0)

       

        {

       

                echo "Ничего не найдено!";

       

        }

       

        odbc_close($conn);

 }      

 ?>

 

 </div>

 </body>

 </html>

Модифицированный сценарий, показанный выше, добавляет счетчик записей $results для подсчета числа выводимых записей. В начале значение счетчика задается равным 0. Если множество записей существует, то цикл while будет выполнять итерации на каждой записи и увеличивать значение счетчика на 1. После окончания цикла проверяется значение счетчика. Если это значение равно 0, то никаких записей не было найдено, и выводится сообщение "Ничего не найдено!"

16.1.6. Удаление записей

Оператор SQL DELETE используется для удаления существующих в базе данных записей.

Синтаксис оператора SQL DELETE показан ниже:

DELETE FROM Имя_таблицы WHERE критерий

Более подробно оператор DELETE рассматривается в "Доступ к базе данных MySQL" .

Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel (Персонал). Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE, чтобы удалить эту запись из таблицы базы данных.

Рисунок 16.4. Удаление записи

Удаление записи

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

DirectorySearch.php

<?php

       

if ($_POST['submitb']=="Delete Record")

    {

               

     $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

     $sqlDelete = "DELETE FROM Personnel WHERE AutoNum =" . $_POST['AutoNum'];

     $rsDelete = odbc_exec($conn,$sqlDelete);  

       

         if(odbc_num_rows($rsDelete) == 1)

          {

       

            echo "Запись успешно удалена!";

       

          }

       

     odbc_close($conn);

               

    }

       

?>

Пример 9.4.

После щелчка на кнопке "Delete Record" устанавливается соединение с базой данных Access. Затем формируется оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи было успешным, и в выводе подтверждающего сообщения. Функция odbc_num_rows() применяется для определения числа строк в результатах ODBC или числа строк, затронутых оператором odbc_exec(). Так как удаляется одна запись, то запись будет удалена успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.

16.1.7. Изменение записей

Оператор SQL UPDATE используется для изменения или обновления существующих записей базы данных.

Синтаксис оператора SQL UPDATE показан ниже:

UPDATE ИмяТаблицы SET (FieldName1=value1 [,FieldName2=value2]...)

WHERE критерий

Следующая форма представляет запись пользователя, которая будет обновлена в таблице базы данных Personnel. Модификация любых полей, связанных с записью, и щелчок на кнопке Update Record вызывает процедуру PHP, которая выполняет оператор SQL UPDATE, чтобы обновить эту запись в таблице базы данных.

Рисунок 16.5. Обновление записи

Обновление записи

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

DirectorySearch.php

<?php

       

if ($_POST['submitb']=="Update Record")

    {

   

    $new_fname = $_POST['FName'];

    $new_lname= $_POST['LName'];

    $new_telephone = $_POST['Telephone'];

    $new_email = $_POST['Email'];

               

    $conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

    $sqlUpdate = "UPDATE Personnel SET (FName = '$new_fname', LName = '$new_lname', Telephone = '$new_telephone',  

    Email = '$new_email') WHERE AutoNum =" . $_POST['AutoNum'];

    $rsUpdate = odbc_exec($conn,$sqlUpdate);    

       

         if(odbc_num_rows($rsUpdate) == 1)

          {

       

            echo "Запись успешно обновлена!";

       

          }

       

     odbc_close($conn);

               

    }

       

?>

Пример 9.5.

После щелчка на кнопке "Update Record" текущие значения полей формы присваиваются скалярным переменным. Этот шаг не является обязательным, однако он упрощает кодирование оператора SQL UPDATE. Затем устанавливается соединение с базой данных Access. После соединения с базой данных формируется оператор SQL UPDATE для обновления записи в таблице Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsUpdate. Последний шаг состоит в проверке, что обновление записи было успешно, и в выводе подтверждающего сообщения.

Функция odbc_num_rows() используется для определения числа строк в результате ODBC или числа строк, затронутых оператором odbc_exec(). Так как обновляется только одна запись, то обновление записи проходит успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.