Я использую свой собственный класс для запросов к базе данных, расширяя mysqli:
class iDatabase extends mysqli { public $errorMsg; private $totalQueries; private $stmt; public function __construct() { parent::__construct( 'localhost', 'asd', 'asd', 'asd' ); if ( mysqli_connect_errno() ) { $this->errorMsg = 'Could not connect to server.<br /><i>' . mysqli_connect_error() . '</i>.'; return; } parent::query( 'SET NAMES utf8' ); } }
Однако у меня возникают проблемы при выполнении запросов и возвращении результатов. Я использую подготовленные заявления, но способ привязки значений и результатов меня смущает. После небольшого исследования я придумал эту функцию, которая принимает запрос и параметры:
public function psQuery( $query, $params ) { $this->stmt = parent::prepare( $query ); call_user_func_array( array($this->stmt,'bind_param'), $params ); $this->stmt->execute(); }
Мой вопрос: какой лучший способ получить результаты от этого? Мне нужно использовать bind_result, затем извлечь каждую строку, а затем закрыть инструкцию. Я бы предпочел просто получить ассоциативный массив для каждой строки – возможно ли это?
Я немного поработал над классами Zend_Db_Adapter_Mysqli
и Zend_Db_Statement_Mysqli
чтобы заставить это работать, поскольку мы хотели, чтобы он соответствовал интерфейсу PDO
и PDOStatement
. Это было довольно сложно, из-за запутанного способа MySQLi настаивает на том, чтобы вы связывали переменные, чтобы получать результаты, и разнообразие режимов выборки, поддерживаемых PDOStatement
.
Если вы хотите увидеть код в Zend_Db
, обратите особое внимание на функции Zend_Db_Statement_Mysqli::_execute()
и fetch()
. В принципе метод _execute()
связывает массив ссылок переменных с помощью call_user_func_array()
. Сложная часть состоит в том, что вы должны инициализировать массив, чтобы bind_result()
ссылки. Э, это было не совсем понятно, поэтому взгляните на код.
Или просто используйте драйвер MySQL PDO. Это то, что я сделал бы на твоих ботинках.
Я бы посмотрел на реализацию Zend_Db , в частности на адаптер mysqli , чтобы посмотреть, как они это делают.
Кажется, что вам нужно сделать то, что вы сказали: «Мне нужно использовать bind_result, затем забрать каждую строку, а затем закрыть оператор»
Я думаю, что нет более простого способа.