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_id都integer在PostgreSQL中,但是$query->result()将它们作为字符串返回.如何告诉CodeIgniter使用正确的数据类型(texts为字符串,integers为整数,timestamps为DateTime对象等)返回字段?
我在PHP 5.3.15上使用CodeIgniter 2.1.4.
这可以使用 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)
现在,您应该拥有从数据库返回的所有数据类型正确的数据。
解决此问题的正确方法是在Codeigniter驱动程序中设置mysqli选项。以下方法适用于使用mysqli作为数据库驱动程序的用户。
方法1:
在php扩展中启用mysqlnd驱动程序。这将主要解决您的问题。如果不是这样,请尝试方法2
方法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)
如果您不想更改系统驱动程序,您可以更改 application/Core/MY_Controller.php。
混合Kalaivanan和Firze答案,但使用 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