2012-01-14 19 views
7

Tôi đang sử dụngTại sao tất cả các kiểu dữ liệu được trả về dưới dạng chuỗi với sqlite3 fetchAll (PDO: FETCH_ASSOC) với PHP?

$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

để nhận tất cả các hàng trong bảng của tôi.

Giản đồ được định nghĩa là "id INTEGER PRIMARY KEY, tiêu đề văn bản, năm INTEGER, REAL giá"

Một hàng từ ông quả của fetchAll là

array(4) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(14) "The Dark Night" 
    [2]=> 
    string(4) "2008" 
    [3]=> 
    string(5) "19.95" 
    } 

Tại sao tất cả các kiểu dữ liệu được trả về dưới dạng chuỗi? Tôi muốn chúng được trả lại như được định nghĩa trong lược đồ. Tôi hiểu bản chất 'không cần thiết' của SQLite, nhưng chúng xác định các kiểu dữ liệu giới hạn như TEXT, INTEGER và REAL. Làm thế nào tôi có thể lấy dữ liệu được trả về với các kiểu dữ liệu được chỉ định? Tôi không muốn lặp qua từng hàng và chuyển đổi nó bằng PHP - điều đó dường như quá chậm.

The Complete Mã kiểm tra như sau:

<? 
class sqlite_test { 
    function __construct() 
    { 
     $this->dbase_filename = "test.sqlite"; 
     $this->init_dbase(); 

    } 

    function init_dbase() 
    { 
     $this->pdo = new PDO("sqlite:".$this->dbase_filename); 
    } 

    function open_table() 
    { 
     $table = "dvds"; 

     if (! ($test_to_see_if_table_exists = $this->pdo->query("SELECT 1 from $table"))) { 
      $schema = "id INTEGER PRIMARY KEY, title TEXT, year INTEGER, price REAL"; 
      $query = "CREATE TABLE $table ($schema)"; 

      $this->pdo->exec($query); 
     } 

     return $test_to_see_if_table_exists; 
    } 

    function add_test_records() 
    { 
     $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "The Dark Night", 2008, 19.95)'; 
     $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "The Wizard of Oz", 1939, 9.95)'; 
     $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "Jaws", 1977, 6.95)'; 

     $this->pdo->exec(join(';', $query)); 
    } 

    function dump_test_records() 
    { 
     $query = "SELECT * FROM dvds"; 

     if ($statement = $this->pdo->prepare($query)) { 
      $statement->execute(); 

      $rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

      echo "<pre>"; 
      var_dump($rows); 
      echo "</pre>"; 
     } 
    } 

    function main() 
    { 
     if (! $this->open_table()) { 
      $this->add_test_records(); 
     } 

     $this->dump_test_records(); 
    } 
} 

$test = new sqlite_test(); 
$test->main(); 

Trả lời

3

này không có gì để làm với SQLite; tất cả các bản ghi sẽ được trả lại dưới dạng tập hợp các chuỗi không có vấn đề gì bạn sử dụng để truy vấn cơ sở dữ liệu. Nó chỉ là bản chất của các adapter/trình điều khiển cơ sở dữ liệu được PHP sử dụng.

Nếu bạn muốn các giá trị thuộc loại mong muốn, bạn phải truyền theo cách thủ công.

+0

Tôi phải nói, đây là một tuyên bố rất buồn về thiết kế của PDO. Tôi đã làm việc với trình điều khiển PDO của Microsoft cho SQL Server và nó hoạt động theo cùng một cách: tất cả các kiểu dữ liệu được trả về dưới dạng chuỗi và truy vấn các chỉ mục khác nhau có sẵn thông qua getColumnMeta luôn trả về "chuỗi" làm kiểu dữ liệu bất kể kiểu dữ liệu trong cơ sở dữ liệu gốc. –

+1

Điều này đúng. Nhưng trình điều khiển SQLITE3 bản địa đang hoạt động khác nhau. Ở đây bạn không phải đúc thủ công. Các kiểu như chúng được lưu trữ trong sqlite3. Giống như rowid = (int), text = (string), v.v ... – AppGeer

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