pg_convert

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

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

描述

pg_convert(
    PgSql\Connection $connection,
    string $table_name,
    array $values,
    int $flags = 0
): array|false

pg_convert() 检查并将 values 中的值转换为适合用于 SQL 语句的值。 pg_convert() 的先决条件是存在一个表 table_name,该表至少具有与 values 具有相同数量的列。 table_name 中的字段名必须与 values 中的索引匹配,并且相应的 datatype 必须兼容。如果成功,则返回一个包含转换后的值的数组,否则返回 false

注意:

布尔值被接受并转换为 PostgreSQL 布尔值。布尔值的字符串表示形式也受支持。 null 被转换为 PostgreSQL NULL。

参数

connection

一个 PgSql\Connection 实例。

table_name

要转换类型的表的名称。

values

要转换的数据。

flags

任何数量的 PGSQL_CONV_IGNORE_DEFAULTPGSQL_CONV_FORCE_NULLPGSQL_CONV_IGNORE_NOT_NULL 组合使用。

返回值

一个包含转换后的值的 array,或者在失败时返回 false

错误/异常

当字段的值或类型与 PostgreSQL 的类型不匹配时,将抛出 ValueErrorTypeError

变更日志

版本 描述
8.3.0 现在当字段的值或类型与 PostgreSQL 的类型不匹配时,会抛出 ValueErrorTypeError 错误;之前会发出 E_WARNING
8.1.0 connection 参数现在期望一个 PgSql\Connection 实例;之前期望一个 resource

示例

示例 #1 pg_convert() 示例

<?php
$dbconn
= pg_connect('dbname=foo');

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

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

参见

添加笔记

用户贡献笔记 5 笔记

Anonymous
20 年前
我看到的唯一选项是

PGSQL_CONV_IGNORE_DEFAULT - 通过从返回的数组中删除字段来不使用 DEAFULT 值
PGSQL_CONV_FORCE_NULL - 如果字符串为空字符串,则转换为 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 约束

这些是常量,所以不要引用它们或任何其他内容。
gorhas at gmail dot com
9 年前
使用 interval 时存在问题。
如果在数组中
"time_pause" => '00:30:00'
并且 time_pause 是一个 interval
插入失败
pg_insert(): '00:30:00' does not match with '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ...
dharana at dharana dot net
21 年前
我找到了 "options" 的可能值

PG_CONV_CHECK - 仅检查
PG_CONV_STRICT - 针对非致命错误发出警告
PG_CONV_QUOTE - 为 vchar、text 和 datetime 添加引号。
PG_CONV_SLASH - 如果需要,添加斜杠。
PG_CONV_NULLCHK - 检查值是否为 NOT NULL 字段定义。
PG_CONV_NO_DEFAULT - 即使值为空字符串,也忽略默认值。
VLroyrenn
6 年前
另一个没有很好记录的是(截至 PHP 7.0/7.1),pg_convert 不喜欢非标量类型,并且如果传递给它的不是字符串或数字,包括数组或类似 DateTime 的东西,它将失败(但不会抛出,只会发出 E_WARNING 并返回 false)。如果您想插入这些类型,您实际上必须自己进行转换。

此外,令人惊讶的是,$table_name 与 pg_​escape_​identifier 的输出不兼容,或者似乎与任何其他类型的转义不兼容。
Hayley Watson
7 年前
这只会应用适当的转义等,适合将 PHP 值嵌入到 SQL 语句中。

它(默认情况下)会在列标记为 NOT NULL 时检查 null,并且它会抱怨尝试为整数列转换字符串(浮点数将被截断)。

然而,除了对语法的最基本检查之外,它不会验证给定值是否为列类型的合法值。

<?php
// 假设 smallints.smallintis 是一个小型整数 (-32768..32767) 类型列
foreach([-1234,
1234,
0,
32767,
-
32768,
32768, // 小型整数类型的不正确值
45.8, // 被截断为 45
400000, // 小型整数类型的不正确值
] as $smallint)
{
$tmp = ['smallint' => $smallint];
$vals = pg_convert($dbconn, 'smallints', ['smallint' => $smallint]);
echo
$vals['"smallint"'],"\n"; // 注意列名也被转义成安全的 SQL 语法
}

// 假设 uuids.uuid 是一个 UUID 类型列
foreach(['a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
'a0eebc999c0b4ef8bb6d6bb9bd380a11',
'{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
'Invalid Not-a-UUID',
'{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
] as
$uuid)
{
$tmp = ['uuid' => $uuid];
$vals = pg_convert($dbconn, 'uuids', ['uuid' => $uuid]);
echo
$vals['"uuid"'],"\n";
}

?>

以上所有数据值都将被“转换”,即使是无效的值,也不会出现任何错误。
To Top