CodeIgniter将所有字段作为字符串返回

rig*_*old 8 php postgresql codeigniter

我在CodeIgniter中有这个查询:

$query = $this->db->query("
      SELECT u.id
           , u.first_name, u.last_name
           , u.email_address
           , g.id AS group_id
           , g.name AS group_name
           , g.human_readable_name AS human_readable_group_name
        FROM users AS u
        JOIN groups AS g
          ON u.group_id = g.id
    ORDER BY u.last_name
");

return $query->result();
Run Code Online (Sandbox Code Playgroud)

当我var_dump连续,我得到这个:

object(stdClass)#22 (4) {
  ["id"]=>
  string(2) "19"
  ["first_name"]=>
  string(9) "rightfold"
  // etc
}
Run Code Online (Sandbox Code Playgroud)

id并且group_idinteger在PostgreSQL中,但是$query->result()将它们作为字符串返回.如何告诉CodeIgniter使用正确的数据类型(texts为字符串,integers为整数,timestamps为DateTime对象等)返回字段?

我在PHP 5.3.15上使用CodeIgniter 2.1.4.

Fir*_*rze 7

这可以使用 PDO 驱动程序来实现。然后将 PDO::ATTR_EMULATE_PREPARES 设置为 false。这可以在database.php 中完成。我相信使用选项数组是未记录的功能。

更改application/config/database.php以使用 PDO 并将 PDO::ATTR_EMULATE_PREPARES 添加到选项:

    $db['default'] = array(
        'dsn'   => 'mysql:host=localhost;dbname={{my_db}};charset=utf8;',
        'username' => 'my_db_user',
        'password' => '123',
        'database' => 'my_db',
        'dbdriver' => 'pdo',
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => false,
        ],
        ...
    );
Run Code Online (Sandbox Code Playgroud)

现在,您应该拥有从数据库返回的所有数据类型正确的数据。


Kal*_*nan 6

解决此问题的正确方法是在Codeigniter驱动程序中设置mysqli选项。以下方法适用于使用mysqli作为数据库驱动程序的用户。

方法1:
在php扩展中启用mysqlnd驱动程序。这将主要解决您的问题。如果不是这样,请尝试方法2

方法2(可能不适用于所有系统):

  1. 从系统>数据库>驱动程序> mysqli_driver.php中打开mysqli_driver.php文件
  2. 将以下行添加到代码中

码:

public function db_connect($persistent = FALSE)
    ...
    $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); // already exits
    $this->_mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE,TRUE); // add this line
    ...
Run Code Online (Sandbox Code Playgroud)

代码更改后,您将收到如下响应

array (size=16)
    'auth_id' => int 1            
    'role' => string 'admin' (length=5)
    'permissions' => string 'all' (length=3)       
    'login_attempt' => int 0
    'active' => int 1        
    'mobile_verified' => int 1
Run Code Online (Sandbox Code Playgroud)


Már*_*vak 5

如果您不想更改系统驱动程序,您可以更改 application/Core/MY_Controller.php。

混合KalaivananFirze答案,但使用 mysqli,而不是 PDO。

注意:小数在 pdo 和 mysqli 中仍会转换为字符串,因此请使用 Double 代替。

创建/更改 application/Core/MY_Controller.php 如下:

class MY_Controller extends CI_Controller
{ 
    public function __construct()
    {
        parent::__construct();        
        $this->db->conn_id->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

警告:如果您使用 BIT 列,它们将不起作用,它们将始终返回零。因为驱动程序有一个错误。请参阅:带有 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 的 mysqlnd 无法解释位列。


Ond*_*CAN -2

如果你想将此查询作为对象获取,

$query->row();
return $query;
Run Code Online (Sandbox Code Playgroud)

在您的视图文件中

foreach($row as $query)
print $row->object_name;
Run Code Online (Sandbox Code Playgroud)

PS:PHP 总是以“字符串”的形式提供输出。如果您想将其转换为任何数据类型,例如将字符串转换为整数,请使用 (int) $value

  • 1)我没有使用MySQL。2) PostgreSQL_不_返回字符串。 (5认同)