Php CodeIgniter将所有字段作为字符串返回
我在CodeIgniter中有这个查询:Php CodeIgniter将所有字段作为字符串返回,php,codeigniter,postgresql,Php,Codeigniter,Postgresql,我在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_r
$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\u dump
一行时,我得到:
object(stdClass)#22 (4) {
["id"]=>
string(2) "19"
["first_name"]=>
string(9) "rightfold"
// etc
}
id
和group\u id
在PostgreSQL中都是integer
s,但是$query->result()
将它们作为字符串返回。如何告诉CodeIgniter使用正确的数据类型返回字段(text
s作为字符串,integer
s作为整数,timestamp
s作为DateTime
对象等)
我正在PHP5.3.15上使用CodeIgniter 2.1.4。如果您想将此查询作为对象
$query->row();
return $query;
在您的视图文件中
foreach($row as $query)
print $row->object_name;
PS:PHP总是以“字符串”的形式提供输出。如果要在任何数据类型中强制转换它,例如将字符串转换为整数,请使用(int)$value否数据类型无法获得它 这与Codeigner无关 MySQL以字符串形式返回所有内容,NULL除外。 1 :
2:我对CodeIgnitor文档(请参阅)的理解是,您希望遍历字段数据,然后自行决定如何处理这些数据 我的猜测是,要无缝地实现这一点,您可能需要对它们的数据库和/或查询类进行子类化,这样您就可以让它们做您想做的事情
这对我来说并不是一个小的工作量,尽管开始做可能不是太糟糕。PDO返回具有正确数据类型的值。用它代替CodeIgniter的数据库库。试试这个,它对我很有帮助
This is return sql object
$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();
This query return multidimensional array as result
$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_array();
This query return single row as result
$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->row_array();
$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 ");
// use return $query->result_array();
// use like this
$data = $query->result_array();
foreach ($data as $key => $value) {
$data['group_id'] = intval($value['group_id']);
$data['dateField'] = date_create($value['dateField']);
}
var_dump($data);
//or return $data
这对我有用。如果需要任意转换,则需要遍历数据集转换数组的变量。将此功能添加到控制器:
<?php
/**
* Runs a query and returns an array of array, with correct types (as Code
* Igniter returns everything as string)
* @param string $sql
* @return array Array of array, 1st index is the row number, 2nd is column name
*/
public function queryWithProperTypes($sql) {
$query = $this->db->query($sql);
$fields = $query->field_data();
$result = $query->result_array();
foreach ($result as $r => $row) {
$c = 0;
foreach ($row as $header => $value) {
// fix variables types according to what is expected from
// the database, as CodeIgniter get all as string.
// $c = column index (starting from 0)
// $r = row index (starting from 0)
// $header = column name
// $result[$r][$header] = that's the value to fix. Must
// reference like this because settype
// uses a pointer as param
$field = $fields[$c];
switch ($field->type) {
case MYSQLI_TYPE_LONGLONG: // 8 = bigint
case MYSQLI_TYPE_LONG: // 3 = int
case MYSQLI_TYPE_TINY: // 1 = tinyint
case MYSQLI_TYPE_SHORT: // 2 = smallint
case MYSQLI_TYPE_INT24: // 9 = mediumint
case MYSQLI_TYPE_YEAR: // 13 = year
settype($result[$r][$header], 'integer');
break;
case MYSQLI_TYPE_DECIMAL: // 0 = decimal
case MYSQLI_TYPE_NEWDECIMAL: // 246 = decimal
case MYSQLI_TYPE_FLOAT: // 4 = float
case MYSQLI_TYPE_DOUBLE: // 5 = double
settype($result[$r][$header], 'float');
break;
case MYSQLI_TYPE_BIT: // 16 = bit
settype($result[$r][$header], 'boolean');
break;
}
$c = $c + 1;
}
}
return $result;
}
您可能想调整它以支持参数,但基本上就是这样:$query->field\u data()
为您提供数据集字段的元数据。使用该函数,您可以“修复”由$query->result\u array()
返回的值
请记住,根据数据集的大小,这可能是一个相当大的开销,您应该只在返回是任意的情况下执行此操作。如果你事先知道这些类型,那么最好根据它们进行转换
我尝试了PDO,它还以字符串形式返回所有值
另见:
$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,
],
...
);
现在,您应该拥有从数据库返回的所有类型正确的数据。解决此问题的正确方法是在Codeigniter驱动程序中设置mysqli选项。 以下方法适用于使用mysqli作为数据库驱动程序的用户 方法1:
在php扩展中启用mysqlnd驱动程序。这将主要解决你的问题。如果不是这样,请尝试方法2 方法2(可能不适用于所有系统):
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
如果不想更改系统驱动程序,可以更改应用程序/Core/MY_Controller.php 混合和回答,但使用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);
}
}
警告:如果使用位列,它们将不起作用,它们将始终返回零。因为司机身上有个虫子。请参阅:返回的字段在PHP中仍然是字符串。它作为字符串返回是什么意思?php中的所有sql输出都将是输出字符串,它将从db中提取,并将结果作为字符串提供给您。如果你想做数学题。计算,或者您可以使用(int)$row->object_name,但在php中不需要数据绑定。PostgreSQL返回的类型化结果并不总是字符串。另外,其他数据库接口,如Haskell中的HDBC和Python中的psycopg2,返回正确类型的字段。我认为这与数据库无关,因为mySQL还保留整数字符串和枚举数据类型,如果将其与其他编程语言一起使用,则mySQL,您还需要分配数据绑定,而不是避免捕获异常。1)我没有使用MySQL。2) PostgreSQL不返回字符串。-1:这是预期的行为。这种形式的返回数据导致的错误是什么?@tereško看在上帝的份上,这不是否决投票的正当理由!如果有什么问题的话,那就是PHP再次出现了。@rightfold您有什么解决方案吗。请更新为答案。。面对同样的问题,正如你在我的问题中看到的,我没有使用MySQL。谢谢!。即使编辑框架代码有点风险,这个方法仍然有效。这是更好的答案,维护一些运行CI的遗留代码,这真的很有帮助。我不明白为什么其他答案都是上浮的。Postgresql呢?
$this->db->conn\u id->options(MYSQLI\u OPT\u INT\u和\u FLOAT\u NATIVE,true)
在生产环境中不起作用。@yeshansachithak,检查php和mysql服务器版本是否与您的开发环境相同或更高。生产环境=服务器版本:5.6.49-cll-lve-mysql社区服务器(GPL),开发环境=服务器版本:5.7.26-mysql社区服务器(GPL),两个Env都有PHP5.6.40
它应该可以工作,PHP5.6。。。已经有了选项()。检查您的/config/database.php是否在服务器上使用了正确的驱动程序:…'dbdriver'=>“mysqli”。。。我不知道该怎么帮你。这可能是服务器上php或mysql的配置/环境问题。
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
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->db->conn_id->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
}
}