Вниз
Скачать: CL | DM;

PHP + Права доступа   Найти похожие ветки 

 
Undert ©   (2004-04-02 11:03) [0]

Помогите пожалуйста идеями.
Дело такое: есть некое дерево, к каждой ветке которого назначается какой-то доступ. К примеру если назначили доступ к какой-то ветке, то все субветки тоже доступны.

Сейчас данные прав доступа хранятся в виде таблицы:
пользователь ветка

а механизм определения следующий:

task - ветка
task_access_cache - обычный массив

function has_access2task($uid,$task) {
  GLOBAL $task_access_cache;
  if ($task=="") {
    return false;
  } else {
    if ($task_access_cache["$uid,$task,1"]=="1") return true;
    if ($task_access_cache["$uid,$task,1"]=="2") return false;
    $r = mysql_query ("select * from access where uid="$uid" and tid="$task" and depotid="-1"");
    $rn = mysql_numrows ($r);
    if ($rn > 0) {
      $f = mysql_fetch_array($r);
      $task_access_cache["$uid,$task,1"] = 1;
      return true;
    } else {
      $task_access_cache["$uid,$task,1"] = 2;
      return false;
    }; //if
 }; //if
}; //func

function has_access($uid, $tid) {
  GLOBAL $task_access_cache;
  if ($task_access_cache["$uid,$tid"]=="1") return true;
  if ($task_access_cache["$uid,$tid"]=="2") return false;
  $task_access_cache["$uid,$tid"] = 2;
  $r = mysql_query ("select * from tasks where id=$tid");
  $f = mysql_fetch_array ($r);
  if (has_access2task($uid,$tid)) {
    $task_access_cache["$uid,$tid"] = 1;
    return true;
  };
  $parent = $f[parentid];
  while ($parent!=0) {
    $r = mysql_query ("select * from tasks where id=$parent");
    $f = mysql_fetch_array ($r);
    $parent = $f[parentid];
    if (has_access2task($uid,$f[id])) {
      $task_access_cache["$uid,$tid"] = 1;
      return true;
      break;
    };
  }; //while
}; //func


Работает я бы сказал это не совсем быстро. Как можно оптимизировать?


 
Undert ©   (2004-04-02 11:08) [1]

uid - Пользователь
tasks - ветки/подветки


 
Calm ©   (2004-04-02 11:59) [2]

когда назначешь права на ветку, то в таблицу прав пиши сразу и права на подветки. Оно конечно избыточно слега, зато быстро.

У меня в БД дерево примерно из 2000 веток и пользователей порядке 200, средняя глубина дерева 4-7. Все просто летает.

Правда БД - MS SQL Server. Но, думаю, что MySQL тоже не затормозит.


 
Undert ©   (2004-04-05 10:37) [3]


> Calm ©  


Слушай, а как ты проверку производишь ?
Конечно то что ты подсказал - увеличило скорость, но все равно тормозит... :(



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.02 c
1-1081251256
Dimitry
2004-04-06 15:34
2004.04.25
Запрет ввода некоторых символов в Edit


1-1081496582
Михаил__
2004-04-09 11:43
2004.04.25
Stringgrid


8-1073812436
Magician
2004-01-11 12:13
2004.04.25
Как используя компонент TMEDIAPLAYER масштабировать видео


14-1081176951
Digitman
2004-04-05 18:55
2004.04.25
Роль полит.лидеров в становлении/крахе отеч.комп.индустрии


11-1064252059
Revolter
2003-09-22 21:34
2004.04.25
VCL: Application.OnDeactivate := .. ; KOL: ???




   Наверх