当前位置: 首页 > 知识库问答 >
问题:

从PostgreSQL获取布尔值

米子轩
2023-03-14

我正在使用CodeIgniter 3和PostgreSQL 9.4数据库。如果数据库中相应列的数据类型是布尔值,有没有办法在PHP中获取布尔值?

我使用CodeIgniters查询生成器类,如下所示:

$qry = $this->db->get_where('user', array('username' => mb_strtolower($username)));
return $qry->row();

用户表中的所有布尔值都由字符串('t'和'f')表示。

共有3个答案

濮金鑫
2023-03-14

如果您在插入或更新数据时使用布尔值,CodeIgniter会转换它们,但在获取记录时不能这样做,因为它不知道它读取的数据类型——它是查询生成器,不是ORM。

您可以做的是创建一组类来表示特定的结果集,并在获取时使用custom_result_object()或custom_row_object()
显然,必须由这些定制对象执行“t”/“f”到真/假的转换。

徐瀚
2023-03-14

有一个更好的解决方案:使用PDO驱动程序,例如:

$db['default']['dsn']      = 'pgsql:host=localhost;dbname=base';
$db['default']['username'] = 'username';
$db['default']['password'] = 'password';
$db['default']['dbdriver'] = 'pdo';
$db['default']['port']     = 5432;

然后您的结果将是正确的类型

在postgre驱动程序(json_encode)的响应:

{
    "created_at": "2017-10-20 12:20:49",
    "created_by": "82027609253",
    "updated_at": "2017-10-20 12:20:49",
    "updated_by": "82027609253",
    "deleted": "f",
    "id": "184",
    "codigo_ibge": "1501402",
    "uf": "PA",
    "nome": "Belém"
}

pdo驱动程序(json_encode)中的响应:

{
    "created_at": "2017-10-20 12:20:49",
    "created_by": 82027609253,
    "updated_at": "2017-10-20 12:20:49",
    "updated_by": 82027609253,
    "deleted": false,
    "id": 184,
    "codigo_ibge": 1501402,
    "uf": "PA",
    "nome": "Belém"
}
赵志
2023-03-14

为了完成Narf的回答,这里有一个通用类,用于将其转换为本机布尔php类型pgsql返回。请注意,这不是最佳解决方案,因为它会将每个字符串“f”或“t”转换为布尔值,而不管数据库中的列是否为布尔值。

<?php

class PgSqlObject
{

    public function __set($name, $value)
    {
        if ($value === 'f')
            $value = false;
        elseif ($value === 't')
            $value = true;

        $this->$name = $value;
    }

    public function __get($name)
    {
        if (isset($this->$name))
        {
            return $this->$name;
        }
    }
}


$this->db->query($sql)->custom_result_object('PgSqlObject');
 类似资料:
  • 我有我的科特林班 以下是我获得价值的方式 但问题是,我没有任何问题地获得了字段的价值。但是 布尔字段始终保持 null。我已经用一些其他布尔前缀,这很好。当我使用 或 时,我没有得到布尔值。任何人都可以解释我为什么我面临这个问题。#AskFirebase

  • 假设我有整数0到100的数据帧。我想把这些值分为3部分,低、中、高,低小于33,高大于66,中介于33和66之间。所以我用 我得到了一个错误 我已经尝试过if-else语句和以及其他操作符。低和高起作用,但中间不起作用。 请问我能知道附近的路吗?

  • 问题内容: Go的布尔类型的零值为。Postgres支持未定义的BOOL类型,表示为NULL。尝试从Go中的Postgres获取BOOL值时,这会导致问题: 输出: 解决这个问题的最惯用的方法是什么?我想象的两种解决方案都不是很吸引人: 不要使用Go的类型。相反,我可能会使用一个字符串,并进行自己的转换,这占 在Postgres中,请始终通过使用或其他方式确保BOOL为TRUE或FALSE 。 问

  • 考虑我有以下代码 我想做的是我有一个映射,它的值是字符串列表。 这些值将被转换成整数,并将被检查,如果该值大于给定的值,如第二/内过滤器。 我可以把它分成几个小部分,因为我使用了两个过滤器,但从内部过滤器我无法得到布尔值,所以我将得到所需的流,然后使用flatmat(Collection::stream)合并,然后将其转换为set(以避免重复),因为这两个列表都包含一个公共值,即4 我需要的输出必

  • 问题内容: 如何在Android上的SQLite数据库中获取布尔字段的值? 我通常使用,等获取字段的值,但似乎没有方法。 问题答案: 它是:

  • 问题内容: 好的,我在代码中实现了这个SO问题:随机返回True或False 但是,我的行为很奇怪:我需要同时运行十个实例,每个实例每次运行仅返回一次true或false。令人惊讶的是,无论我做什么,每次我得到 有什么方法可以改善这种方法,以便我至少有大约50%的机会得到吗? 为了使它更易于理解:我将应用程序构建为JAR文件,然后通过批处理命令运行 程序的内容-使其尽可能简单: 如果我打开10个命