Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter将所有字段作为字符串返回_Php_Codeigniter_Postgresql - Fatal编程技术网

Php 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

我在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\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,它还以字符串形式返回所有值

另见:


这可以通过使用PDO驱动程序来实现。然后将PDO::ATTR_EMULATE_设置为false。这可以在database.php中完成。我相信使用选项数组是一个没有文档记录的特性

更改应用程序/config/database.php以使用PDO并将PDO::ATTR_EMULATE_添加到选项:

    $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(可能不适用于所有系统):

  • 从系统>数据库>驱动程序>mysqli_driver.php打开mysqli_driver.php文件
  • 将下面的行添加到代码中
  • 代码:

    代码更改后,您会得到如下响应

    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);
        }
    }