Пишите нам

Имя:
Email:

 
 
 

Статьи

Важные особенности, сопровождающие перевод паспорта с нотариальным заверением
Списание компьютерной и другой оргтехники: как это сделать
Коротко о продвижении
Восстановление данных с CD диска
Безопасность при создании сайтов
Виртуальный офис: новый уровень организации бизнеса
Виртуальная АТС Гравител
Акция на антивирус
Обзор iPad 3
Как сделать сайт удобным?
Как купить сумку для нетбука
Методы получения внешних ссылок на сайт
Широкие возможности Skype для Android
Качественные мобильные телефоны
Сайт визитка: особенности хорошего старта
Надувные матрасы от Ламон
WebNames.Ru – десятилетие деятельности в Интернете
Квартира для вашего сайта.
Технологии от BoldSoft
Как добиться успеха в безнадежных проектах
Новый тип навигационной системы при постраничном выводе
Генерация PDF с помощью PHP
PHP и PostgreSQL
Оптимизируем MySQL

PHP и PostgreSQL
Автор Vikram Vaswani

Дело выбора
Что-то несправедливое происходит. По какой-то причине каждая статья по PHP предполагает, что если Вы используете базу данных при разработке Ваших приложений, то эта база данных - MySQL.

Я ничего не имею против MySQL, я считаю ее замечательным продуктом и часто использую в своих разработках. Однако, это не единственная RDBMS - многие разработчики используют PostgreSQL уже достаточно долгое время для хранения и управления данными. Единственная проблема: они не знают с чего начать. Функции PHP, используемые при обращении к PostgreSQL отличаются от тех, когда используется MySQL, поэтому документации явно не хватает.

Поэтому я решил исправить ситуацию. Вот почему эта статья - взгляд на PHP с точки зрения разработчика для базы данных PostgreSQL, в ней рассказывается как PHP можно использовать с PostgreSQL. Если Вы используете MySQL, Вам возможно будет и не очень интересно, если же Вы разрабатываете приложения на PostgreSQL, то надеемся она станет для Вас глотком свежего воздуха J

Начало
Перед началом, убедимся, что у Вас есть все необходимое для работы с PHP/PostgreSQL. Вот маленькая шпаргалка:

1. Последняя версия PostgreSQL, которую можно скачать с http://www.postgresql.com (в этой статье используется версия 7.1)

2. Web сервер, поддерживающий PHP, PHP можно скачать с http://www.php.net/ (в данной статье использовался Apache 1.3.24 с PHP 4.2.0).

Заметьте, что Ваш PHP должен поддерживать PostgreSQL, чтобы примеры из этой статьи работали. Вы можете включить поддержку PostgreSQL при компиляции PHP используя следующую директиву: "-with-pgsql". Заметьте также, что PHP 4.2.0 и выше содержит изменения в именах функций, используемых для работы с PostgreSQL; в этой статье используются новые имена функций и предполагается, что Вы работаете на PHP 4.2.x. Зайдите на http://www.php.net/manual/en/ref.pgsql.php для получения более подробной информации об изменениях с более ранних версий.

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


Все права на публикацию этой статьи принадлежат RusHelp.com

Предположим, что Вы все правильно установили. Запустим сервер баз данных и Web сервер.

--------------------------------------------------------

[postgres@medusa] $ /usr/local/pgsql/bin/postmaster -i -D
/usr/local/pgsql/data &
DEBUG: database system was shut down at 2002-04-12 19:18:12 IST
DEBUG: CheckPoint record at (0, 1694744)
DEBUG: Redo record at (0, 1694744); Undo record at (0, 0); Shutdown
TRUE
DEBUG: NextTransactionId: 643; NextOid: 18778
DEBUG: database system is in production state [postgres@medusa] $ su -
root [root@medusa] $ /usr/local/apache/bin/apachectl start Starting
httpd [OK] [root@medusa] $

---------------------------------------------------------

Заметим, что север PostgreSQL должен быть запущен под специальным пользователем "postgres", который создается при инсталляции PostgreSQL, и при старте должен включаться дополнительный параметр "-i" чтобы разрешить TCP/IP подключения к серверу.

