php – CodeIgniter Sqlite无法正常工作

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – CodeIgniter Sqlite无法正常工作脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
每当我在我的模型中查询我的数据库(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网络服务器支持它.
有人在我犯错的地方有线索吗?

——–完整代码
我的模型/ 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;

解决方法

这个修复的功劳是与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.相当长的答案,但我希望这会有所帮助.

脚本宝典总结

以上是脚本宝典为你收集整理的php – CodeIgniter Sqlite无法正常工作全部内容,希望文章能够帮你解决php – CodeIgniter Sqlite无法正常工作所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。