2012-01-14 8 views
7

benim tablonun tüm satırları almak için Neden tüm veri türleri, PHP ile sqlite3 fetchAll (PDO: FETCH_ASSOC) içeren dizeler olarak döndürülüyor?

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

kullanıyorum.

o fetchAll ait sonuçlanan gelen şema "id INTEGER PRIMARY KEY, başlık METİN, yıl INTEGER, fiyat GERÇEK"

Bir satır olarak tanımlanır Neden tüm veri türleridir

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

olduğunu dizeler olarak iade ediliyor? Şemada tanımlandığı gibi iade edilmelerini istiyorum. SQLite 'tipsiz' doğasını anlıyorum, ancak sınırlı veri türlerini TEXT, INTEGER ve REAL olarak tanımlarlar. Verileri belirtilen veri türleriyle nasıl iade edebilirim? Her satırda yineleme yapmak ve PHP ile dönüştürmek istemiyorum - bu sadece çok yavaş görünüyor.

Komple Testi Kod Şöyledir olarak:

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

cevap

3

Bu SQLite ile ilgisi yoktur; Bir veritabanını sorgulamak için ne kullandığınız önemli değil, tüm kayıtlar dizginin koleksiyonları olarak döndürülür. Bu sadece PHP tarafından kullanılan veritabanı bağdaştırıcılarının/sürücülerinin doğasıdır.

Değerlerin istediğiniz türde olmasını istiyorsanız, el ile çevirmeniz gerekir.

+0

Söylemek zorundayım, bu PDO'nun tasarımı hakkında gerçekten üzücü bir ifadedir. Microsoft'un SQL Server için PDO sürücüsü ile çalışıyorum ve tam olarak aynı şekilde davranıyor: tüm veri türleri dizgiler olarak döndürülüyor ve getColumnMeta aracılığıyla kullanılabilen çeşitli indeksleri sorgulamak, veri türü olarak "string" i detatype olarak döndürür. kökeni veritabanı. –

+1

Bu doğrudur. Ancak yerel SQLITE3 sürücüsü farklı çalışıyor. Burada manuel olarak yayınlamak zorunda değilsiniz. Tipler sqlite3'te saklandıkları gibidir. Rowid = (int) gibi, text = (string) vb ... – AppGeer

İlgili konular