每当我在我的模型中查询我的数据库(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;
答案 0 :(得分:5)
此修复的信用是与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。 相当长的答案,但我希望这会有所帮助。
答案 1 :(得分:0)
CodeIgniter version 2.1.0
驱动程序PDO
中存在一个错误(他们刚刚在2.1.0版本中添加了PDO驱动程序)
version 2.1.1
请尝试升级CodeIgniter。
答案 2 :(得分: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有问题。
答案 3 :(得分:0)
我在从2.1.3更新到2.2.6之后应用了g_m解决方案,作为jimmy,我不得不删除pdo_driver.php中的第一个更改以使其工作。