Четверг, 16.05.2024, 19:06
DigitalBox
Приветствую Вас Гость | RSS
Главная Взаимодействие с базой данных Регистрация Вход
Меню сайта

Взаимодействие с базой данных



Независимо от типа используемой базы данных для ее использования нужно выполнить следующие шаги:

  1. Подключиться к базе данных.
  2. Передать системе управления базой данных SQL-запрос с инструкциями.
  3. Получить и обработать данные.
  4. Закрыть соединение с базой данных.

Все эти шаги более подробно рассматриваются в следующих подразделах.


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


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

  • Местоположение. База данных может содержаться не только на том же компьютере, где установлен интерпретатор РНР. Поэтому для подключения к базе данных нужно указать имя компьютера, на котором она содержится. В качестве такого имени можно использовать либо доменное имя (например, mycompany.com), либо IP-адрес (172.17.204.2). Если же база данных расположена на том же компьютере, что и модуль РНР, то в качестве имени узла достаточно указать имя localhost.
  • Регистрационное имя. Для того чтобы получить доступ к базе данных, необходимо указать корректное регистрационное имя, которое должен предоставить администратор.
  • Пароль. Для доступа к базе данных необходимо также указать пароль, который тоже должен быть предоставлен администратором.
  • Имя базы данных. Поскольку система управления базами данных может одновременно поддерживать несколько хранилищ, при подключении следует указать имя базы данных, которую вы хотите использовать.

Для повышения уровня защиты параметры соединения с базой данных следует хранить в отдельном файле, который подключался бы в сценариях РНР с помощью функции include(). Поскольку включаемые файлы обычно хранится в безопасном месте, то и содержащаяся в них информация также будет в безопасности. Например, создадим файл info.inc со следующими параметрами подключения к базе данных:

$host = "localhost";
$account = "admin";
$password = "secret";
$dbname = "Catalog";


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

include("info.inc");

Для подключения к разным базам данных в языке РНР предназначены различные функции. В противном случае все было бы слишком просто. Однако в то же время следует заметить, что все функции достаточно похожи друг на друга. Так, при разработке Web-приложений наиболее популярной системой управления базами данных по праву считается MySQL. Для подключения к серверу MySQL 4.0 и более ранних версий предназначены функции:

$connect = mysql_connect($host, $account, $password);
$db = mysql_select_db("Catalog", $connect);


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

$connect = mysqli_connect($host, $account, $password);
$db = mysqli_select_db($connect, "Catalog");


При подключении к базе данных некоторые СУБД требуют использования двух отдельных функций (как в случае с MySQL). Например, для установки соединения с серверами mSQL и Sybase используются похожие пары функций:

$connect = msql_connect($host, $account, $password);
$db = msql_select_db("Catalog", $connect);

$connect = sybase_connect($host, Saccount, $password);
$db = sybaseselect_db("Catalog", $connect);


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

$connect = pg_connect("host=$host user=$user password=$password dbname=Catalog");

При подключении к другим базам данных используется аналогичный синтаксис, хотя и с некоторыми отличиями. Так, для соединения с базой данных Oracle с помощью интерфейса OCI8 предназначена функция:

$connect = OCILogon($account, $password);

При подключении к базе данных Oracle требуется, чтобы была установлена также переменная окружения ORACLE_SID.

Функции, которые необходимо использовать для подключения к конкретной базе данных, можно найти в справочном руководстве РНР. Это руководство можно загрузить с Web-узла www.php.net.


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

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

$sql = "SELECT * FROM Product";
$result = mysql_query($sql, $connect);


В первой строке SQL-запрос присваивается переменной $sql. Этот запрос предназначен для извлечения всех данных из таблицы Product. Функция mysql_query() передает SQL-запрос $sql базе данных, определяемой идентификатором $connect. Затем полученные данные сохраняются во временной таблице 1, указатель на которую содержится в переменной $result. При использовании базы данных PostgreSQL запрос SQL может выглядеть так:

$sql = "SELECT * FROM Product";
$result = pg_query($connect, $sql);


В первой строке SQL-запрос сохраняется в переменной $sql, а во второй строке этот запрос выполняется. В свою очередь, при взаимодействии с сервером Oracle для выполнения аналогичных действий придется вызвать три функции:

