【发布时间】:2016-01-25 16:42:06
【问题描述】:
我在 PostgreSQL 表中有一个布尔列。在 pgAdmin III 中,表格视图显示列的“TRUE”和“FALSE”。当我执行 SQL 'select *' 时,另一个窗口显示 't' 和 'f'。这是一些配置问题吗?它不应该也显示'TRUE'和'FALSE'吗?
然后我们来到 PHP。我有以下代码来处理这个布尔值(实际上我正在做一些不同的事情,但在这里简化了它):
$q = "select * from tax where id = $1";
$res = pg_query_params($conn,$q,[$id]);
if ($res) {
$row = pg_fetch_array($res,NULL,PGSQL_ASSOC);
$valido = $row['valido'];
echo $valido; // prints 'f' (== 'FALSE' on database)
if ($valido) {
echo 'valid'; // gets here
} else {
echo 'invalid';
}
}
数据库说'FALSE',php读取'f'并将其视为'TRUE'。这是一些错误的配置,还是 php 总是将布尔值读取为解释为与原始值相反的文本?
【问题讨论】:
-
f是字符串,而不是布尔值:如果您想将其用作布尔值,请将其转换为布尔值 -$valido = ($row['valido'] == 'f') ? false : true; -
所以我需要配置 PostgreSQL 以将布尔值作为布尔值返回?或者配置可以在 PHP 本身上完成?或者它总是将布尔值作为字符串返回,我需要总是有额外的工作将它再次返回到布尔值?简单地保持布尔值不是更明智吗?
-
@MarcB,如果(谁?PHP 或 PostgreSQL)没有返回原始值为布尔值的字符串,则不会重复。这种行为是不可改变的吗?这与良好、简洁、经济的编程逻辑相反。
-
不知道 pg 布尔值会在哪里变成 PHP f,但无论如何,你的
f是一个字符串,它不是空的,因此它是一个“真”值。 -
布尔值在哪里变成字符串?在上面的代码中。你告诉我这不是正常行为吗?那么,我在哪里可以配置它以正确的方式呢? (我知道php如何将字符串评估为布尔值,我在问为什么它首先变成了一个字符串,以及这种行为是否可以改变。所以这是一个相当不同的问题,你不觉得吗?我改变了标题,请看一下。)
标签: php postgresql boolean