Php 使用odbc数据库驱动程序的codeigniter出现问题

Php 使用odbc数据库驱动程序的codeigniter出现问题,php,sql-server,codeigniter,odbc,Php,Sql Server,Codeigniter,Odbc,我在codeigniter的odbc驱动程序中遇到了一个奇怪的问题。 我正在使用FreeTDS从linux机器连接到MSSQL 2008机器 虽然我知道'num_rows'函数总是返回-1,这完全是数据库/驱动程序的问题-由于某种原因,当我尝试创建->result()时,整个应用程序崩溃(错误500,有时只是一个空白页),如果我幸运的话,我收到一条错误消息,通知我应用程序已死亡,因为它试图分配2 TB的内存(!) 这种情况经常发生,即:每隔几次刷新。有时它运行正常,有时页面返回错误500,有时它

我在codeigniter的odbc驱动程序中遇到了一个奇怪的问题。 我正在使用FreeTDS从linux机器连接到MSSQL 2008机器

虽然我知道'num_rows'函数总是返回-1,这完全是数据库/驱动程序的问题-由于某种原因,当我尝试创建->result()时,整个应用程序崩溃(错误500,有时只是一个空白页),如果我幸运的话,我收到一条错误消息,通知我应用程序已死亡,因为它试图分配2 TB的内存(!)

这种情况经常发生,即:每隔几次刷新。有时它运行正常,有时页面返回错误500,有时它给出内存分配错误-在任何情况下,它都不是可以通过percision复制的,查询非常简单


有人吗

哈哈,这件事也发生在我身上!和开发人员讨论这个问题,他们

当您调用result()时,它将遍历每个可能的结果,并将记录存储到一个庞大的内部数组中。请参见
system/database/DB\u result.php
result\u object()和result\u array()末尾的while循环

有三种方法可以解决这个问题

简单的方法:
限制
(或)SQL查询中的结果

SELECT TOP(100) * FROM Table
更新的无缓冲方式: 使用询问此问题2年后的
unbuffered_row()
函数

$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...
}
艰难之路: 使用使用PHP5迭代器的适当结果对象(开发人员不喜欢它,因为它不包括php4)。在DB_result.php文件中添加如下内容:

-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
然后使用它,而不是调用
$query->result()。而且所有的内部CI都可以使用
result()


顺便说一下,我的迭代器代码在处理它们的代码时,在整个-1问题上存在一些逻辑问题,所以不要在同一个对象上同时使用
$query->result()
$query
。如果有人想解决这个问题,你真是太棒了。

没有足够的具体信息。对于帮助你的人…我应该提供什么信息?如果您能指导我,我可以给出具体的答复。更正,这不是我的设置的问题,但当我完全重写驱动程序时,我发现您的代码非常有用,我的结果对象现在是纯php5,非常好。Bummer:(问题是什么?问题是错误的驱动程序配置,freetds,如果你知道它看起来像一年前有人为了限制内存使用而添加了unbuffered_row():
$query = $this->db->query($sql);
foreach ($query as $record) { // not $query->result() because that loads everything into an internal array.
    // code...
}