$sql = "SELECT * FROM Product";
$query = OCIParse($connect, $sql);
$result = OCIExecute($query);


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

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

$first_name = "Джон";
$last_name = "Смит";
$sql = "INSERT INTO Customer (firstName, lastName) VALUES
                         ('$first_name', '$last_name')";
$result = mysql_query($sql);


Если при обработке запроса SQL не было получено никаких данных, переменной $result присваивается значение TRUE. Перечень функций, предназначенных для передачи SQL-запросов базе данных, содержится в справочном руководстве РНР. Его можно найти на Web-узле www.php.net.


Обработка данных

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

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

$row = mysql_fetch_array($result);

В примерах из предыдущего раздела результаты выполнения SQL-запроса сохранялись в переменной $result. Функция mysql_fetch_array() возвращает из временной таблицы (которая определяется переменной $result) одну строку данных. После вызова функции mysql_fetch_array() массив $row будет содержать такую информацию:

$row['firstName'] = Джон
$row['lastName'] = Смит


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

while($row = pg_fetch_asoc($result))
{
     foreach($row as $value)
    {
         echo "$value<br>";
    }
}


Одна строка временной таблицы извлекается на каждой итерации цикла while. При этом на каждой такой итерации создается массив $row. В свою очередь, для прохода по массиву $row и вывода соответствующих значений используется цикл foreach.

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

$Nrows = pg_num_rows($result);
for($i=0; $i<$Nrows; $i++)
{
     $row = pg_fetch_row($result, $i);
     foreach($row as $value)
    {
         echo "$value<br>";
    }
}


