[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: CodeIgniter интересные методы.
m4a1fox
Всем доброго времени суток. Стало интересно... в CodeIgniter для того что бы выбрать все поля используется вот такая конструкция

function getAll(){
$sql = $this->db->query("SELECT * FROM `user`");
return $sql->result();
}


и хоп. и у нас есть массив со всеми полями...
Дело в том, что метод result() в PDO - не определен...
Стало интересно, как они его туда добавили... дабы приблизится к их действиям сделал так

function getAll(){
$sql = $this->db->query("SELECT * FROM `user`");
return $this->db->selectAll($sql);
}


А метод selectAll находится в файле подключения к БД, и выглядит тривиально

public function selectAll($sql){
while($res = $sql->fetch(PDO::FETCH_ASSOC)){
$data[] = $res;
}
return $data;
}


Может кто подскажет более просто решение. Вроде как-то можно добавить методы в стандартный/встроенный класс PDO...

И еще, вспомнилось... может тут помогут волшебные методы?



Спустя 1 час, 16 минут, 26 секунд (16.03.2012 - 20:02) T1grOK написал(а):
Цитата (m4a1fox @ 16.03.2012 - 15:45)
и хоп. и у нас есть массив со всеми полями...
Дело в том, что метод result() в PDO - не определен...
Стало интересно, как они его туда добавили...

Внимательно смотрим в классы.
Файл инициализации DB подключаются и создаются нужные объекты

eval('class CI_DB extends CI_DB_driver { }');

Смотрим дальше

require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);
// Instantiate the DB adapter
$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
$DB =& instantiate_class(new $driver($params));

Создается экземпляр класса драйвера.
Ищем драйвер скажем Mysql

class CI_DB_mysql_driver extends CI_DB {

Драйвер наследует CI_DB, a CI_DB наследует CI_DB_driver.
Идем в CI_DB_driver. Опа находим метод

function load_rdriver()
{
$driver = 'CI_DB_'.$this->dbdriver.'_result';

if ( ! class_exists($driver))
{
include_once(BASEPATH.'database/DB_result'.EXT);
include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);
}

return $driver;
}

Подключаются и далее используется DB_result. Идем в DB_result и видим наш метод result().

function result($type = 'object')
{
return ($type == 'object') ? $this->result_object() : $this->result_array();
}

Смотрим метод result_array()

function result_array()
{
if (count($this->result_array) > 0)
{
return $this->result_array;
}

// In the event that query caching is on the result_id variable
// will return FALSE since there isn't a valid SQL resource so
// we'll simply return an empty array.

if ($this->result_id === FALSE OR $this->num_rows() == 0)
{
return array();
}

$this->_data_seek(0);
while ($row = $this->_fetch_assoc())
{
$this->result_array[] = $row;
}

return $this->result_array;
}

Может что то упустил. Но суть одна, ничего нигде не появляется.

Спустя 1 час, 45 минут, 54 секунды (16.03.2012 - 21:47) m4a1fox написал(а):
T1grOK
ВОт оно че Михалыч...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.