Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Урок № 9. Работа с базой данных и основы SQL
Форумы портала PHP.SU » PHP » Уроки php » Урок № 9. Работа с базой данных и основы SQL

Страниц (1): [1]
 

1. vitaliy_mad - 19 Января, 2009 - 12:04:53 - перейти к сообщению
Итак, мы вплотную подошли к работе с баззами данных. Для начала определимся с парой терминов:

СУБД (Система Управление Баззами Данных) - набор программ и утилит, предназначенных для организации и ведения базы данных.
SQL - Structured Query Language -- язык структурированных запросов. SQL - не является языком программирования, правильнее будет звучать
язык работы с базами данных.
База Данных (БД) - совокупность структуированных данных, которые хранятся в виде таблиц.
Таблица - набор данных организованный в виде двумерного массива. Для доступа к данным таблицы используются имена колонок (столбцов, полей)
и номер записи (строки). Приведем пример таблицы:

PHP:
скопировать код в буфер обмена
  1.  
  2. Номер  | Название   | Цена  | Остаток
  3. -------+------------+-------+---------
  4. 1      | Процессор  | 200   |  4
  5. 2      | Видеокарта | 120   |  1
  6. 3      | Монитор    | 200   |  2
  7. 4      | Мышь       | 6     |  10
  8.  


Как видно из примера, у нашей таблицы четыре колонки: Номер, Название, Цена и остаток, и 4 строки (записи).

Несколько таких таблиц являются частью базу данных. Более точное определение Базы данных дадим позже, когда узнаем немного больше о Базах Данных и SQL. Также при изуцении мы будем вводить новые понятия и определения.

Теперь попробуем связать Базы данных и PHP.
Поскльку существует несколько вариантов СУБД, каждый вибирает ту, которыя ему ближе и роднее. По сути у каждой свои плюсы и свои минусы.
Свои задачи они все выполняю очень хорошо. Здесь будем учится работе с системой PostgreSQL и основам SQL, поскольку независимо от СУБД,
SQL один. И большенство разработчиков СУДБ поддерживаются стандартов.

Установка:
Процесс установки СУБД PostgreSQL описан в официальной документации, прилагаемой к дистрибутиву.
Для связи PHP и POstgreSQL необходимо в файле настроек PHP (php.ini) раскоментировать строку "extension=php_pgsql.dll".

Для любой работы с БД необходимо установить соединение с СУБД. В PHP для соединение с СУБД PostgreSQL используется функция pg_connect.
Установим соединение на локальной машиной (компьютер на котором производим подключение и на котором стоит наша СУБД) с базой ourdatabase,
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $user="nick";
  4. $pass="pass";
  5. $connection = pg_connect ("host=127.0.0.1 dbname=ourdatabase user=$user password=$pass");
  6. ?>
  7.  

После выполнения кода переменная $connection будет содержать ссылку на наше соединение, которе мы и будем использовать для работы.

Дальнейшее объяснение тесно связано со знанием и понимание SQL (псевдоязык работы с БД). Но поскольку мы только начинаем изучать PHP и БД,
то попробуем освоить одновременно некие азы, наобходимые для минимально нормально работы.


Создание таблиц.
В любой БД должны быть таблицы, с которыми мы бдем работать. Для их создания используется SQL-запрос (команда для выполнение СУДБ):
CREATE TABLE name (col1 type, col2 type, ... );
name - имя будущей таблицы. Не рекомендуется наывать таблицы зарезервированными именами, например: date, text, varchar, integer и тд.
col1, col2 .... - имена колонок нашей таблицы.
type - тип данных, которые будут храниться в колонках. Основные типы данных, найболее часто используемые в работе:
smallint, integer, bigint - целые типы. отличаются друг от друга пределами своих значений. Один и тот же тип данных может иметь разные пределы, это зависит от операционной системы.
text - текстовый тип, предназначен для хранение больших текстов неопределенной длины.
varchar(size) - символьный тип, представляет собой массив из size символов.
boolean - логический тип. Может принимать только два значения: true (истина, 1) и false (ложь, 0).
timestamp with timezone - штамп времени. испольщуется для хранение даты и времени с большой точностью.
так же есть значение NULL - оно используется для пустого значения любого типа.

Это только малая часть всех поддерживаемых типов данных, но их нам пока что хватит.
Теперь попробудем написать запрос для создания таблицы из примера выше, но назавния колонок сделам латиницей:

CREATE TABLE sklad (no smallint, name varchar(100), price integer, last integer);

Запрос готов, но как его передать с помощью PHP? Для этого есть функция pg_query:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $result=pg_query($connection,"CREATE TABLE sklad (no smallint, name varchar(100), price integer, last integer);");
  3.  

$result - ссылка на данные с результатом запроса. об этом чуть позже.
$connection - сслка на наше содинение, от функции pg_connect.

Итак, таблица создана. Теперь осталось ее наполнить данными. Для этого существует конструкция INSERT:

INSERT INTO table VALUES (val1, val2, ...);

