【问题标题】:Getting boolean values from PostgreSQL从 PostgreSQL 获取布尔值
【发布时间】:2016-07-08 02:44:35
【问题描述】:

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

我正在使用 CodeIgniters 查询构建器类,如下所示:

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

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

【问题讨论】:

标签: php postgresql codeigniter boolean


【解决方案1】:

为了完成 Narf 的回答,这里将一个泛型类转换为原生布尔 php 类型 pgsql 返回。请注意,这不是最佳解决方案,因为它会将每个字符串“f”或“t”转换为布尔值,无论 Db 中的列是否为布尔值。

<?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');

【讨论】:

    【解决方案2】:

    有一个更好的解决方案:使用 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"
    }
    

    【讨论】:

      【解决方案3】:

      没有。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多