Если вы используете PHP 5.3.0 и mysqlnd, вы можете использовать новую функцию mysqli_fetch_all()
. Это возвращает массив ассоциативных массивов.
Если вы используете более раннюю версию PHP, вы можете переключиться на использование PDO и использовать функцию PDOStatement::fetchAll()
.
Вы спрашиваете в комментарии, как насчет очень большого набора результатов. Это правда, что неограниченный набор результатов может привести к тому, что массив превысит ваш предел памяти PHP, что приведет к фатальной ошибке и остановит скрипт. Но действительно ли это проблема? Сколько продуктов у вас есть? Вы можете использовать LIMIT
, чтобы убедиться, что запрос не является неограниченным.
Что касается другой части ваших вопросов, касающихся возвращения в класс, я бы предложил создать Итератор класс:
class DB implements IteratorAggregate
{
protected $_data = array();
public function getProductList() {
// fetch all results from SQL query, stuff them into $this->_data
return $this->getIterator();
}
public function getIterator() {
return new ArrayIterator($this->_data);
}
}
Теперь вы можете использовать класс в цикле foreach
:
$db = new DB();
foreach ($db->getProductList() as $product) {
// do something with each product
}
Интерфейс IteratorAggregate
означает, что вы даже можете сделать это:
$db = new DB();
$db->getProductList();
// ...other steps...
foreach ($db as $product) {
// do something with each product
}
Конечно, вы можете хранить только один набор результатов за один раз с помощью этого метода. Если вы тем временем используете свой класс БД для любых других запросов, это усложнит ситуацию. По этой причине большинство людей не пытаются написать отдельный класс для инкапсуляции всех операций базы данных. Они пишут отдельные классы для каждого типа Доменная модель , с которой они должны работать, отделенные от соединения с базой данных.