CakeFest 2024: The Official CakePHP Conference

pg_select

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

pg_select Выбирает записи из базы данных

Описание

pg_select(
    PgSql\Connection $connection,
    string $table_name,
    array $conditions,
    int $flags = PGSQL_DML_EXEC,
    int $mode = PGSQL_ASSOC
): array|string|false

pg_select() выбирает записи из базы данных, удовлетворяющие условиям field=>value, заданным в массиве conditions.

Если задан параметр flags, то к массиву conditions будет применена функция pg_convert() с параметрами, заданными в качестве аргумента.

Если задан параметр mode, возвращаемое значение будет в виде массива при PGSQL_NUM, ассоциативного массива при PGSQL_ASSOC (по умолчанию) или и того, и другого при PGSQL_BOTH.

По умолчанию pg_insert() передаёт необработанные значения. Значения должны быть экранированы или опция PGSQL_DML_ESCAPE должна быть указана. PGSQL_DML_ESCAPE заключает в кавычки и экранирует параметры/идентификаторы. Поэтому имена таблиц/столбцов становятся чувствительными к регистру.

Обратите внимание, что ни экранирование, ни подготовленный запрос не защитят запрос LIKE, JSON, массив, регулярные выражения и т.д.. Эти параметры должны обрабатываться в соответствии с их контекстами, т.е. следует экранировать/проверять значения.

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

connection

Экземпляр класса PgSql\Connection.

table_name

Название таблицы, из которой выбираются данные.

conditions

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

flags

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

mode

Одна из констант PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH. Если установлено значение PGSQL_ASSOC, возвращаемое значение будет ассоциативным массивом (array), при PGSQL_NUM возвращаемое значение будет массивом (array), а при PGSQL_BOTH возвращаемое значение будет и ассоциативным и числовым индексированным массивом (array).

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

Возвращает строку (string), если flags содержит PGSQL_DML_STRING, в противном случае в случае успешного выполнения функция возвращает массив (array) или false, если возникла ошибка.

Список изменений

Версия Описание
8.1.0 Параметр connection теперь ожидает экземпляр класса PgSql\Connection; раньше параметр ждал ресурс (resource).
7.1.0 Добавлен параметр mode.

Примеры

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

<?php
$db
= pg_connect('dbname=foo');
// Это безопасно в некоторой степени, поскольку все значения экранируются.
// Однако PostgreSQL поддерживает JSON/массив. Для этих значений это не безопасно
// ни с через экранирование, ни с помощью подготовленного запроса.
$rec = pg_select($db, 'post_log', $_POST);
if (
$rec) {
echo
"Records selected\n";
var_dump($rec);
} else {
echo
"Должно быть переданы неверные данные\n";
}
?>

Смотрите также

  • pg_convert() - Преобразовывает значения ассоциативного массива в вид, который соответствует SQL-запросам

add a note

User Contributed Notes 2 notes

up
5
david dot tulloh at infaze dot com dot au
18 years ago
Valid options are PGSQL_DML_NO_CONV, PGSQL_DML_EXEC, PGSQL_DMP_ASYNC, PGSQL_DML_STRING (pulled out of source code).

This function does not support selecting from multiple tables. You can get around this by setting the PGSQL_DML_NO_CONV option. This prevents the error which occurs when the function tries to convert the condition array.

I think it is also important to point out that the table_name field is not safe, particularily with the PGSQL_DML_NO_CONV option.

The arguements array field is compulsory, as documented. What isn't so clear is that the array has to actually have some values in it, you can't do a select all.

In summary, this function is good for a very small subset of basic queries. If you are after anything more complex you are better off with pg_query.
up
-5
wietse at cj2 dot nl
18 years ago
David mentioned that you can't do a Select all.
However, when executing this script:
<?php
$conn_string
= "dbname=mydb";
$db = pg_connect($conn_string);
$selectfields = array("imgid" => "");
$records = pg_select($db,"mmsfiles",$selectfields);
print_r($records);
?>
...I get this result:
Array
(
[0] => Array
(
[imgid] => 1
[file] => /home/wietse/public_html/mms/images/1.gif
[thumb] =>
)
[1] => Array
(
[imgid] => 2
[file] => /home/wietse/public_html/mms/images/2.gif
[thumb] =>
)
[2] => Array
(
[imgid] => 3
[file] => /home/wietse/public_html/mms/images/3.gif
[thumb] =>
)
[3] => Array
(
[imgid] => 4
[file] => /home/wietse/public_html/mms/images/4.gif
[thumb] =>
)
)
To Top