我看到的唯一选项是
PGSQL_CONV_IGNORE_DEFAULT - 通过从返回的数组中移除字段来不使用默认值
PGSQL_CONV_FORCE_NULL - 如果字符串是空字符串,则转换为 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 约束
这些是常量,因此不要对它们加引号或其他任何操作。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_convert — 将关联数组值转换为适合 SQL 语句的格式
$connection
,$table_name
,$values
,$flags
= 0
pg_convert() 检查并将 values
中的值转换为适合用于 SQL 语句的值。 pg_convert() 的前提条件是存在一个表 table_name
,该表至少与 values
元素的数量一样多的列。 table_name
中的字段名必须与 values
中的索引匹配,并且相应的 数据类型必须兼容。成功时返回包含转换后值的数组,否则返回 false
。
注意:
布尔值会被接受并转换为 PostgreSQL 布尔值。布尔值的字符串表示也受支持。
null
将转换为 PostgreSQL NULL。
connection
一个 PgSql\Connection 实例。
table_name
要根据其转换类型的表的名称。
values
要转换的数据。
flags
任意数量的 PGSQL_CONV_IGNORE_DEFAULT
、PGSQL_CONV_FORCE_NULL
或 PGSQL_CONV_IGNORE_NOT_NULL
组合。
当字段的值或类型与 PostgreSQL 的类型不匹配时,会抛出 ValueError 或 TypeError。
版本 | 描述 |
---|---|
8.3.0 | 现在当字段的值或类型与 PostgreSQL 的类型不匹配时,会抛出 ValueError 或 TypeError 错误;以前会发出 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);
?>
我看到的唯一选项是
PGSQL_CONV_IGNORE_DEFAULT - 通过从返回的数组中移除字段来不使用默认值
PGSQL_CONV_FORCE_NULL - 如果字符串是空字符串,则转换为 NULL
PGSQL_CONV_IGNORE_NOT_NULL - 忽略 NOT NULL 约束
这些是常量,因此不要对它们加引号或其他任何操作。
使用 interval 时存在问题。
如果在数组中
"time_pause" => '00:30:00'
并且 time_pause 是一个 interval
则插入失败
pg_insert(): '00:30:00' does not match with '^(@?[ \t]+)?((([-+]?[ \t]+)?[0-9]+(\.[0-9]*)?[ ...
我发现了 "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 - 即使值为空字符串,也忽略默认值。
另一个没有很好记录的事情是(从 PHP 7.0/7.1 开始),pg_convert 不喜欢非标量类型,如果传递给它的是字符串或数字以外的任何内容(包括数组或类似 DateTime 的内容),则会失败(但不会抛出异常,只会发出 E_WARNING 并返回 false)。如果要插入这些类型,则实际上必须自己进行转换。
此外,有点令人惊讶的是,$table_name 与 pg_escape_identifier 的输出不兼容,或者似乎与任何其他类型的转义都不兼容。
这只会应用适合将 PHP 值嵌入到 SQL 语句中的适当转义等操作。
它(默认情况下)会检查列是否标记为 NOT NULL 时是否为空,并且如果尝试为整型列转换字符串,它会报错(浮点数将被截断)。
但是,除了对语法的最基本的检查之外,它不会验证给定值是否为列类型的合法值。
<?php
// 假设 smallints.smallintis 是一个 smallint 类型列 (-32768..32767)
foreach([-1234,
1234,
0,
32767,
-32768,
32768, // smallint 类型错误的值
45.8, // 将截断为 45
400000, // smallint 类型错误的值
] 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}',
'无效的非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";
}
?>
上述所有数据值都将被“转换”,即使是无效的值,也不会报错。