Следующий шаг - это создание таблице в тестовой базе данных, вот как выглядит SQL дамп:

---------------------------------------------------------

CREATE TABLE addressbook (id serial, name varchar(255), address text,
tel varchar(50), email varchar(255));
INSERT INTO addressbook values (nextval(`addressbook_id_seq'), `Bugs
Bunny', `The Rabbit Hole, Looney Toons, USA', `123 4567',
`bugs@wascallywabbit.net');
INSERT INTO addressbook values (nextval(`addressbook_id_seq'), `Robin
Hood', `Sherwood Forest', `None', `robin@steal.from.the.rich');
INSERT INTO addressbook values (nextval(`addressbook_id_seq'), `Sherlock
Holmes', `221B Baker Street, London 16550, England', `911 1822',
'holmes@bakerstreetirregulars.domain');

----------------------------------------------------------

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

-----------------------------------------------------------

[postgres@medusa] $ /usr/local/pgsql/bin/createdb test [postgres@medusa]
$ /usr/local/pgsql/bin/psql -d test -f /home/postgres/addressbook.sql

------------------------------------------------------------

Теперь проверим, удалось ли импортирование данных с помощью запроса SELECT, который используется для выборки информации из базы. Для этого воспользуемся интерактивной клиентсткой программой "psql".

------------------------------------------------------------

[postgres@medusa] $ /usr/local/pgsql/bin/psql -d test
Welcome to psql, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
test=# SELECT COUNT(*) FROM addressbook;
count
3
(1 row)
test=#

------------------------------------------------------------

что переводится как: "сосчитать все записи в таблице `addressbook' и вывести их число.

Если вывод у Вас такой же как выше, примите поздравления - все ок!

Первые шаги
Как сделать то же самое с помощью PHP? То есть, сделать выборку запросом SELECT из базы и вывести данные на страницу.

------------------------------------------------------------





// database access parameters
// alter this as per your configuration
$host = "localhost";
$user = "postgres";
$pass = "postgres";
$db = "test";

// open a connection to the database server
$connection = pg_connect ("host=$host dbname=$db user=$user
password=$pass");
if (!$connection)
{
die("Could not open connection to database server");
}

// generate and execute a query
$query = "SELECT * FROM addressbook";
$result = pg_query($connection, $query) or die("Error in query: $query.
" . pg_last_error($connection));

// get the number of rows in the resultset
$rows = pg_num_rows($result);

echo "There are currently $rows records in the database.";
// close database connection
pg_close($connection);

?>


---------------------------------------------------------

А вот как выглядит вывод:

---------------------------------------------------------

There are currently 3 records in the database.

---------------------------------------------------------

Как Вы заметили, использование PHP для получения данных из базы включает в себя несколько шагов, каждый из которых является функцией PHP. Рассмотрим каждый шаг:


Все права на публикацию этой статьи принадлежат RusHelp.com

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

----------------------------------------------------------

// database access parameters
// alter this as per your configuration
$host = "localhost";
$user = "postgres";
$pass = "postgres";
$db = "test";

-----------------------------------------------------------

2. Чтобы начать коммуникацию с сервером PostgreSQL, нужно открыть соединение с сервером. Вся коммуникация между PHP и сервером баз данных идет через это соединение.

Для открытия соединения PHP предлагает функцию pg_connect().

----------------------------------------------------------

// open a connection to the database server
$connection = pg_connect ("host=$host dbname=$db user=$user
password=$pass");

-----------------------------------------------------------

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

-----------------------------------------------------------

$connection = pg_connect ("host=myhost dbname=mydb");
$connection = pg_connect ("host=myhost dbname=mydb user=postgres
password-postgres");
$connection = pg_connect ("host=myhost port=5432 dbname=mydb
user=postgres password-postgres");

------------------------------------------------------------

Затем эта функция возвращает "идентификатор соединения", который хранится в переменной $connection; этот идентификатор используется во всем скрипте, когда нужно обратиться к базе данных.

3. Теперь, когда у Вас есть соединение с базой, можно отправить ей запрос, используя функцию pg_query(). Функция требует двух параметров: идентификатора соединения и тело запроса.

-----------------------------------------------------------

// generate and execute a query
$query = "SELECT * FROM addressbook";
$result = pg_query($connection, $query) or die("Error in query: $query.
" . pg_last_error($connection));

------------------------------------------------------------

Результирующий набор, возвращаемый функцией, хранится в переменной $result.

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

-------------------------------------------------------------

// get the number of rows in the resultset
$rows = pg_num_rows($result);

-------------------------------------------------------------

Есть несколько других альтернатив, которые можно использовать на этом шаге, о которых мы поговорим позже.

5. Наконец, каждое соединение с базой занимает какое-то количество памяти. Поэтому если прелподагается серьезная нагрузка на систему, то лучше использовать функцию pg_close() для закрытия соединения и освобождения памяти.

------------------------------------------------------------

// close database connection
pg_close($connection);

------------------------------------------------------------

Просто, а?

Копнем поглубже
Ну это был очень простой пример. А теперь попробуем что-нибудь более полезное.

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

------------------------------------------------------------




Address Book


// database access parameters
// alter this as per your configuration
$host = "localhost";
$user = "postgres";
$pass = "postgres";
$db = "test";

// open a connection to the database server
$connection = pg_connect ("host=$host dbname=$db user=$user
password=$pass");
if (!$connection)
{
die("Could not open connection to database server");
}

// generate and execute a query
$query = "SELECT name, address FROM addressbook ORDER BY name"; $result
= pg_query($connection, $query) or die("Error in query: $query. " .
pg_last_error($connection));
// get the number of rows in the resultset
// this is PG-specific
$rows = pg_num_rows($result);

// if records present
if ($rows > 0)
{
// iterate through resultset
for ($i=0; $i<$rows; $i++)
{
$row = pg_fetch_row($result, $i);
?>





  • }
    }
    // if no records present
    // display message
    else
    {
    ?>
    No data available.
    }

    // close database connection
    pg_close($connection);

    ?>

    --------------------------------------------------------------

    Вот так выглядит вывод:

    Как и в предыдущем примере, скрипт сначала устанавливает соединение с базой. Формируется запрос и возвращается результирующий набор с данными. В данном случае, поскольку приходится иметь дело с несколькими записями, используется функция pg_fetch_row() вместе с циклом "for" для прохода по всему результирующему набору и вывода всех записей.

    Функция pg_fetch_row() возвращает столбцы в каждой записи как элементы массива, что дает возможность легко получить значения в каждой записи. Соединив ее с циклом "for", можно легко обработать весь результирующий набор, выводя все возвращенные записи как элементы списка.

    В конце, если Вам интересно, функция pg_last_error() возвращает последнюю ошибку, сгенерированную сервером PostgreSQL. Вместе с функцией die() это создает некий механизм отладки скрипта.


    Все права на публикацию этой статьи принадлежат RusHelp.com

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

    ----------------------------------------------------------




    Address Book


    // database access parameters
    // alter this as per your configuration
    $host = "localhost";
    $user = "postgres";
    $pass = "postgres";
    $db = "test";

    // open a connection to the database server
    $connection = pg_connect ("host=$host dbname=$db user=$user
    password=$pass");
    if (!$connection)
    {
    die("Could not open connection to database server");
    }

    // generate and execute a query
    $query = "SELECT name, address FROM addressbook ORDER BY name"; $result
    = pg_query($connection, $query) or die("Error in query: $query. " .
    pg_last_error($connection));
    // get the number of rows in the resultset
    // this is PG-specific
    $rows = pg_num_rows($result);

    // if records present
    if ($rows > 0)
    {
    // iterate through resultset
    for ($i=0; $i<$rows; $i++)
    {
    $row = pg_fetch_array($result, $i, PGSQL_ASSOC);
    ?>
  • ?>




    }
    }
    // if no records present
    // display message
    else
    {
    ?>
    No data available.
    }

    // close database connection
    pg_close($connection);

    ?>

    --------------------------------------------------------------

    Все волшебство здесь заключается в вызове функции pg_fetch_array(),

    --------------------------------------------------------------------------------

    $row = pg_fetch_array($result, $i, PGSQL_ASSOC);

    -------------------------------------------------------------

    которая возвращает каждую запись в виде хеша, с ключами, соответствующими имени столбца в таблице.

    PHP также дает возможность получить доступ к полям в записи как к свойствам объекта, вместо элементов массива, используя функцию pg_fetch_object(). Взгляните сюда:

    -------------------------------------------------------------




    Address Book


    // database access parameters
    // alter this as per your configuration
    $host = "localhost";
    $user = "postgres";
    $pass = "postgres";
    $db = "test";

    // open a connection to the database server
    $connection = pg_connect ("host=$host dbname=$db user=$user
    password=$pass");
    if (!$connection)
    {
    die("Could not open connection to database server");
    }

    // generate and execute a query
    $query = "SELECT name, address FROM addressbook ORDER BY name"; $result
    = pg_query($connection, $query) or die("Error in query: $query. " .
    pg_last_error($connection));
    // get the number of rows in the resultset
    // this is PG-specific
    $rows = pg_num_rows($result);

    // if records present
    if ($rows > 0)
    {
    // iterate through resultset
    for ($i=0; $i<$rows; $i++)
    {
    $row = pg_fetch_object($result, $i);
    ?>
  • name; ?>


    address; ?>


    }
    }
    // if no records present
    // display message
    else
    {
    ?>
    No data available.
    }

    // close database connection
    pg_close($connection);

    ?>

    -------------------------------------------------------------

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


    Все права на публикацию этой статьи принадлежат RusHelp.com

    Покатаемся
    Одно из приятных свойств PostgreSQL, и одна из причин, почему многие разработчики его предпочитают MySQL - это поддержка транзакций (если Вы не знаете, это возможность группировать несколько запросов в одно целое, чтобы выполнить их все сразу или не выполнить ни один). Дальнейшую информацию можно получить здесь: http://www.postgresql.org/idocs/index.php?tutorial-transactions.html - а если Вы уже знаете что это такое: вот пример: демонстрирующий как их можно использовать.

    --------------------------------------------------------------

    // database access parameters
    // alter this as per your configuration
    $host = "localhost";
    $user = "postgres";
    $pass = "postgres";
    $db = "test";

    // open a connection to the database server
    $connection = pg_connect ("host=$host dbname=$db user=$user
    password=$pass");
    if (!$connection)
    {
    die("Could not open connection to database server");
    }

    // begin a transaction block
    $query = "BEGIN WORK";
    $result = pg_query($connection, $query) or die("Error in query: $query.
    " . pg_last_error($connection));

    // generate some queries
    $query = "INSERT INTO addressbook values (nextval(`addressbook_id_seq'),
    `Spiderman', `The Web, Somewhere In Your Neighborhood', `None',
    `spidey@neigborhood.com')"; $result = pg_query($connection, $query) or
    die("Error in query: $query. " . pg_last_error($connection));
    $query = "INSERT INTO addressbook values (nextval(`addressbook_id_seq'),
    `Bruce Wayne', `Gotham City', `64928 34585', `bruce@batcave.org')";
    $result = pg_query($connection, $query) or die("Error in query: $query.
    " . pg_last_error($connection));
    // now roll them back
    $query = "ROLLBACK";
    // if you want to commit them, comment out the line above
    // and uncomment the one below
    // $query = "COMMIT";
    $result = pg_query($connection, $query) or die("Error in query: $query.
    " . pg_last_error($connection));
    // now check to see how many records are there in the table // and print this $query = "SELECT * FROM addressbook";
    $result = pg_query($connection, $query) or die("Error in query: $query.
    " . pg_last_error($connection)); $rows = pg_num_rows($result); echo
    "There are currently $rows records in the database";
    // close database connection
    pg_close($connection);

    ?>

    -----------------------------------------------------------

    Технически, здесь ничего нового нет - этот скрипт использует те же функции, что Вы видели раньше. Разница в том, как обрабатываются SQL запросы, как начинается и заканчивается блок транзакции и в использовании директив COMMIT и ROLLBACK для подтверждения или отказа от транзакции.

    Сбор ошибок
    Все сделано? Нет, еще кое-то осталось - перед тем, как Вы начнете создавать интересные Web сайты для своих клиентов, запомните, что PHP включает в себя мощные механизмы отслеживания ошибок, что может помочь Вам ускорить разработку приложений. Посмотрите на следующий пример, в котором намеренно оставлена ошибка в запросе SELECT:

    -------------------------------------------------------------





    // database access parameters
    // alter this as per your configuration
    $host = "localhost";
    $user = "postgres";
    $pass = "postgres";
    $db = "test";

    // open a connection to the database server
    $connection = pg_connect ("host=$host dbname=$db user=$user
    password=$pass");
    if (!$connection)
    {
    die("Could not open connection to database server");
    }

    // generate and execute a query
    $query = "SELECTA * FROM addressbook";
    $result = pg_query($connection, $query) or die("Error in query: $query.
    " . pg_last_error($connection));

    // get the number of rows in the resultset
    // this is PG-specific
    $rows = pg_num_rows($result);

    echo "There are currently $rows records in the database";
    // close database connection
    pg_close($connection);

    ?>


    -------------------------------------------------------------

    А вот вывод:

    ------------------------------------------------------------

    Warning: pg_query() query failed: ERROR: parser: parse error at or near
    "selecta" in /usr/local/apache/htdocs/e.php on line 23 Error in query:
    SELECTA * FROM addressbook. ERROR: parser: parse error at or near
    "selecta"

    ------------------------------------------------------------

    Функция pg_last_error() выводит последнюю ошибку, возвращенную PostgreSQL. Укажите ее и обнаружите, что она поможет Вам существенно сократить время поиска ошибок.


    Все права на публикацию этой статьи принадлежат RusHelp.com

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

    ------------------------------------------------------------




    Address Book



    // form not yet submitted
    // display form
    if (!$submit)
    {
    ?>

    Name:



    Address:



    Tel:



    Email:





    }
    else
    {
    // form submitted
    // prepare to insert data

    // database access parameters
    // alter this as per your configuration
    $host = "localhost";
    $user = "postgres";
    $pass = "postgres";
    $db = "test";

    // open a connection to the database server
    $connection = pg_connect("host=$host dbname=$db user=$user
    password=$pass");
    if (!$connection)
    {
    die("Could not open connection to database server");
    }

    // error checks on form submission go here
    // generate and execute a query
    $query = "INSERT INTO addressbook VALUES
    (nextval(`addressbook_id_seq'), `$name', `$address', `$tel', `$email')";
    $result = pg_query($connection, $query) or die("Error in query:
    $query. " . pg_last_error($connection));
    echo "Data successfully added.";
    // close database connection
    pg_close($connection);
    }
    ?>

    -------------------------------------------------------------

    Как видите, этот скрипт разбит на две главные части - какая из них используется зависит от того, отправлена ли форма.

    Первая часть просто выводит HTMK форму с полями, соответствующими столбцам в таблице "adressbook". Когда пользователь вводит данные в поля и отправляет форму, вызывается тот же скрипт. На этот раз, выполняется его вторая часть. Из данных, введенных в форму, генерируется SQL запрос, который выполняется функцией pg_query(), с который Вы уже знакомы. При успешной вставке данных в базу выводится сообщение.

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

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

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

    Страница PostgreSQL функций PHP: http://www.php.net/manual/en/ref.pgsql.php

    Документация по PostgreSQL: http://www.postgresql.org/idocs/

    Статья O'Reilly о PHP/PostgreSQL: http://www.onlamp.com/pub/a/onlamp/2002/01/24/postgresql.html

    Учебник по PostgreSQL для начинающих: http://www.phpbeginner.com/columns/chris/postgres/

    До скорого! Оставайтесь в форме!

    Все примеры в этой статье проверены на платформе Linux/i586 с PostgreSQL 7.1, Apache 1.3.20 и PHP 4.2.0RC2. Примеры приводятся только для иллюстративных целей и не предназначены для использования в реальных условиях.


    Все права на публикацию этой статьи принадлежат RusHelp.com


    Внимание! Любая перепечатка и использование материалов статей на других сайтах только с разрешения RusHelp.com (info@rushelp.com).

  •