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

2022-08-31 00:56:51

我在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();

当我一行时,我得到这个:var_dump

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

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

我在PHP 5.3.15上使用CodeIgniter 2.1.4。


答案 1

解决此问题的正确方法是在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
    ...

代码更改后,您将获得如下响应

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

答案 2

这可以使用PDO驱动程序实现。然后将 PDO::ATTR_EMULATE_PREPARES 设置为 false。这可以在数据库.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,
        ],
        ...
    );

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


推荐