我在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
}
我遇到的唯一问题是一个极端情况:如果程序员稍后在脚本中尝试再次进行相同的查询,它将继续迭代而不是重新开始。我可以创建某种重置函数,或者使用选择器函数和结果函数,但我希望有一个更优雅的解决方案,其中函数将“知道”何时不在同一循环中调用它,并且转储结果。另外,为了提高效率,我希望它在完成后转储结果。
任何想法,或者转向选择>结果模型真的是解决这个问题的唯一方法吗?
答案 0 :(得分:0)
静态通常是一个坏主意,正是出于这种原因。
只需传入一个额外的参数,作为对每个迭代函数更新的“状态”结构的引用。
如果你想获得高级,你可以将该函数包装在一个维持状态的类中。
答案 1 :(得分:0)
您可以向函数添加布尔重置标志,以指示是否要重置:
_select_row($in_table, /* snip a bunch of params */, $reset=FALSE)
{
// 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;
////////////////////////////////////////////////////
// If this is a reset, set position to 0
if ($reset) mysql_data_seek($_STATIC[$hash], 0);
////////////////////////////////////////////////////
return mysql_fetch_assoc($_STATIC[$hash]);
}
答案 2 :(得分:0)
我知道你想要优雅,但你可以使用debug_backtrace()来确定调用它的位置。