Статические переменные в функции после цикла while - PullRequest
1 голос
/ 16 августа 2011

У меня есть уровень абстракции базы данных в 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
}

Единственная проблема, с которой я столкнулся, это угловой случай: если программист попытается повторить тот же запрос позже в сценарии, он продолжит итерацию, а не начнет снова. Я мог бы создать какую-либо функцию сброса или работать с функцией выбора и функцией результатов, но я надеялся на более элегантное решение, в котором функция «узнает», когда она не вызывается в том же цикле, и сбросить результаты. Кроме того, просто ради эффективности я бы хотел, чтобы результаты выводились по окончании.

Есть какие-нибудь идеи или переход к модели выбора-> результата действительно единственный способ обойти это?

Ответы [ 3 ]

0 голосов
/ 16 августа 2011

Вы можете добавить логический флаг сброса к функции, чтобы указать, должен ли он сбрасываться:

_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]);
}
0 голосов
/ 16 августа 2011

Я знаю, что вы хотели элегантный, но вы могли бы использовать debug_backtrace (), чтобы выяснить, откуда это вызывалось.

0 голосов
/ 16 августа 2011

Статика вообще плохая идея, именно по такой причине.

Просто передайте дополнительный параметр, как ссылку на структуру "состояния", которая обновляется функцией на каждой итерации.

Если вы хотите продвинуться дальше, вы можете поместить функцию в класс, который поддерживает состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...