【问题标题】:Why is pg_query_params reading a boolean value as a string?为什么 pg_query_params 将布尔值作为字符串读取?
【发布时间】: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


【解决方案1】:

让我们面对现实吧:

  • PDO 或 pgsql 库返回的数据始终是字符串。
  • 布尔值的 Postgresql 表示是字符串 't' 和 'f'。

这是由 PHP 文档在不同 fetch 函数的“返回值”中指定的。 herehere

如果要将这些结果转换为 PHP 等效类型,则必须设置 a converter system

【讨论】:

  • "PDO 或 pgsql 库返回的数据总是字符串" 有什么参考吗?
  • 我已经用 PHP 文档的链接更新了我的答案。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2018-09-07
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
相关资源
最近更新 更多