Php 使用odbc数据库驱动程序的codeigniter出现问题
我在codeigniter的odbc驱动程序中遇到了一个奇怪的问题。 我正在使用FreeTDS从linux机器连接到MSSQL 2008机器 虽然我知道'num_rows'函数总是返回-1,这完全是数据库/驱动程序的问题-由于某种原因,当我尝试创建->result()时,整个应用程序崩溃(错误500,有时只是一个空白页),如果我幸运的话,我收到一条错误消息,通知我应用程序已死亡,因为它试图分配2 TB的内存(!) 这种情况经常发生,即:每隔几次刷新。有时它运行正常,有时页面返回错误500,有时它给出内存分配错误-在任何情况下,它都不是可以通过percision复制的,查询非常简单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,有时它
有人吗 哈哈,这件事也发生在我身上!和开发人员讨论这个问题,他们 当您调用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...
}