2013-08-05 39 views
6

Tôi có truy vấn này trong CodeIgniter:CodeIgniter trả về tất cả các lĩnh vực như chuỗi

$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(); 

Khi tôi var_dump liên tiếp, tôi có được điều này:

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

idgroup_id đều integer s trong PostgreSQL, nhưng $query->result() trả về chúng dưới dạng chuỗi. Làm thế nào tôi có thể nói cho CodeIgniter trả về các trường bằng cách sử dụng các kiểu dữ liệu chính xác (text s làm chuỗi, integer s làm số nguyên, timestamp s là DateTime đối tượng, v.v ...)?

Tôi đang sử dụng CodeIgniter 2.1.4 trên PHP 5.3.15.

+1

-1: Đây là hành vi mong đợi. ** Lỗi ** là gì, do dữ liệu trả về này? –

+2

@ tereško đó không phải là một lý do hợp lệ cho một downvote, vì lợi ích của chúa! Nếu bất cứ điều gì, nó là PHP một lần nữa. –

+0

@rightfold Bạn có giải pháp nào không. Vui lòng cập nhật dưới dạng câu trả lời .. đối mặt với các vấn đề tương tự –

Trả lời

-2

Nếu bạn muốn nhận được truy vấn này như đối tượng,

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

Trong tập tin xem bạn

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

PS: PHP luôn mang đến cho bạn kết quả như "String". Nếu bạn muốn truyền nó trong bất kỳ loại dữ liệu nào, ví dụ chuỗi thành số nguyên, hãy sử dụng (int) $ value

+0

_fields_ trả về vẫn là các chuỗi trong PHP. – rightfold

+1

Ý của bạn là nó trả về thành chuỗi?Tất cả đầu ra sql trong php sẽ là chuỗi đầu ra, Nó sẽ lấy từ db và cung cấp cho bạn kết quả là chuỗi. Nếu bạn muốn thực hiện một phép toán. tính toán, hoặc cái gì khác bạn có thể sử dụng (int) $ row-> object_name, nhưng trong ràng buộc dữ liệu php là không cần thiết. –

+0

PostgreSQL trả về kết quả đã nhập không phải lúc nào cũng là chuỗi. Ngoài ra, các giao diện cơ sở dữ liệu khác — chẳng hạn như HDBC trong Haskell và psycopg2 trong Python — trả về các trường có các kiểu chính xác. – rightfold

0

đọc của tôi về các tài liệu hướng dẫn CodeIgnitor (xem http://ellislab.com/codeigniter/user-guide/database/fields.html) là bạn muốn để lặp qua các dữ liệu thực địa và sau đó đưa ra quyết định của riêng bạn như những gì để làm với dữ liệu.

Tôi đoán là để làm điều này một cách liền mạch, bạn có thể muốn phân lớp cơ sở dữ liệu và/hoặc các lớp truy vấn của họ, để bạn có thể làm cho họ làm những gì bạn muốn.

Điều này không đánh tôi như một lượng nhỏ công việc, mặc dù nó có thể không quá tệ để bắt đầu.

1

PDO trả về giá trị với các loại dữ liệu chính xác. Sử dụng nó thay vì thư viện cơ sở dữ liệu của 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

hãy thử điều này, Điều này hữu ích cho tôi.

$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

Điều này phù hợp với tôi. Bạn cần phải lặp qua tập dữ liệu của bạn chuyển đổi các biến của mảng nếu bạn muốn đúc tùy ý.Thêm chức năng này để điều khiển của bạn:

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

Sử dụng nó như:

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

Bạn có thể muốn tinh chỉnh nó để hỗ trợ các thông số, nhưng đó là ý tưởng cơ bản: $query->field_data() mang đến cho bạn siêu dữ liệu cho các lĩnh vực dữ liệu . Với điều đó, bạn có thể "sửa" các giá trị được trả về bởi $query->result_array() bằng cách sử dụng chức năng settype.

Hãy nhớ rằng nó có thể là một chi phí khá lớn tùy thuộc vào kích thước tập dữ liệu và bạn chỉ nên thực hiện khi trả lại tùy ý. Nếu bạn biết các loại trước thì tốt nhất là nên cast chúng cho phù hợp.

Tôi đã thử PDO và nó cũng trả về tất cả các giá trị dưới dạng chuỗi.

Xem thêm:

0

tôi phải vật lộn khá một thời gian với một này. Và tôi không thể tìm ra một giải pháp làm việc không quá hack. Đây là những gì tôi nghĩ ra. Hoạt động bên trong tất cả các bộ điều khiển, nhưng có thể được mở rộng tới bất kỳ lớp CI nào theo cách tương tự.

  1. Thay đổi application/config/database.php sử dụng 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. Tạo lớp MY_Controller để mở rộng CI_Controller application/core/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. Sử dụng lớp mở rộng trong bộ điều khiển. Thay đổi này trong tất cả các bộ điều khiển của bạn (Ví dụ người sử dụng điều khiển):

Thay đổi này:

Người dùng lớp mở rộng CI _Controller {

vào đây ->

Người dùng lớp

kéo dài MY _Controller {

Bây giờ bạn sẽ có tất cả dữ liệu được trả về từ DB với các loại chính xác.

Các vấn đề liên quan