В приведенном примере функция pg_num_rows() возвращает количество строк временной таблицы. (При работе с MySQL можно воспользоваться аналогичной функцией mysql_num_rows($result). На каждой итерации цикла for из таблицы выбирается, а затем обрабатывается одна строка. Проход по каждой строке (т.е. по массиву $row) осуществляется с помощью цикла foreach. Обратите внимание на то, что функции pg_fetch_row() передается параметр $i, определяющий номер строки, которую нужно извлечь из таблицы.

При работе с базой данных Oracle можно также выполнить аналогичные действия:

$Nfields = OCINumCols($result);
while (OCIFetch($result))
{
     for($i=1; $i<=$Nfields; $i++)
    {
         $value = OCIResult($result, $i);
         echo "$value<br>";
    }
}


В данном примере в переменной $Nfields содержится количество полей таблицы, а функция OCIFetch() используется для извлечения из таблицы одной строки. Цикл while выполняется до тех пор, пока не будут обработаны все строки временной таблицы. Функция OCIResult() возвращает значение из одного поля строки, полученной с помощью функции OCIFetch(). Цикл for предназначен для прохода и отображения значений всех полей текущей строки временной таблицы.

В предыдущих примерах приведен минимальный набор функций, которого достаточно для взаимодействия с реляционной базой данных. Однако следует заметить, что в языке РНР для работы с каждой системой управления базами данных имеется свой собственный богатый набор функций. Например, функция mysql_affect_rows() возвращает количество строк, которые Например, функция mysql_affect_rows() возвращает количество строк, которые были изменены в процессе выполнения запроса, а функция pg_f ield_name() возвращает имена полей.


Закрытие соединения с базой данных

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

mysql_close($connect);

Ниже приведены аналогичные функции для других баз данных.

ocilogoff($connect);       # Oracle
pg_close($connect);       # PostgreSQL
mssql_close($connect);  # MS SQL


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

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

Warning: mysql_connect():Access denied for user: 'root@localhost' (Using password: YES) in c:\test12.php on line 10

(Предупреждение: mysql_connect(): Доступ для пользователя запрещен: 'root@localhost' (Использование пароля: ДА) в файле c:\test12.php в строке 10)

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

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

$connect = pg_connect("host = $host user=$user
                   password=$password dbname=Catalog")
              or die('He удалось подключиться к базе данных");

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

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

$sql = "SELECT * FROM Productt";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

В результате использования неверного имени таблицы (лишний символ t в имени Product) отобразится следующее предупреждающее сообщение:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in test.php on line 9

(Предупреждение: mysql_fetch_array(): используемая переменная является некорректным результатом выполнения запроса к базе данных MySQL в файле test.php в строке 9)

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

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

$sql = "SELECT * FROM Productt";
$result = mysql_query($sql)
                or die("Запрос не выполнен: ".mysql_error());
$row = mysql_fetch_array($result);

Это приведет к получению следующего результата:

Запрос не выполнен: Table 'Catalog.productt' doesn't exist

(Запрос не выполнен: Таблица 'Catalog.productt' не существует)

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

Общие процедуры обработок ошибок в сценариях РНР применимы и при работе с базами данных. Например, сообщения об ошибках можно не выводить на экран, а записывать в специальном журнале.


Собирая все вместе...

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

В первом примере используется база данных PostgreSQL с именем Sales (Продажи), в которой содержится таблица Customer (Покупатель). В этой таблице содержатся имена, фамилии и номера телефонов покупателей. В листинге А приведен код сценария, отображающего все содержимое таблицы Customer на Web-странице.

Листинг А. Сценарий для отображения информации о покупателях

‹?php
/* Имя сценария:    DisplayCustomers
  * Описание:             этот сценарий позволяет извлечь из базы
  *                                  данных PostgreSQL всю информацию о
  *                                  покупателях и вывести ее на Web-странице.
  */
     include (" info, inc");    # содержит параметры соединения с базой данных
     $connect = pg_connect("host=$host user=$user
                           password=$password dbname=Sales")
                     or die("He удалось подключиться к базе данных");
     $sql = "SELECT * from Customer";
     $result = pg_query($sql)
                       or die ("Запрос не выполнен :" .mysql_error ());
     $Nrows = pg_num_rows($result);
     echo "<html>
                 <head><title>Список пoкyпaтeлeй</title></head>
                 <body>
                 <table width=\"100%\" border=\"0\">\n";
     for($i=0; $i<$Nrows; $i++)
     {
          echo "<tr>";
          $row = pg_fetch_row($result,$i);
          echo "<td>{$row[1]}, {$row[0]}</td>
                      <td>{$row[2]}</td>";
          echo "</tr>\n";
     }
     echo "</table></body></html>";
?›

Этот сценарий извлекает из базы данных Customer всю информацию о покупателях, а затем с помощью цикла for выводит данные на Web-странице в виде таблицы HTML.

Во втором примере (листинг B) создается группа флажков, с использованием которых пользователь может выбрать вид товара, который он хочет просмотреть. При этом виды товара выбираются из базы данных MySQL. Таблица этой базы данных состоит из двух полей, ProductType (Тип товара) и Description (Описание).

Листинг В. Сценарий для создания группы флажков

<html>
<head><title>Тестирование файлов</title></head>
<body>
‹?php
/* Имя сценария:    DisplayCheckboxes
  * Описание:             получает информацию из базы данных MySQL и
  *                                  создает группу флажков на Web-странице.
  */
     include("info.inc");    # содержит параметры соединения с базой данных
     $connection = mysql_connect($host,$user,$password)
             or die ("He удалось подключиться к серверу");
     $db = mysql_select_db("Catalog",$connection)
             or die ("He удалось выбрать базу данных");
     $query = "SELECT * FROM ProductType";
     $result = mysql_query($query)
             or die("3anpoc не выполнен: " .mysql_error ());
     echo "<html><head><title>Товары</title></head>
                 <body><div style='margin-left: .2in'>
                 <hЗ>Какой вид товаров Вас интересует?</hЗ>\n";
## создание формы с флажками ##
     echo "<form action='processform.php' method='post'>\n";
     echo "<hr><table width='100%'>" ;
     while ($row = mysql_fetch_array($result))
     {
          echo "<tr>";
          echo "<td width='20%'><b><input type='checkbox'
                         name=\"interest['ProductType']\ "
                         value=\"{$row['ProductType']}\">{$row['ProductType']}
                         </b></td>\n" ;
          echo "<td>{$row['Description']}</td>";
          echo "</tr>\n";
     }
     echo "</table>";
     echo "<p><input type='submit' value='Выбрать товар'>
                 </form>\n";
?›
</div></body></html>

В приведенном сценарии создается форма с HTML-таблицей. В цикле while из временной таблицы $result выбираются строки, данные из которых затем используются при создании строк HTML-таблицы. Этот цикл завершается после обработки всех строк временной таблицы, полученной в результате выполнения SQL-запроса.

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

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

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz