odbc veritabanı sürücüsünü kullanarak CodeIgniter ile sorun

1 Cevap php

i’ve run into a curious problem with codeigniter's odbc driver. i’m connecting from a linux machine to an MSSQL 2008 machine using FreeTDS.

nedense ben oluşturmaya çalıştığınızda - i - 'num_rows' işlevi her zaman -1 döndürür ve bu tam bir veritabanı / sürücü sorunu olduğunu alırken> sonuç (), tüm uygulama çöker (hata 500, bazen sadece bir Ben şanslıyım ise boş sayfa), i (belleğe tahsis edilen 2 terrabytes çalıştım çünkü uygulama öldüğünü bana bildiren bir hata mesajı alıyorum!).

Bu, yani düzensiz olur: her birkaç ferahlatır. Gerçekten percision ile üretilemeyen bir şey değil, her durumda ve sorguları SÜPER basit - hatta bazen sayfa hata 500 döner ve bazen bellek ayırma hatası veriyor, iyi çalışır.

fikirleri kimse?

1 Cevap

Ha ha, bu da başıma geldi! Ve I've complained Bu konuda Devs için, ve onlar ignored me.

Eğer sonuç çağırdığınızda (), bu döngü her olası sonucu ile olacak ve büyük bir dahili diziye kaydını saklayın. Bkz system/database/DB_result.php ise result_object ve sonunda (döngü) ve result_array ()

Sabitleme üç yolu vardır.

The easy way:

SQL sorgusunda LIMIT (veya TOP MSSQL) sonuçlarınız.

SELECT TOP(100) * FROM Table

The UPDATED unbuffered way:

Bu soru sorulmuştur introduced 2 yıl sonra oldu unbuffered_row() işlevini kullanın.

$query = $this->db->query($sql);
// not $query->result() because that loads everything into an internal array.
// and not $query->first_row() because it does the same thing (as of 2013-04-02)
while ($record = $query->unbuffered_row('array')) { 
    // code...
}

The hard way:

(O php4 hariç çünkü Devs sevmiyorum) PHP5 yineleyicileri kullanan bir proper sonuç nesne kullanın. Lütfen DB_result.php dosyasında böyle bir şey tokat:

-class CI_DB_result {
+class CI_DB_result implements Iterator {

    var $conn_id        = NULL;
    var $result_id      = NULL;
    var $result_array   = array();
    var $result_object  = array();
-   var $current_row    = 0;
+   var $current_row    = -1;
    var $num_rows       = 0;
    var $row_data       = NULL;
+   var $valid          = FALSE;


    /**
    function _fetch_assoc() { return array(); } 
    function _fetch_object() { return array(); }

+   /**
+    * Iterator implemented functions
+    * http://us2.php.net/manual/en/class.iterator.php
+    */
+   
+   /**
+    * Rewind the database back to the first record
+    *
+    */
+   function rewind()
+   {
+       if ($this->result_id !== FALSE AND $this->num_rows() != 0) {
+           $this->_data_seek(0);
+           $this->valid = TRUE;
+           $this->current_row = -1;
+       }
+   }
+   
+   /**
+    * Return the current row record.
+    *
+    */
+   function current()
+   {
+       if ($this->current_row == -1) {
+           $this->next();
+       }
+       return $this->row_data;
+   }
+   
+   /**
+    * The current row number from the result
+    *
+    */
+   function key()
+   {
+       return $this->current_row;
+   }
+   
+   /**
+    * Go to the next result.
+    *
+    */
+   function next()
+   {
+       $this->row_data = $this->_fetch_object();
+       if ($this->row_data) {
+           $this->current_row++;
+           if (!$this->valid)
+               $this->valid = TRUE;
+           return TRUE;
+       } else {
+           $this->valid = FALSE;
+           return FALSE;
+       }
+   }
+   
+   /**
+    * Is the current_row really a record?
+    *
+    */
+   function valid()
+   {
+       return $this->valid;
+   }
+   
 }
 // END DB_result class

Sonra yerine $query->result() Eğer $query gibi ucunda ->result() olmadan sadece nesneyi kullanmak çağırmak, kullanmak için. Ve tüm iç CI şeyler hala result() ile çalışır.

$query = $this->db->query($sql);
foreach ($query as $record) { // not $query->result() because that loads everything into an internal array.
    // code...
}

Bu arada, kendi koduyla çalışma benim Iterator kod bütün -1 şeyle bazı mantık sorunları var, bu yüzden aynı nesne üzerinde iki $query->result() ve $query kullanmayın. Birisi bunu düzeltmek istiyorsa, sen harika.