CodeIgniter Sqlite不能工作

4
无论何时我在我的模型中像这样查询我的数据库(sqlite)(我正在使用CodeIgniter,完整的代码如下):
$this->db->select('post');
$query = $this->db->get('posts');
return $query->result_array();

I get the following error:

Fatal error: Call to a member function rowCount() on a non-object in /codeigniter/system/database/drivers/pdo/pdo_result.php on line 42

当将查询更改为不存在的内容时,我会收到一个“正确”的错误,例如:
A Database Error Occurred
Error Number: HY000
no such column: posst
SELECT posst FROM posts
Filename: /codeigniter/models/post.php
Line Number: 8

这让我相信数据库实际上是在工作的,但是有些东西我没有注意到。 我已经尝试重新创建了数据库。它只有1个表格和1列,但我就是无法获取任何数据。我还尝试使用不同的“管理员”程序来创建它,但是一直失败。我确保它是一个Sqlite 3数据库,而根据phpinfo,这也被Web服务器支持。 有人知道我哪里错了吗?

-------- 完整代码: models/post.php中的我的帖子模型

 <?php

class Post extends CI_Model{

    function get_posts(){

         $this->db->select('posst');
         $query = $this->db->get('posts');
         return $query->result_array();

        } 
}

我在 controller/posts.php 文件中的控制器:

<?php

class Posts extends CI_Controller{

    function index(){

        $this->load->model('post');
        $data['posts']=$this->post->get_posts();
        echo"<pre>";
        print_r($data['posts']);
        echo"</pre>";
    }

}

我的数据库配置在 database.php 文件中:

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'sqlite:/home/******/******/www/wtp3/codeigniter/db/wtp35.sqlite';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'pdo';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

你正在使用最新版本的 CodeIgniter 吗? - Ravi Dhoriya ツ
database.php 文件中,尝试将 dbdriver 从 pdo 更改为 sqlite - Ravi Dhoriya ツ
你的CodeIgniter版本是2.1还是2.1.1 - Ravi Dhoriya ツ
我之前尝试过这个,但它只给了我一个空白屏幕。当我将查询更改为不存在的内容时,它也不会报错(也就是说,屏幕仍然是空白的)。 - g_uint
是的,我尝试以数组的形式返回整个表格,代码如下:$query = $this->db->get('posts'); return $query->result_array(); - g_uint
显示剩余4条评论
4个回答

5
这个修复方案的功劳归于S. Stüvel、J. Bransen和S. Timmer。这是针对特定服务器的修复方案,所以效果因人而异。但至少对我有效。
在pdo_driver.php中,从第81行开始,更改如下:
    empty($this->database) OR $this->hostname .= ';dbname='.$this->database;

    $this->trans_enabled = FALSE;

    $this->_random_keyword = ' RND('.time().')'; // database specific random keyword
}

to

if(strpos($this->database, 'sqlite') !== FALSE) {
        $this->hostname = $this->database;
        $this->_random_keyword = ' RANDOM()';
    }
    else {
        $this->hostname .= ";dbname=".$this->database;
        $this->_random_keyword = ' RND('.time().')'; // database specific random keyword
    }

    $this->trans_enabled = FALSE;
}

将第189行的函数_execute($sql)整个替换为:

function _execute($sql)
{
    $sql = $this->_prep_query($sql);
    $result_id = $this->conn_id->query($sql);

    if (is_object($result_id))
    {
        $this->affect_rows = $result_id->rowCount();
    }
    else
    {
        $this->affect_rows = 0;
    }

    return $result_id;
}

然后在 pdo_result.php 中更改代码:

将第 29 行修改为

public $num_rows;

to

var $pdo_results = '';
var $pdo_index = 0;

在第36行替换整个函数。
public function num_rows()
{
    if (is_int($this->num_rows))
    {
        return $this->num_rows;
    }
    elseif (($this->num_rows = $this->result_id->rowCount()) > 0)
    {
        return $this->num_rows;
    }

    $this->num_rows = count($this->result_id->fetchAll());
    $this->result_id->execute();
    return $this->num_rows;
}

