Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: 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 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.026 c
14-1080807209
Zaika
2004-04-01 12:13
2004.04.25
STALKER


14-1081178734
Тимур
2004-04-05 19:25
2004.04.25
Flash игры


3-1080199169
DmitryNekl
2004-03-25 10:19
2004.04.25
Тоже фильтрация, но другая


9-1067788347
DillerXX
2003-11-02 18:52
2004.04.25
Дерево


14-1081163956
syte_ser78
2004-04-05 15:19
2004.04.25
Вопрос по Olympus D-380