Я пытаюсь написать простой, тонкий и эффективный слой абстракции базы данных поверх библиотек PHP MySQLi (процедурный) и MSSQL, который будет использоваться следующим образом ...
while ($a = db::go('db_name')->query('select * from foo')->row()) {
print_r($a);
}
У меня написан класс, но я несколько пытаюсь понять, как лучше всего просмотреть результаты. Класс должен будет обрабатывать только запросы на выборку и обрабатывать несколько больших наборов результатов. Вот фрагмент метода ->row()
...
public function row() {
return $this->{'get'.ucwords($this->details['type']).'Row'}();
}
private function getMysqliRow() {
return @mysqli_fetch_assoc($this->result);
}
private function getMssqlRow() {
return @mssql_fetch_assoc($this->result);
}
В данный момент вызов приводит к бесконечному циклу и извлекает одну и ту же строку каждый раз, потому что внутренний указатель в наборе результатов не увеличивается так же, как вызов while ($a = mssql_data_seek($result))
, что завершает смысл (набор результатов не является глобальным, вы должны иметь возможность обрабатывать более одного набора результатов одновременно!).
Так, кто-нибудь знает элегантный и эффективный способ обойти это? Или единственное решение использовать функции поиска данных ( mysqli_data_seek () и mssql_data_seek () ) и удерживать указатель на текущую позицию в наборе результатов? Если да, насколько это эффективно (я буду обрабатывать большие наборы результатов> 250000)? И как обработчик цикла while достигнет конца набора результатов?