Всякий раз, когда я запрашиваю свою базу данных (sqlite), как это, в моей модели (im using 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(); } }
Мой контроллер в контроллере / 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;
Кредиты для этого исправления принадлежат С. Штювелю, Дж. Брансену и С. Тиммеру. Это исправление для определенного сервера, поэтому 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); }
Это сработало для меня. Опять же, не моя работа, кредит распространяется на С. Штювеля, Дж. Брансена и С. Тиммера. Скорее длинный ответ, но я надеюсь, что это поможет.
В CodeIgniter version 2.1.0
есть ошибка для драйверов PDO
(они только что добавили драйвер PDO в версии 2.1.0)
Вы можете просмотреть журнал изменений для version 2.1.1
Попробуйте обновить CodeIgniter.
У меня 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, у которого есть проблемы.
Я применил решение g_m после обновления с 2.1.3 до 2.2.6, и как jimmy мне пришлось удалить первое изменение в pdo_driver.php, чтобы оно работало.