table - имя таблицы
val1,val2, ... - значение полей добавляемой записи, количество значений, для данного вида запроса, должно быть равно количеству
полей в таблице.
Добавим в нашу таблицу данные:
INSERT INTO sklad VALUES (3,'Монитор',200,2);
Как видно из примера, все строковые и символьные типы, а так же несколько специальных (inet, macaddr), должны заключаться в одинарные
кавычки.

Теперь давайте представим, что наша таблица состоит из 10, а может 20 полей, а нам надо добавить строку с заполнеными всего 2-5. Что делать?
Неужели указывать кучу пустых значений? Конечно, нет! Для этого используется конструкция вида:

INSERT INTO table (col1, col2, ..., coln) VALUES (val1, val2, ..., valn);
Здесь сразу после названия таблицы в скобках пишем названия полей, для которых мы будем устанавливать значения. В этом случае количество
значений должно совпадать с оличеством заявленных полей. Например:

INSERT INTO sklad (no,name) VALUES (3,'Монитор');

Мы добавили запись с установленными значениями no=3 и name='Монитор'. Остальные поля у нас оказались со значением NULL.

Теперь пора отправить этот запрос с помощью уже известной нам функции pg_query:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $res=pg_query($connection,"INSERT INTO sklad (no,name) VALUES (3,'Монитор');");
  4. ?>
  5.  

Расмотрим ситуацию, когда значение NULL нас совсем не устраивает, и нам надо сделать по умолчанию другое значение.
Тогда необходимо создавать таблицу слегка другим образом:
CREATE TABLE name (col1 type DEFAULT val, col2 type DEFAULT val, ... );
где val - значения по умолчанию для соответствующих полей.

запрос создания нашей таблицы преобразится в такой:
CREATE TABLE sklad (
no smallint,
name varchar(100),
price integer DEFAULT 0,
last integer DEFAULT 0 NOT NULL
);

Это значит, что поля no и name по умолчанию пустые, т.е. их надо явно указывать, а поля price и last по умолчанию будут равны 0.
Но полю price можно присвоить NULL, а last нет. Это достигается с помощью приставки NOT NULL.

Считывание данных.

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

Итак для считывания данных используется запрос SELECT:
SELECT col1,col2,...,coln FROM table;
вернет нам поля col1,col2,...,coln для всех записей.
Если нам надо вернуть все поля, то вместо названий полей мы напишем просто * (звездочку):
SELECT * FROM table;
И опят же мы сталкиваемся с вопросом: а что делать если надо выбрать не все записи?
Для этого опять есть вариант запроса:
SELECT * FROM table WHERE exp;
где exp - любое логическое выражение. например:
SELECT * FROM table WHERE price>50;
Вернет нам все поля записей, у которых поле price больше 50.

Так же есть возможность отсортировать полученный результат по какой либо колонке. Для этого достаточно дописать в конец предыдущего
запроса "ORDER BY col", где col - имя колонки. Для обратной сортировки (от большего к меньшему) необходимо дописать в конец приставку DESC:
SELECT * FROM table ORDER BY price DESC; - вернет все записи от большей цены к меньшей.

$result=pg_query("SELECT * FROM sklad;");

Вернет в $result данные. Но print $result; ничего хорошего нам не покажет. Для дальнейшей работы с полученными данными их необходимо
обработать. Приведу найболе часто используемый, на мой взгляд, вариант обработки:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. while ($db=pg_fetch_array($result))
  4. {
  5.     $no=$db['no'];
  6.     $name=$db['name'];
  7.     $cena=$db['price'];
  8.     $ost=$db['last'];
  9.     print "
  10.    Номер: $no
  11.    Название: $name
  12.    Цена: $cena
  13.    Остаток: $ost
  14.    ";
  15. }
  16. ?>
  17.  

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

Рассмотрим еще один пример:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $rows=pg_num_rows($result);
  4. for ($i=0;$i<$rows;$i++)
  5. {
  6.     $no=pg_result($result,$i,'no');
  7.     $name=pg_result($result,$i,'name');
  8.     $cena=pg_result($result,$i,'price');
  9.     $ost=pg_result($result,$i,'last');
  10.  
  11.     print "
  12.    Номер: $no
  13.    Название: $name
  14.    Цена: $cena
  15.    Остаток: $ost
  16.    ";
  17. }
  18. ?>
  19.  

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

На этом пожалуй завершим первую часть урока...
2. Champion - 13 Июля, 2009 - 11:12:25 - перейти к сообщению
vitaliy_mad пишет:
На этом пожалуй завершим первую часть урока...
А вторая будет?
3. sanstorm - 08 Декабря, 2011 - 08:05:12 - перейти к сообщению
А для mysql урок будет ?
4. Nikkoo - 19 Февраля, 2012 - 13:59:07 - перейти к сообщению
Отличный урок. Автору спасибо.
5. kester - 12 Марта, 2012 - 10:23:05 - перейти к сообщению
что такое pg_result($result,$i,'no')?
нет такое функции в официальной документации

 

Powered by ExBB FM 1.0 RC1