2013-08-05 34 views
6

我有這樣的查詢中的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 
} 

idgroup_idinteger S IN的PostgreSQL,但$query->result()將它們作爲字符串返回。我該如何告訴CodeIgniter使用正確的數據類型返回字段(text s作爲字符串,integer s作爲整數, s作爲DateTime對象等等)?

我在PHP 5.3.15上使用CodeIgniter 2.1.4。

+1

-1:這是預期的行爲。什麼是**錯誤**,這是由這種形式的返回數據造成的? –

+2

@tereško這不是一個downvote的正當理由,看在上帝的份上!如果有的話,PHP會再次<插入侮辱性詞語>。 –

+0

@rightfold你有沒有解決方案。請更新爲答案..面臨同樣的問題 –

回答

-2

如果你想獲得此查詢作爲對象,

$query->row(); 
return $query; 

在你的視圖文件

foreach($row as $query) 
print $row->object_name; 

PS:PHP總是讓你爲 「字符串」 輸出。如果要將其轉換爲任何數據類型,例如字符串轉換爲整數,請使用(int)$ value

+0

返回的_fields_仍然是PHP中的字符串。 – rightfold

+1

你的意思是它返回字符串?在PHP中的所有SQL輸出將是輸出字符串,它將從數據庫中獲取並以字符串形式給出結果。如果你想做一個數學。計算,或其他你可以使用(int)$ row-> object_name,但在php數據綁定是沒有必要的。 –

+0

PostgreSQL返回類型不一定是字符串的結果。另外,其他數據庫接口(如Haskell中的HDBC和Python中的psycopg2)會返回具有正確類型的字段。 – rightfold

0

我的CodeIgnitor文件(見http://ellislab.com/codeigniter/user-guide/database/fields.html)的解讀是,你會通過現場數據要循環,然後做出自己的決定,以什麼處理數據。

我的猜測是,要做到這一點無縫你可能想要他們的數據庫和/或查詢類的子類,以便你可以讓他們做你想做的。

這並不是我的一小部分工作,雖然它可能不會太糟。

1

PDO以正確的數據類型返回值。用它代替CodeIgniter的數據庫庫。

0
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(); 
-3

試試這個,它對我很有幫助。

$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 
2

這對我有效。如果你想要任意轉換,你需要迭代你的數據集來轉換數組的變量。此功能添加到您的控制器:

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

這樣使用它:

$sql = "SELECT * FROM whatever_table"; 
$result = $this->queryWithProperTypes($sql); 
var_dump($result); // check that all types are correctly cast 

您可能要調整它支持的參數,但是這想法基本上是:$query->field_data()爲您提供的數據集字段中的元數據。通過這個功能,您可以使用settype函數「修復」由$query->result_array()返回的值。

請記住,根據數據集的大小,它可能是一個相當大的開銷,並且您應該只在返回是任意的時候這樣做。如果您事先知道類型,最好相應地施放它們。

我試過PDO,它也返回所有的值作爲字符串。

參見:

0

我掙扎相當一段時間與這一個。我無法找到一個不太有效的解決方案。這是我想出的。適用於所有控制器,但可以類似的方式擴展到任何CI類。

  1. 變化的application/config/database.php中使用PDO:

    $db['default'] = array(
        'dsn' => 'mysql:host=localhost;dbname={{my_db}};charset=utf8;', 
        'username' => 'my_db_user', 
        'password' => '123', 
        'database' => 'my_db', 
        'dbdriver' => 'pdo', 
        ... 
    ); 
    
  2. 創建MY_Controller類來擴展是CI_Controller 應用/核心/ MY_Controller.php

    class MY_Controller extends CI_Controller { 
        public function __construct() { 
         parent::__construct(); 
         $this->db->conn_id->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
        } 
    } 
    
  3. 在控制器中使用擴展類。改變這種在所有的控制器(實施例的用戶控制器):

更改此:

類用戶延伸CI _controller {

到此 - >

類用戶延伸MY _Controller {

現在你應該擁有所有從數據庫與正確的類型。

相關問題