pg_update (resource $connection , string $table_name , array $data , array $condition [, int $options = PGSQL_DML_EXEC ])

pg_update() заменяет записи в таблице, удовлетворяющие условиям condition данными data . Если задан аргумент options , данные будут преобразованы функцией pg_convert() , которой будут переданы параметры из этого аргумента.

Список параметров

Ресурс соединения с базой данных PostgreSQL.

Table_name

Имя таблицы, в которой обновляются записи.

Массив (array ), ключи которого соответствуют именам колонок таблицы table_name , а значения заменят данные в этих колонках.

Condition

Массив (array ), ключи которого соответствуют именам колонок таблицы table_name . Будут обновлены только те строки, значения полей которых совпадут со значениями массива.

Options

Одна из констант PGSQL_CONV_OPTS , PGSQL_DML_NO_CONV , PGSQL_DML_ESCAPE , PGSQL_DML_EXEC , PGSQL_DML_ASYNC или PGSQL_DML_STRING , либо их комбинация. Если options содержит PGSQL_DML_STRING , функция вернет строку. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE , то функция pg_convert() внутренне не вызывается.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Функция вернет строку (string ), если константа PGSQL_DML_STRING содержится в options .

Примеры

Пример #1 Пример использования pg_update()

$db = pg_connect ("dbname=foo" );
$data = array("field1" => "AA" , "field2" => "BB" );

// Это безопасно с тех пор как $_POST преобразуется автоматически
$res = pg_update ($db , "post_log" , $_POST , $data );
if ($res ) {
echo "Данные обновлены: $res \n" ;
} else {
echo "Должно быть переданы неверные данные\n" ;
}
?>

Как сделать постраничный вывод из 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 ;

//а дальше выводим в шаблоне днные и навигацию:
?>
Найдено сообщений:



. ">


Страницы:




">


Стандартная библиотека шаблонов ( 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 )

Чтение и запись

*, ->,

++, --, +, -, +=, -=

==, !=, <, <=, >, >=

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

pg_convert — Преобразует значения ассоциативного массива в приемлемые для использования в SQL-запросах

Описание

pg_convert (resource $connection , string $table_name , array $assoc_array [, int $options = 0 ]) : array

pg_convert() проверяет и преобразовывает значения из assoc_array в приемлемые для SQL-сервера. Необходимо, чтобы существовала таблица table_name , а количество колонок в ней должно быть не меньше, чем значений в массиве assoc_array . Имена колонок в таблице table_name должны совпадать с ключами массива assoc_array , типы данных значений массива также должны совпадать с типами данных соответствующих колонок. В случае удачной конвертации функция возвращает массив преобразованных значений, иначе возвращает FALSE .

Замечание :

С версии PHP 5.6.0, допускаются булевы значения. Они преобразуются в булев тип PostgreSQL. Строковые представления булевого значения также поддерживаются. NULL преобразуется в PostgreSQL NULL.

До версии PHP 5.6.0, если таблица table_name содержит поля булева типа, не используйте константу TRUE в качестве значения массива table_name для этих полей. Она будет преобразована в строку "TRUE", которая является недопустимым значением для булевых полей в PostgreSQL. Используйте значения "t", "true", "1", "y", "yes".

Список параметров

Ресурс соединения с базой данных PostgreSQL.

Table_name

Имя таблицы базы данных.

Assoc_array

Данные для преобразования.

Options

Одна из констант PGSQL_CONV_IGNORE_DEFAULT , PGSQL_CONV_FORCE_NULL или PGSQL_CONV_IGNORE_NOT_NULL , либо их комбинация.

Возвращаемые значения

Массив (array ), содержащий преобразованные данные, либо FALSE в случае ошибки.

Примеры

Пример #1 Пример использования pg_convert()

$dbconn = pg_connect ("dbname=foo" );

$tmp = array(
"author" => "Joe Thackery" ,
"year" => 2005 ,
"title" => "My Life, by Joe Thackery"
);

$vals = pg_convert ($dbconn , "authors" , $tmp );
?>