2024 年 PHP 大会日本站

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() 选择由 conditions 指定的记录,conditions 使用 field=>value 的格式。对于成功的查询,它将返回一个数组,其中包含所有符合 conditions 指定条件的记录和字段。

如果设置了 flags,则 pg_convert() 将使用指定的标志应用于 conditions

如果设置了 mode,则返回值将采用数组形式,使用 PGSQL_NUM 表示数字索引数组,使用 PGSQL_ASSOC (默认) 表示关联数组,或使用 PGSQL_BOTH 表示同时包含数字索引和关联索引的数组。

默认情况下,pg_select() 传递原始值。必须转义值或指定 PGSQL_DML_ESCAPE 选项。PGSQL_DML_ESCAPE 会引用和转义参数/标识符。因此,表/列名称区分大小写。

请注意,转义或预处理查询都不能保护 LIKE 查询、JSON、数组、正则表达式等。应根据其上下文处理这些参数,例如转义/验证值。

参数

connection

一个 PgSql\Connection 实例。

table_name

从中选择行的表的名称。

conditions

一个 array,其键是表 table_name 中的字段名称,其值是行必须满足才能检索到的条件。从 PHP 8.4.0 开始,如果提供空数组,则不应用任何条件。在此之前,如果 conditions 参数为空,则函数会失败。

flags

可以组合使用任意数量的 PGSQL_CONV_FORCE_NULLPGSQL_DML_NO_CONVPGSQL_DML_ESCAPEPGSQL_DML_EXECPGSQL_DML_ASYNCPGSQL_DML_STRING。如果 flags 包含 PGSQL_DML_STRING,则返回查询字符串。当设置了 PGSQL_DML_NO_CONVPGSQL_DML_ESCAPE 时,它不会内部调用 pg_convert()

mode

可以组合使用任意数量的 PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。如果设置了 PGSQL_ASSOC,则返回值将是一个关联 array;如果设置了 PGSQL_NUM,则返回值将是一个 array;如果设置了 PGSQL_BOTH,则返回值将同时是一个关联数组和一个数字索引数组。

返回值

如果通过 flags 传递了 PGSQL_DML_STRING,则返回 string;否则,成功时返回 array,失败时返回 false

变更日志

版本 描述
8.4.0 conditions 现在是可选的。
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, PG_DML_ESCAPE);
if (
$rec) {
echo
"已选择记录\n";
var_dump($rec);
} else {
echo
"用户必须发送了错误的输入\n";
}
?>

参见

  • pg_convert() - 将关联数组值转换为适合 SQL 语句的格式

添加备注

用户贡献的备注 2 条备注

david dot tulloh at infaze dot com dot au
19 年前
有效的选项包括 PGSQL_DML_NO_CONV、PGSQL_DML_EXEC、PGSQL_DMP_ASYNC、PGSQL_DML_STRING(从源代码中提取)。

此函数不支持从多个表中选择。您可以通过设置 PGSQL_DML_NO_CONV 选项来解决此问题。这可以防止函数尝试转换条件数组时发生的错误。

我认为指出 table_name 字段不安全也很重要,尤其是在使用 PGSQL_DML_NO_CONV 选项时。

正如文档中所述,参数数组字段是必需的。不太清楚的是,数组中必须实际包含一些值,您不能执行全选。

总之,此函数适用于非常小的基本查询子集。如果您需要更复杂的查询,最好使用 pg_query。
wietse at cj2 dot nl
18 年前
David 提到了您无法执行全选。
但是,执行此脚本时
<?php
$conn_string
= "dbname=mydb";
$db = pg_connect($conn_string);
$selectfields = array("imgid" => "");
$records = pg_select($db,"mmsfiles",$selectfields);
print_r($records);
?>
...我得到了这个结果
数组
(
[0] => 数组
(
[imgid] => 1
[file] => /home/wietse/public_html/mms/images/1.gif
[thumb] =>
)
[1] => 数组
(
[imgid] => 2
[file] => /home/wietse/public_html/mms/images/2.gif
[thumb] =>
)
[2] => 数组
(
[imgid] => 3
[文件] => /home/wietse/public_html/mms/images/3.gif
[thumb] =>
)
[3] => 数组
(
[图片ID] => 4
[文件] => /home/wietse/public_html/mms/images/4.gif
[thumb] =>
)
)
To Top