我看到的唯一选项是
PGSQL_CONV_IGNORE_DEFAULT - 通过从返回的数组中删除字段来不使用 DEAFULT 值
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
中的索引匹配,并且相应的 datatype 必须兼容。如果成功,则返回一个包含转换后的值的数组,否则返回 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 - 通过从返回的数组中删除字段来不使用 DEAFULT 值
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 时检查 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";
}
?>
以上所有数据值都将被“转换”,即使是无效的值,也不会出现任何错误。