Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.034 c
6-1077706813
pomashok
2004-02-25 14:00
2004.04.25
Сетевое приложение


3-1080233227
Avenger[NhT]
2004-03-25 19:47
2004.04.25
Коннект к базе через ODBC драйвер


7-1078082494
JIruaasgyy
2004-02-29 22:21
2004.04.25
Какой функцией можно получить системную директорию Windows?


14-1080635255
able
2004-03-30 12:27
2004.04.25
WIndows 2003 server


8-1074160766
booblik
2004-01-15 12:59
2004.04.25
Как узнать что курсор внутри изображения кривой формы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский