Postgresql php обращение к схеме. LXXX. Функции PostgreSQL. Размер базы данных
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"
;
}
?>
(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
);
?>
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"
;
}
?>
С версии 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.
Как сделать постраничный вывод из 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
?>