PHP Conference Japan 2024

pg_update

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

pg_update更新表

描述

pg_update(
    PgSql\Connection $connection,
    string $table_name,
    array $values,
    array $conditions,
    int $flags = PGSQL_DML_EXEC
): string|bool

pg_update() 更新与 conditions 匹配的记录,并使用 values 中的值。

如果指定了 flags,则 pg_convert() 会应用于 values,并使用指定的标志。

默认情况下,pg_update() 传递原始值。值必须转义或在 flags 中指定 PGSQL_DML_ESCAPE 标志。PGSQL_DML_ESCAPE 对参数/标识符进行引用和转义。因此,表/列名称区分大小写。

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

参数

connection

一个 PgSql\Connection 实例。

table_name

要更新行的表的名称。

values

一个 array,其键是表 table_name 中的字段名称,其值是要更新匹配行的值。

conditions

一个 array,其键是表 table_name 中的字段名称,其值是要更新的行必须满足的条件。

flags

任意数量的 PGSQL_CONV_FORCE_NULLPGSQL_DML_NO_CONVPGSQL_DML_ESCAPEPGSQL_DML_EXECPGSQL_DML_ASYNCPGSQL_DML_STRING 的组合。如果 PGSQL_DML_STRINGflags 的一部分,则返回查询字符串。当设置 PGSQL_DML_NO_CONVPGSQL_DML_ESCAPE 时,它不会在内部调用 pg_convert()

返回值

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

变更日志

版本 描述
8.1.0 connection 参数现在期望一个 PgSql\Connection 实例;以前,期望的是一个 资源

示例

示例 #1 pg_update() 示例

<?php
$db
= pg_connect('dbname=foo');
$data = array('field1'=>'AA', 'field2'=>'BB');
// 这在某种程度上是安全的,因为所有值都已转义。
// 但是 PostgreSQL 支持 JSON/数组。这些既不安全
// 转义也不安全预处理查询。
$res = pg_update($db, 'post_log', $_POST, $data);
if (
$res) {
echo
"数据已更新:$res\n";
} else {
echo
"用户必须发送错误的输入\n";
}
?>

参见

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

添加注释

用户贡献的注释 3 条注释

2
dominik dot bonsch at homesono dot de
16 年前
在没有键验证的情况下使用 pg_update() 和 pg_insert() 不安全!

您需要检查获取哪些数据对,以及是否允许更新此列。

示例

您有一个包含三个列的表:用户名、密码、用户级别。

您的用户只能更改他们的用户名和密码,但不能更改他们的用户级别。

如果您不筛选请求数组中的键,则每个用户现在都可以通过发送带有“userlevel=>100”的 POST 请求来更改其用户级别。

因此,如果您不检查请求数组中是否允许使用键,则代码中会出现严重的 SQL 注入漏洞。
-2
jhooks
18 年前
> 返回值
>
> 成功时返回 TRUE,失败时返回 FALSE。如果
> 通过选项传递 PGSQL_DML_STRING。

在我的 PHP 副本(版本 4.4.0)中发现,如果使用“PGSQL_DML_STRING”选项,则函数不会执行任何查询。它仅返回本来要执行的查询。

我注意到的另一件事是,pg_update 似乎没有使用 pg_trace(至少在 4.4.0 中)。

PS 这不是错误报告,只是我注意到的一些未记录功能的解释。正如手册中所说,该函数仍在开发中,因此此行为可能因版本而异。
-4
sdibb at myway dot com
19 年前
此函数类似于 PEAR::DB 的 autoExecute() 函数,唯一的区别是 where 子句是数组而不是字符串。

此外,如果您想将 DB 类的实例与此函数一起使用,您可以使用 $db->connection 引用现有的资源连接。

例如
<?
pg_update($db->connection, $arr_update, $arr_where);
?>
To Top