【问题标题】:CodeIgniter Sqlite not workingCodeIgniter Sqlite 不工作
【发布时间】:2014-05-21 10:21:15
【问题描述】:

每当我在我的模型中像这样查询我的数据库(sqlite)时(我使用 codeigniter,下面的完整代码):

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

我收到以下错误:

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 db,根据 phpinfo 由网络服务器支持。 有人知道我在哪里犯了错误吗?

-------- 完整代码: 我在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;

【问题讨论】:

  • 请提供完整代码。
  • ok 添加所有相关代码
  • 你使用的是最新的 CodeIgniter 吗?
  • 是的,我从 github 克隆了 2.1 稳定版
  • database.php,尝试将dbdriver从pdo更改为sqlite

标签: php sql codeigniter sqlite


【解决方案1】:

此修复的功劳归于 S. Stüvel、J. Bransen 和 S. Timmer。这是针对特定服务器的修复程序,因此是 YMMV。不过它对我有用。

在 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
}

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;

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

到:

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;
    }
}

到:

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

然后第 146 行更改:

return FALSE;

$this->pdo_index = $n;

然后在第 159 行更改

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

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

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 行更改:'
【解决方案2】:

CodeIgniter version 2.1.0 中有一个针对 PDO 驱动程序的错误(他们刚刚在 2.1.0 版本中添加了 PDO 驱动程序)

你可以看到change logversion 2.1.1

请尝试升级您的 CodeIgniter。

【讨论】:

  • 我刚刚仔细检查了,因为我是从 github 克隆的,但我已经在 2.1.4 上
【解决方案3】:

我有 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 有问题。

【讨论】:

    【解决方案4】:

    我在从 2.1.3 更新到 2.2.6 后应用了 g_m 解决方案,作为 jimmy,我必须删除 pdo_driver.php 中的第一个更改以使其工作。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2014-04-15
      • 2012-12-02
      • 1970-01-01
      • 2018-06-16
      • 2016-03-01
      • 1970-01-01
      • 2012-04-29
      • 2013-05-09
      相关资源
      最近更新 更多