当我使用pg_query从postgresql数据库获取数据时,pg_fetch_assoc将所有数字字段作为字符串返回。有没有办法解决这个问题,还是我必须按照我需要的方式对每个字段进行类型划分?
答案 0 :(得分:2)
这就是PHP的作用。来自manual:
数组中的每个值都表示为字符串。
答案 1 :(得分:2)
也许有点偏离主题 - 让我知道,我会放弃我的答案 - 但仍然,这是Pomm项目出去的原因之一:因为默认情况下,布尔值会返回为字符串&t?t& #39;和' f' (真与假)。
这非常不方便,它使开发人员无法使用复杂而有用的结构,如数组,范围,几何类型等。
Pomm的Foundation软件包使用pg_field_type函数触发结果和参数转换器:
select
array[1, 2, 3]::int4[] as some_ints,
now() as a_date,
point(1,2) as a_point,
true as a_bool
;
使用PDO或本机PHP的Postgres库执行此查询会返回一个字符串数组,如下所示:
some_ints │ a_date │ a_point │ a_bool
{1,2,3} │ 2015-07-31 07:35:36.143182+00 │ (1,2) │ t
使用Pomm的Foundation执行此查询会返回一个带有单个数组结果的迭代器:
[
"some_ints" => [
1,
2,
3
],
"a_date" => <DateTime> {
date: "2015-07-31 07:45:21.438447",
timezone_type: 1,
timezone: "+00:00"
},
"a_point" => <PommProject\Foundation\Converter\Type\Point> {
x: 1.0,
y: 2.0
},
"a_bool" => true
]
转换器系统也适用于查询参数:
$sql = <<<SQL
select
2 = ANY($*::int4[]) as contain_two,
now() > $*::timestamptz as is_past,
circle(point(0,0), 5) @> $*::point as is_in_circle
;
SQL;
$res = $pomm
->getDefaultSession()
->getQueryManager()
->query($sql, [
[1,2,3],
new \DateTime('yesterday'),
new \PommProject\Foundation\Converter\Type\Point('(3,3)')
])
->current()
;
返回:
[
"contain_two" => true,
"is_past" => true,
"is_in_circle" => true
]
甚至可以创建自定义转换器并声明如何转换复合(行)类型。关于它的更详细的文章here。