【发布时间】:2011-08-15 20:11:02
【问题描述】:
我在 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
}
我遇到的唯一问题是一个极端情况:如果程序员稍后尝试在脚本中再次进行相同的查询,它将继续迭代而不是重新开始。我可以创建某种重置函数,或者使用选择器函数和结果函数,但我希望有一个更优雅的解决方案,其中该函数将“知道”何时不在同一个循环中调用,并且转储结果。另外,为了提高效率,我希望它在完成后转储结果。
有什么想法,或者切换到选择->结果模型真的是解决这个问题的唯一方法吗?
【问题讨论】:
-
传入一个参数说“不使用缓存结果”?
-
if (!isset($_STATIC))有点违背静态变量的目的。你可以跳过这个。