使用:

function num_rows()
{
    if ( ! $this->pdo_results ) {
        $this->pdo_results = $this->result_id->fetchAll(PDO::FETCH_ASSOC);
    }
    return sizeof($this->pdo_results);

然后在第60行更改


function num_fields()
{
    return $this->result_id->columnCount();
}

to:

function num_fields()
{
    if ( is_array($this->pdo_results) ) {
        return sizeof($this->pdo_results[$this->pdo_index]);
    } else {
        return $this->result_id->columnCount();
    }
}

然后在第94行更改:

function field_data()
{
    $data = array();

    try
    {
        for($i = 0; $i < $this->num_fields(); $i++)
        {
            $data[] = $this->result_id->getColumnMeta($i);
        }

        return $data;
    }
    catch (Exception $e)
    {
        if ($this->db->db_debug)
        {
            return $this->db->display_error('db_unsuported_feature');
        }
        return FALSE;
    }
}

to:

function field_data()
{
    if ($this->db->db_debug)
    {
        return $this->db->display_error('db_unsuported_feature');
    }
    return FALSE;
}

然后修改第146行:

return FALSE;

to

$this->pdo_index = $n;

然后在第 159 行修改

function _fetch_assoc()
{
    return $this->result_id->fetch(PDO::FETCH_ASSOC);
}

to

function _fetch_assoc()
{
    if ( is_array($this->pdo_results) ) {
        $i = $this->pdo_index;
        $this->pdo_index++;
        if ( isset($this->pdo_results[$i]))
            return $this->pdo_results[$i];
        return null;
    }
    return $this->result_id->fetch(PDO::FETCH_ASSOC);
}

最后,在第174行更改:

function _fetch_object()
{   
    return $this->result_id->fetchObject();

to

function _fetch_object()
{
    if ( is_array($this->pdo_results) ) {
        $i = $this->pdo_index;
        $this->pdo_index++;
        if ( isset($this->pdo_results[$i])) {
            $back = new stdClass();
            foreach ( $this->pdo_results[$i] as $key => $val ) {
                $back->$key = $val;
            }
            return $back;
        }
        return null;
    }
    return $this->result_id->fetch(PDO::FETCH_OBJ);
}

这对我很有帮助。再次声明,这不是我的作品,所有功劳归于S. Stüvel、J. Bransen和S. Timmer。 虽然答案比较长,但我希望这能有所帮助。

它对我起作用了,但我不得不撤销第一次更改:-“在pdo_driver.php中,从第81行开始更改:” - jimmy

0
我有Codeigniter 2.2.1,当我将application/config/database.php设置成与 OP 相同时,我可以使用sqlite数据库,但是只能部分地。我可以创建新的数据库/文件、创建新的表并插入数据,但问题是我无法读取任何数据。
$query = $this->db->get('table_name');
return $query->result_array();

返回空数组。当我执行时,情况也是如此。

$query = $this->db->query("SELECT...");

显然还存在一些错误。我刚开始探索Codeigniter,但当我切换到mysql时,完全相同的模型按预期工作。

值得一提的是,我的服务器上的所有设置都正常。我可以很好地使用我的sqlite数据库,只有Codeigniter存在问题。


0

CodeIgniter 2.1.0版本中存在一个与PDO驱动程序相关的错误(他们在2.1.0版本中刚刚添加了PDO驱动程序)

您可以查看版本2.1.1变更日志

Change log for CodeIgniter Version 2.1.1

请尝试升级您的CodeIgniter。

我刚刚进行了双重检查,因为我是从Github克隆的,但我已经在2.1.4上了。 - g_uint

0

我在从2.1.3更新到2.2.6后应用了g_m解决方案,和jimmy一样,我不得不删除pdo_driver.php中的第一个更改才能使其正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接