У меня есть уровень абстракции базы данных в CMS, и одна из функций - это оболочка mysql_fetch_assoc, которая включает в себя логику соединения, запроса и результата в одном.
_select_row($in_table, $in_what = '*', $in_where = '',
$in_arr_params = array(), $in_flags)
{
// Generates a unique enough name based on query contents.
$hash = md5($in_table.$in_what.implode((array)$in_arr_params).$in_flags);
if (!isset($_STATIC))
{
static $_STATIC = array();
}
if (isset($_STATIC[$hash])
{
return mysql_fetch_assoc($_STATIC[$hash]);
}
// *snip* SQL logic here, connect -> query -> result *snip*
$_STATIC[$hash] = $result;
return mysql_fetch_assoc($_STATIC[$hash]);
}
Он поддерживает статическую переменную, поэтому при использовании в циклах он может повторяться как стандартный вызов fetch_assoc.
while (_select_row('mytable')) // Loops all rows
{
// Do Stuff
}
Единственная проблема, с которой я столкнулся, это угловой случай: если программист попытается повторить тот же запрос позже в сценарии, он продолжит итерацию, а не начнет снова. Я мог бы создать какую-либо функцию сброса или работать с функцией выбора и функцией результатов, но я надеялся на более элегантное решение, в котором функция «узнает», когда она не вызывается в том же цикле, и сбросить результаты. Кроме того, просто ради эффективности я бы хотел, чтобы результаты выводились по окончании.
Есть какие-нибудь идеи или переход к модели выбора-> результата действительно единственный способ обойти это?