Стандартная библиотека шаблонов ( Standard Template Library , STL) входит в стандартную библиотеку языка C++. В неё включены реализации наиболее часто используемых контейнеров и алгоритмов, что избавляет программистов от рутинного переписывания их снова и снова. При разработке контейнеров и применяемых к ним алгоритмов (таких как удаление одинаковых элементов, сортировка, поиск и т. д.) часто приходится приносить в жертву либо универсальность, либо быстродействие. Однако разработчики STL поставили перед собой задачу:сделать библиотеку одновременно эффективной и универсальной. Для ее решения были использованы такие универсальные средстваязыка C++, как шаблоны и перегрузка операторов. В последующем изложении будем опираться на реализацию STL, поставляемую фирмой Microsoft вместе с компилятором Visual C++ 6.0. Тем не менее большая часть сказанного будет справедлива и для реализаций STL другими компиляторами.
Основными понятиями в STL являются понятия контейнера (container), алгоритма (algorithm) и итератора (iterator).
Контейнер - это хранилище объектов (как встроенных, так и определённых пользователем типов). Как правило, контейнеры реализуются в виде шаблонов классов. Простейшие виды контейнеров (статические и динамические массивы) встроены непосредственно в язык C++. Кроме того, стандартная библиотека включает в себя реализации таких контейнеров, как вектор (vector), список (list), очередь (deque), ассоциативный массив (map), множество (set) и некоторых других.
Алгоритм - это функция для манипулирования объектами, содержащимися в контейнере. Типичные примеры алгоритмов - сортировка и поиск. В STL реализовано порядка 60 алгоритмов, которые можно применять к различным контейнерам, в том числе к массивам, встроенным в язык C++.
Итератор - это абстракция указателя, то есть объект, который может ссылаться на другие объекты, содержащиеся в контейнере. Основные функции итератора - обеспечение доступа к объекту, на который он ссылается (разыменование), и переход от одного элемента контейнера к другому (итерация, отсюда и название итератора). Для встроенных контейнеров в качестве итераторов используются обычные указатели. В случае с более сложными контейнерами итераторы реализуются в виде классов с набором перегруженных операторов.
Помимо отмеченных элементов в STL есть ряд вспомогательных понятий ; с некоторыми из них следует также познакомиться.
Аллокатор (allocator) - это объект, отвечающий за распределение памяти для элементов контейнера. С каждым стандартным контейнером связывается аллокатор (его тип передаётся как один из параметров шаблона). Если какому-то алгоритму требуется распределять память для элементов, он обязан делать это через аллокатор. В этом случае можно быть уверенным, что распределённые объекты будут уничтожены правильно.
В состав STL входит стандартный класс allocator (описан в файле xmemory). Именно его по умолчанию используют все контейнеры, реализованные в STL. Однако пользователь может реализовать собственный класс. Необходимость в этом возникает очень редко, но иногда это можно сделать из соображений эффективности или в отладочных целях.
Остановимся более подробно на рассмотрении введенных понятий.
Контейнеры . Каждый контейнер предоставляет строго определённый интерфейс, через который с ним будут взаимодействовать алгоритмы. Этот интерфейс обеспечивают соответствующие контейнеру итераторы. Важно подчеркнуть, что никакие дополнительные функции-члены для взаимодействия алгоритмов и контейнеров не используются. Это сделано потому, что стандартные алгоритмы должны работать, в том числе со встроенными контейнерами языка C++, у которых есть итераторы (указатели), но нет ничего, кроме них. Таким образом, при создании собственного контейнера реализация итератора - необходимый минимум.
Каждый контейнер реализует определённый тип итераторов. При этом выбирается наиболее функциональный тип итератора, который может быть эффективно реализован для данного контейнера. "Эффективно" означает, что скорость выполнения операций над итератором не должна зависеть от количества элементов в контейнере. Например, для вектора реализуется итератор с произвольным доступом, а для списка - двунаправленный. Поскольку скорость выполнения операции для списка линейно зависит от его длины, итератор с произвольным доступом для списка не реализуется.
Вне зависимости от фактической организации контейнера (вектор, список, дерево) хранящиеся в нём элементы можно рассматривать как последовательность. Итератор первого элемента в этой последовательности возвращает функция begin(), а итератор элемента, следующего за последним, - функция end(). Это очень важно, так как все алгоритмы в STL работают именно с последовательностями, заданными итераторами начала и конца.
Кроме обычных итераторов в STL существуют обратные итераторы ( reverse iterator ). Обратный итератор отличается тем, что просматривает последовательность элементов в контейнере в обратном порядке. Другими словами, операции + и - у него меняются местами. Это позволяет применять алгоритмы как к прямой, так и к обратной последовательности элементов. Например, с помощью функции find можно искать элементы как "с начала", так и "с конца" контейнера.
В STL контейнеры делятся на три основные группы (табл. 2): контейнеры последовательностей, ассоциативные контейнеры и адаптеры контейнеров. Первые две группы объединяются в контейнеры первого класса.
Таблица 2
Контейнерный класс STL |
Описание |
Контейнеры последовательностей |
|
vector |
Динамический массив |
deque |
Двунаправленная очередь |
list |
Двунаправленный линейный список |
Ассоциативные контейнеры |
|
Ассоциативный контейнер с уникальными ключами |
|
multiset |
Ассоциативный контейнер, допускающий дублирование ключей |
Ассоциативный контейнер для наборов уникальных элементов |
|
multimap |
Ассоциативный контейнер для наборов с дублированием элементов |
Адаптеры контейнеров |
|
stack |
Стандартный стек |
queue |
Стандартная очередь |
priority _ queue |
Очередь с приоритетами |
Каждый класс контейнера, реализованный в STL , описывает набор типов, связанных с контейнером. При написании собственных контейнеров следует придерживаться этой же практики. Вот список наиболее важных типов:
value _ type - тип элемента;
size _ type - тип для хранения числа элементов (обычно size _ t );
iterator - итератор для элементов контейнера;
key _ type - тип ключа (в ассоциативном контейнере).
Помимо типов можно выделить набор функций, которые реализует почти каждый контейнер в STL (табл. 3). Они не требуются для взаимодействия с алгоритмами, но их реализация улучшает взаимозаменяемость контейнеров в программе. STL разработана с тем расчетом, чтобы контейнеры обеспечивали аналогичные функциональные возможности.
Таблица 3
Общие методы всех STL-контейнеров |
Описание |
default constructor |
Конструктор по умолчанию. Обычно контейнер имеет несколько конструкторов |
copy constructor |
Копирующий конструктор |
destructor |
Деструктор |
empty |
Возвращает true, если в контейнере нет элементов, иначе false |
max _ size |
Возвращает максимальное число элементов для контейнера |
size |
Возвращает число элементов в контейнере в текущее время |
operator = |
Присваивает один контейнер другому |
operator < |
Возвращает true, если первый контейнер меньше второго, иначе false |
operator <= |
Возвращает true, если первый контейнер не больше второго, иначе false |
operator > |
Возвращает true, если первый контейнер больше второго, иначе false |
operator >= |
Возвращает true, если первый контейнер не меньше второго, иначе false |
operator == |
Возвращает true, если сравниваемые контейнеры равны, иначе false |
operator != |
Возвращает true, если сравниваемые контейнеры не равны, иначе false |
swap |
Меняет местами элементы двух контейнеров |
Функции, имеющиесятолько в контейнерах первого класса |
|
begin |
Две версии этой функции возвращают либо iterator, либо const_iterator, который ссылается на первый элемент контейнера |
Две версии этой функции возвращают либо iterator, либо const_iterator, который ссылается на следующую позицию после конца контейнера |
|
rbegin |
Две версии этой функции возвращают либо reverse _ iterator , либо reverse _ const _ iterator , который ссылается на последний элемент контейнера |
rend |
Две версии этой функции возвращают либо reverse_iterator, либо reverse_const_iterator, который ссылается на позицию перед первымэлементомконтейнера |
insert , erase , |
Позволяют вставить или удалить элемент(ы) в середине последовательности |
Окончаниетабл. 3 |
|
clear |
Удаляет из контейнера все элементы |
front , back |
|
push_back, pop_back |
Позволяют добавить или удалить последний элемент в последовательности |
push_front, pop_front |
Позволяют добавить или удалить первый элемент в последовательности |
Итераторы обычно создаются как друзья классов, с которыми они работают, что позволяет выполнить прямой доступ к частным данным этих классов. С одним контейнером может быть связано несколько итераторов, каждый из которыхподдерживаетсвою собственную «позиционную информацию»(табл. 4).
Таблица 4
Тип итератора |
Доступ |
Разыменование |
Итерация |
Сравнение |
Итератор вывода (output iterator ) |
Только запись |
|||
Итератор ввода (input iterator ) |
Только чтение |
*, -> |
==, != |
|
Прямой итератор (forward iterator ) |
Чтение и запись |
*, -> |
==, != |
|
Двунаправленный итератор (bidirectional iterator ) |
Чтение и запись |
*, -> |
++, -- |
==, != |
Итератор с произвольным доступом (random - access iterator ) |
Чтение и запись |
*, ->, |
++, --, +, -, +=, -= |
==, !=, <, <=, >, >= |
Как сделать постраничный вывод из mysql "как в яндексе"?
по 10 записей на страницу, внизу - ссылки на остальные страницы?
Сначала научимся получать из базы нужные записи.
Их получение в mysql обеспечивается оператором LIMIT, который вызывается с двумя параметрами - с какой записи начинать, и сколько выводить (внимание! не по какую, а сколько!)
SELECT * FROM table LIMIT 0,10
этот запрос вернет записи с первой по 10, поскольку нумерация начинается с 0
соответственно, запрос для третьей страницы будет выглядеть, как
SELECT * FROM table LIMIT 20,10
получается, что нам всего лишь надо передать в скрипт число, которое потом подставить в запрос.
Этим будет заниматься код, который выводит ссылки на страницы.
Естественно, в цикле.
Для цикла нам понадобится количество записей, которое возвращает запрос без лимита.
Это число можно получить двумя путями. Либо отдельным запросом, в котором отсутствует оператор LIMIT, а вместо перечисления полей после оператора SELECT запрашивается только count(*):
$q
=
"SELECT count(*) FROM table"
;
$res
=
mysql_query
($q
);
$row
=
mysql_fetch_row
($res
);
$total_rows
=
$row
[
0
];
Либо, если версия mysql больше 4.0, то общее количество строк можно запросить в том же запросе. См. документацию mysql по функции FOUND_ROWS()
Однако, первый сособ представляется более удобным, хотя и немного более медленным.
Для тех, кто предпочитает думать самостоятельно, этой информации достаточно.
Вывод ссылок - это простейшая арифметическая операция и никаких особенных знаний для нее не требуется.
Для тех, же, кто ищет готовый код, продолжим.
Для начала определим, сколько всего получится страниц. Для этого надо поделить общее число записей на количество оных на одной странице и округлить результат в большую сторону. Таким округлением занимается в пхп функция ceil()
$num_pages
=
ceil
($total_rows
/
$per_page
);
В этом выражении участвует переменная $per_page
, в которую мы положим количество выводимых на странице записей.
Ведь, если это количество изменится, мы же не хотим ползать по всему коду и исправлять цифры? проще сделать это один раз в начале скрипта при объявлении переменной. В запрос, вторым параметром LIMIT, подставлять нужно, конечно же, тоже ее.
Ну, а дальше, собственно, вывод ссылок.
for($i
=
1
;
$i
<=
$num_pages
;
$i
++) {
echo
""
.
$i
.
"\n"
;
}
в цикле от 1 до $num_pages выводим ссылку с параметром num, равным числу, которое надо передать в LIMIT, а в тексте ссылки пишем номер страницы, поскольку людям понятнее видеть номер страницы, а не записи. На код это не влияет, а людям приятно.
Дальше пойдут украшения.
Во-первых, некрасиво, что номер страницы не совпадает с тем, что видно в адресной строке. Эту проблему можно решить, передавая по ссылке номер страницы в человекопонятном формате, а в скрипте вычислять первый операнд для LIMIT.
Во-вторых, мы явно захотим выделить текущую страницу, не оформляя ее ссылкой.
В-третьих, мы захотим нумеровать записи
Разумеется, вышеприведённый код подходит только как учебное пособие. С его помощью становится понятным принцип, но в реальных условиях мы сразу же столкнемся, как минимум, с двумя проблемами:
Во-первых, кроме переменной $page нашему крипту явно будут переданы и другие переменные, да и адрес может совсем не совпадать с именем скрипта. А мы это при формировании ссылок не учитываем.
Во-вторых, нормальный современный сайт немыслим без шаблонов. И такая ужасная лапша из SQL запросов, PHP кода и HTML тегов никуда не годится.
Плюс надо избавляться от устаревшего расширения mysql и организовывать работу с БД более интеллектуально.
Займемся решением этих проблем.
Первая решается очень просто при использовании функции http_build_query()
Вторая - тоже несложно. Шаблонизаторов много, но мы воспользуемся самым универсальным - PHP.
Что же у нас получилось? А получился у нас - рефакторинг ! Переделка старого кода в соответствии с требованиями современности, плюс мелкое причесывание:
include
"safemysql.class.php"
;
$db
= new
safeMysql
();
$per_page = 10 ;
//получаем номер страницы и значение для лимита
$cur_page
=
1
;
if (isset($_GET
[
"page"
]) &&
$_GET
[
"page"
] >
0
)
{
$cur_page
=
$_GET
[
"page"
];
}
$start
= ($cur_page
-
1
) *
$per_page
;
//выполняем запрос и получаем данные для вывода
$sql
=
"SELECT SQL_CALC_FOUND_ROWS * FROM Board LIMIT ?i, ?i"
;
$data
=
$db
->
getAll
($sql
,
$start
,
$per_page
);
$rows
=
$db
->
getOne
("SELECT FOUND_ROWS()"
);
//узнаем общее количество страниц и заполняем массив со ссылками
$num_pages
=
ceil
($rows
/
$per_page
);
// зададим переменную, которую будем использовать для вывода номеров страниц
$page
=
0
;
//а дальше выводим в шаблоне днные и навигацию:
?>
Найдено сообщений: =$rows?>
foreach ($data
as
$row
):
?>
=
++
$start?>
.
">=$row
[
"title"
]
?>
endforeach
?>
Страницы:
while ($page
++ <
$num_pages
):
?>
if ($page
==
$cur_page
):
?>
=$page?>
else:
?>
">=$page?>
endif
?>
endwhile
?>
С версии 6.3 (от 2 марта 1998 года) PostgreSQL использует сокеты домена UNIX. Этот сокет может быть найден в каталоге /tmp/.s.PGSQL.5432 . Это свойство может быть включено с помощью флага "-i" в postmaster и это означает "прослушивание сокетов TCP/IP", аналогично сокетам домена UNIX.
Таблица 1. Postmaster and PHP
Можно также установить соединение с помощью команды: $conn = pg_Connect("host=localhost port=5432 dbname=chris");
Для использования интерфейса больших объектов (large objects) необходимо
заключить их в блок транзакции. Блок транзакции начинается
begin
и, если транзакция прошла успешно, завершается
commit
и end
. Если транзакция дала сбой, то транзакция должна быть закрыта с помощью
abort
и rollback
.
pg_Close
pg_Close -- закрывает соединение PostgreSQLОписание
bool pg_close (int connection);Возвращает false, если connection - не правильный номер соединения. Закрывает соединение с базой PostgreSQL, связанное с указанным номером соединения.
pg_cmdTuples
pg_cmdTuples -- возвращает число вызванных tuplesОписание
int pg_cmdtuples (int result_id);pg_cmdTuples() возвращает число tuples (требований), вызванных
запросами INSERT, UPDATE, и DELETE. Если нет вызванных tuple, то функция вернет 0.
Пример 1. pg_cmdtuples
|
pg_Connect
pg_Connect -- открывает соединениеОписание
int pg_connect (string host, string port, string options, string tty, string dbname);Возвращает номер соединения при успехе или false, если соединение не может быть установлено. Открывает соединение с базой PostgreSQL. Каждый из аргументов должен быть в кавычках, включая номер порта. Аргементы options и tty являются дополнительными и могут быть опущены. Эта функция возвращает номер соединения, который необходим другим функциям PostgreSQL. Вы можете иметь одновременно несколько открытых соединений.
Соединение может быть также установлено следующей командой: $conn = pg_connect("dbname=marliese port=5432"); Дополнительные параметры (кроме dbname и port ) - это host , tty и options .
pg_DBname
pg_DBname -- имя базы данныхОписание
string pg_dbname (int connection);Возвращает имя базы данных, с которой соединен указанный номер соединения PostgreSQL, или возвращает false, если указан не правильный номер соединения.
pg_ErrorMessage
pg_ErrorMessage -- сообщение об ошибкеОписание
string pg_errormessage (int connection);Возвращает строку, содержащую сообщение об ошибке, или false при сбое. Детали об ошибке, вероятно, не могут быть получены с помощью pg_errormessage(), если ошибка произошла при последнем обращении к базе данных, для которой существует верный номер соединения, то функция вернет строку, содержащую сообщение об ошибке, выданное сервером.
pg_Exec
pg_Exec -- запускает запросОписание
int pg_exec (int connection, string query);Возвращает признак результата, если запрос может быть запущен, false при ошибке или при неверном номере соединения. Детали об ошибке могут получены с помощью функции , если номер соединения верный. Функция посылает SQL запрос базе данных PostgreSQL, определяемой номером соединения. Connection должен быть верным номером соединения, который возвращается функцией . Возвращаемое этой функцией значение является необходимым для доступа к результатам других функций PostgreSQL.
Замечание: PHP2 возвращает 1, если запрос не должен возвращать данных (например, при вставке или обновлении) и больше 1, даже при выборках, которые ничего не возвращают. Таких допущений нет в PHP3.
pg_Fetch_Array
pg_Fetch_Array -- возвращает запись как массивОписание
array pg_fetch_array (int result, int row);Возвращает массив, который ссылается на полученную запись, или false если больше нет записей.
pg_fetch_array() является расширенной версией . В дополнение к хранению данных под числовыми индексами в результирующем массиве, функция также хранит данные под ассоциативными индексами, используя номера полей в качестве ключей.
Необходимо отметить, что функция pg_fetch_array() практически одинакова по скорости с , хотя и предоставляет дополнительные возможности.
Для дополнительной информации см.
Пример 1. Массив записи PostgreSQL
|
pg_Fetch_Object
pg_Fetch_Object -- возвращает запись как объектОписание
object pg_fetch_object (int result, int row);Возвращает объект со свойствами, которые ссылаются на полученную запись, или false если нет больше записей.
Пример 1. Полученние объекта Postgres
Ошибка соединения с базой echo $database ?>exit; endif; $qu = pg_exec ($db_conn, "SELECT * FROM verlag ORDER BY autor"); $row = 0; // postgres необходим счетчик записей, в отличие от других СУБД while ($data = pg_fetch_object ($qu, $row)): echo $data->autor." ("; echo $data->jahr ."): "; echo $data->titel.""; $row++; endwhile; ?> $fields = Array ("autor", "Author"); $fields = Array ("jahr", " Year"); $fields = Array ("titel", " Title"); $row= 0; // postgres необходим счетчик записей, в отличие от других while ($data = pg_fetch_object ($qu, $row)): echo "----------\n"; reset ($fields); while (list (,$item) = each ($fields)): echo $item.": ".$data->$item."\n"; endwhile; $row++; endwhile; echo "----------\n"; ?> |
pg_Fetch_Row
pg_Fetch_Row -- получает запись как нумерованный массивОписание
array pg_fetch_row (int result, int row);Возвращает массив, который ссылается на полученную запись, или false, если больше нет записей.
pg_fetch_row() возвращает одну запись данных из результата, определяемого указанным идентификатором результата. Запись возвращается как массив. Каждый столбец результата храниться в элементе массива, начиная с 0.
Последующий вызов функции pg_fetch_row() возвратит следующую запись в результирующем наборе, или false, если записей больше нет.
pg_FieldIsNull
pg_FieldIsNull -- Проверяет поле на нулевое значениеОписание
int pg_fieldisnull (int result_id, int row, mixed field);Проверяет нулевое (NULL) значение у поля или нет. Возвращает 0, если поле в указанной записи не нулевое. Возвращает 1, если поле ы указанное записи нулевое. Поле может определяться номером или именем. Нумерация записей начинается с 0.
pg_FieldName
pg_FieldName -- возвращает имя поляОписание
string pg_fieldname (int result_id, int field_number);pg_FieldName() возвращет имя поля, соответствующее указанному номеру столбца в указанном идентификаторе результата PostgreSQL. Нумерация полей начинается с 0.
pg_FieldNum
pg_FieldNum -- возвращает номер столбцаОписание
int pg_fieldnum (int result_id, string field_name);pg_FieldNum() возвращает номер столбца, соответствующий указанному имени поля в указанном идентификаторе результата PosgreSQL. Нумерация полей начинается с 0. Функция вернет -1 при ошибке.
pg_FieldPrtLen
pg_FieldPrtLen -- Возвращает печатную длинуОписание
int pg_fieldprtlen (int result_id, int row_number, string field_name);pg_FieldPrtLen() возвращает действительную печатную длину (число символов) указанных данных в результате PosgreSQL. Нумерация записей начинается с 0. При ошибке функция вернет -1.
pg_FieldSize
pg_FieldSize -- возвращает внутренний размер хранения именованного поляОписание
int pg_fieldsize (int result_id, string field_name);pg_FieldSize() возвращает внутренний размер хранения указанного именованного поля в указанном результате PosgreSQL. Размер поля -1 говорит о переменной длине поля. Эта функция вернет false при ошибке.
pg_FieldType
pg_FieldType -- возвращает тип соответствующего именованного поляОписание
int pg_fieldtype (int result_id, int field_number);pg_FieldType() возвращает строку, содержащую имя типа указанного поля в указанном идентификаторе результата PosgreSQL. Нумерация полей начинается с 0.
pg_FreeResult
pg_FreeResult -- освобождает памятьОписание
int pg_freeresult (int result_id);pg_locreate
pg_locreate -- создает большой объектОписание
int pg_locreate (int conn);pg_locreate() создает отображение большого объекта (ILO) и возвращает идентификатор большого объекта. conn определяет верное соединение с базой данных. Режимы доступа PostgreSQL INV_READ, INV_WRITE, и INV_ARCHIVE не поддерживаются, объект создается всегда и для чтения и для записи. INV_ARCHIVE был удален из самой PostgreSQL (версии 6.3 и выше).
pg_loopen
pg_loopen -- открывает большой объектОписание
int pg_loopen (int conn, int objoid, string mode);pg_loopen() открывает отображение большого объекта (ILO) и возвращает дескриптор файла большого объекта. Дескриптор файла содержит информацию о соединении. Не закрывайте соединение до закрытия дескриптора файла большого объекта. objoid определяет верный идентификатор большого объекта и mode может быть одним из "r", "w", or "rw".
pg_loread
pg_loread -- считывает большой объектОписание
string pg_loread (int fd, int len);pg_loread() считывает len байтов из большого объекта и возвращает их в виде строки. fd определяет верный декскриптор файла большого объекта len определяет максимально возможный размер сегмента большого объекта.
pg_loreadall
pg_loreadall -- считывает весь большой объектОписание
void pg_loreadall (int fd);pg_loreadall() считывает большой объект и отправляет его прямо в броузер, после всех необходимых заголовков. В основном применяется для отправки двоичных данных, таких как изображения и звуковые файлы.
pg_lounlink
pg_lounlink -- удаляет большой объектОписание
void pg_lounlink (int conn, int lobjid);pg_lounlink() удаляет большой объект с идентификатором большого объекта lobjid .
pg_lowrite
pg_lowrite -- записывает в большой объектОписание
int pg_lowrite (int fd, string buf);pg_lowrite() записывает данные в большой объект из переменной buf и возвращает число записанных данных или false при ошибке. fd является дескриптором файла большого объекта из функции .
pg_NumFields
pg_NumFields -- возвращает количество полейОписание
int pg_numfields (int result_id);pg_NumFields() возвращает количестов полей (столбцов) в результате PostgreSQL. Параметр является верным идентификатором результата, полученным функцией . Эта функция вернет -1 при ошибке.
pg_NumRows
pg_NumRows -- возвращает число записейОписание
int pg_numrows (int result_id);Соединение может также быть установлено следующей командой: $conn = pg_pconnect("dbname=marliese port=5432"); Остальные параметры, кроме dbname и port , - это host , tty и options .
pg_Port
pg_Port -- возвращает номер портаОписание
int pg_port (int connection_id);pg_Port() возвращает номер порта, с которым соединен указанный идентификатор соединения PostgreSQL.
pg_Result
pg_Result -- возвращает данные из идентификатора результатаОписание
mixed pg_result (int result_id, int row_number, mixed fieldname);pg_Result() возвращает данные из идентификатора результата, полученного . Параметры row_number и fieldname определяют, из какой ячейки таблицы будут взяты данные. Нумерация записей и полей начинается с 0. Вместо имени поля вы можете использовать номер поля (без кавычек).
PostgreSQL имеет много видов данных, но здесь поддерживаются только основные. Все виды целых и логических типов, типов идентификаторов возвращаются как целые числа. Все виды типов с плавающей точкой и действительных чисел возвращаются как тип double. Все осталные типы, включая массивы возвращаются как строки, отформатированные в том же виде, какой вы видели в программе psql .
pg_tty
pg_tty -- возвращает имя ttyОписание
string pg_tty (int connection_id);pg_tty() возвращает имя tty, которое сервер дает указанному идентификатору соединения PostgreSQL.
Функции PostgreSQL
Postgres, разработанный в оригинале департаментом UC Berkeley Computer Science Department, был пионером многих объектно-ориентированных концепций, ставших теперь доступными в некоторых коммерческих БД. Он предоставляет поддержку языка SQL92/SQL99, целостности транзакций и расширяемости типов. PostgreSQL это открытый ресурс, потомок оригинального Berkeley-кода.
PostgreSQL database это открывает Source-продукт, доступный бесплатно. Для использования поддержки PostgreSQL вам необходим PostgreSQL 6.5 или новее. PostgreSQL 7.0 или новее - для всех возможностей модуля PostgreSQL. PostgreSQL поддерживает многие кодировки символов, включая кодировку многобайтных символов. Текущая версия и информация о PostgreSQL находятся на http://www.postgresql.org/ .
Чтобы включить поддержку PostgreSQL, необходима опция --with-pgsql[=DIR] при компиляции PHP. Если модуль совместно используемых/shared объектов доступен, PostgreSQL-модуль может быть загружен с использованием директивы extension в файле php.ini или функции dl() . Поддерживаемые ini-директивы описаны в файле php.ini-dist , поставляемом вместе с исходным кодом дистрибутива.
Предупреждение! | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Имена PostgreSQL-функций будут изменены в релизе 4.2.0 для подтверждения соответствия существующим стандартам кодировки. Большая часть новых имён будет иметь дополнительные символы подчёркивания, например, pg_lo_open(). Некоторые функции переименовываются для обеспечения целостности. например, pg_exec() в pg_query(). Старые имена можно использовать в 4.2.0 и в некоторых релизах 4.2.0, но они могут быть удалены в будущем. Таблица 1. Изменения имён функций
|
Не все функции поддерживаются во всех построениях/builds. Это зависит отверсии вашей libpq (The PostgreSQL C Client interface) и от того, как libpq скомпилирована. Если имеется отсутствующая функция, libpq не поддерживает возможности, требуемые для этой функции.
Важно также, чтобы вы использовали libpq более новую, чем PostgreSQL Server, с которым соединяетесь. Если вы используете libpq более старую, чем ожидает PostgreSQL Server, у вас будут проблемы.
Начиная с версии 6.3 (03/02/1998), PostgreSQL использует по умолчанию сокет домена unix. TCP-порт НЕ открывается по умолчанию. В таблице описаны эти новые возможности соединений. Этот сокет можно найти в in /tmp/.s.PGSQL.5432 . Данная опция может быть включена флагом "-i" для postmaster , и его значением будет: "прослушивать TCP/IP-сокеты, а также сокеты Unix-домена".
Таблица 2. Postmaster и PHP
Соединение с PostgreSQL-сервером может быть установлено следующими парами значений в командной строке: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ") ;
Предыдущий синтаксис: $conn = pg_connect ("host", "port", "options", "tty", "dbname") теперь не рекомендуется.
Переменные окружения влияют на поведение PostgreSQL server/client. Например, PostgreSQL-модель будет искать переменную окружения PGHOST, если hostname отсутствует в строке соединения. Поддерживаемые переменные окружения отличаются в разных версиях. См. детали в PostgreSQL Programmer"s Manual (libpq - Environment Variables).
Убедитесь, что вы установили переменные окружения для соответствующего пользователя. Используйте $_ENV или getenv() для проверки того, какие переменные окружения доступны текущему процессу.
Начиная работу с PostgreSQL 7.1.0, вы можете сохранять 1GB в поле типа text. В более старых версиях могут быть ограничения на размер блоков (по умолчанию было 8KB, максимум был 32KB, определяемые на этапе компиляции).
Для использования интерфейса больших объектов/large object (lo) необходимо включать lo-функции внутри блока транзакции. Блок транзакции начинается с SQL-оператора BEGIN , и, если транзакция была верной, заканчивается COMMIT или END . Если транзакция терпит неудачу, она должна быть закрыта с помощью ROLLBACK или ABORT .
Вы не должны закрывать соединение с PostgreSQL-сервером до закрытия large object.
Содержаниеpg_affected_rows - возвращает количество задействованных записей (пар/tuples) pg_cancel_query - отменяет async-запрос pg_client_encoding - получает клиентскую кодировку pg_close - закрывает a PostgreSQL-соединение pg_connect - открывает a PostgreSQL-соединение pg_connection_busy - получает, закрыто соединение или нет pg_connection_reset - восстанавливает соединение (reconnect) pg_connection_status - получает статус соединения pg_convert - конвертирует значение ассоциативного массива в значение, подходящее для оператора SQL pg_copy_from - вставляет записи в таблицу из массива pg_copy_to - копирует таблицу в массив pg_dbname - получает имя базы данных pg_delete - удаляет записи pg_end_copy - синхронизирует с PostgreSQL backend pg_escape_bytea - мнемонизирует/еscape binary для типа bytea pg_escape_string - мнемонизирует string для типа text/char pg_execute - Посылает запрос выполнить готовую инструкцию с данными параметрами, и ждет результата pg_fetch_all_columns - разбирает все строки в специфическом столбце результата как массив pg_fetch_all - разбирает все строки из результата как массив pg_fetch_array - извлекает ряд как массив pg_fetch_assoc - разбирает строку как ассоциативный массив pg_fetch_object - извлекает ряд как объект pg_fetch_result - возвращает значения из результирующего ресурса pg_fetch_row - получает ряд как перечислимый массив pg_field_is_null - проверяет, является ли поле NULL pg_field_name - возвращает имя поля pg_field_num - возвращает номер именованного поля pg_field_prtlen - возвращает печатаемый размер pg_field_size - возвращает внутренний размер хранения именованного поля pg_field_type - возвращает имя типа для соответствующего номера поля pg_field_type_oid - возвращает идентификатор типа (OID) для соответствующего номера поля pg_free_result - освобождает результирующую память pg_get_notify - получает предупреждающее сообщение SQL pg_get_pid - получет бэкэнд идентификатора процесса pg_get_result - получает результат асинхронного запроса pg_host - возвращает имя хоста, ассоциированного с соединением pg_insert - вставляет массив в таблицу pg_last_error - получает строку последнего сообщения об ошибке соединения pg_last_notice - возвращает последнее уведомление от PostgreSQL-сервера pg_last_oid - возвращает oid последнего объекта pg_lo_close - закрывает large object pg_lo_create - создаёт large object pg_lo_export - экспортирует large object в файл pg_lo_import - импортирует large object из файла pg_lo_open - открывает large object pg_lo_read_all - читает весь large object и отправляет его браузеру pg_lo_read - читает large object pg_lo_seek - ищет позицию large object"а pg_lo_tell - возвращает текущую позицию large object"а