Как расширить mysqli_result и добавить новый метод

Mysqli_result класс имеет fetch_all() метод, возвращающий сразу несколько строк из результирующего набора в виде массива строк (фактически это 2-мерный массив, потому что строки уже являются массивами полей). Также в наборе результатов есть метод fetch_object() возвращая одну строку в виде объекта.

Теперь я хотел бы расширить класс mysqli_result и добавить новый метод fetch_objects() (множественное число), которое возвращает ассоциативный массив объектов, где ключом ассоциации является идентификатор записи [id => Object ()]. Конечно, мне нужно будет расширить класс mysqli и переопределить его метод query (), чтобы вернуть мой расширенный набор результатов. Но я не понимаю, как происходит передача параметра соединения и запроса между mysqli и возвращенным mysqli_result.

Это должно работать так:

$db=new ReallyMySQLi(...); //initiating my mysqli

$myrst=$db->query($SQL); //returned my extended result

//fetch_objects() returning associative array of objects
//with record ID as associative key
foreach($myrst->fetch_objects() as $id=>$object)
{
echo 'Customer ID:'.$id; //or $object->id;
echo 'Customer firstname:'.$object->firstname;
echo 'Customer lastname:'.$object->lastname;
}

0

Решение

Я нашел это в руководстве по PHP mysqli_result и возился немного. Я не пытался все же.

class Database_MySQLi extends MySQLi
{
public function query($query)
{
$this->real_query($query);
return new Database_MySQLi_Result($this);
}
}

class Database_MySQLi_Result extends MySQLi_Result
{
public function fetch_objects()
{
$rows = array();
while($row = $this->fetch_object())
{
$rows[$row->id] = $row;
}
return $rows;
}
}

И использование будет

$db=new Database_MySQLi(...); //initiating my mysqli

$myrst=$db->query($SQL); //returned my extended result

//fetch_objects() returning associative array of objects
//with record ID as associative key
foreach($myrst->fetch_objects() as $id=>$object)
{
echo 'Customer ID:'.$id; //or $object->id;
echo 'Customer firstname:'.$object->firstname;
echo 'Customer lastname:'.$object->lastname;
}
1

Другие решения

Извините, я никогда не использую mysqli в качестве драйвера mysql два года. Но я делаю эту рекомендацию для вас.

Вы можете выбрать PDO, PDO — это круто, как драйвер базы данных для нескольких компьютеров.

Подобно красноречивому доктрине, обе доктрины используют PDO в качестве основы.

$pdo = new PDO('sqlite:db.sqlite');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Удачи!

-1

По вопросам рекламы [email protected]