За последние 24 часа нас посетили 56411 программистов и 1683 робота. Сейчас ищут 1311 программистов ...

Доступ к меню

Тема в разделе "Прочие вопросы по PHP", создана пользователем Intrerio, 17 мар 2016.

  1. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Здравствуйте. Сегодня голова не варит вообще и не могу построить праивльное решение.
    Написал движок для управления одним предприятием и конечным пунктом стоит меню для доступа к разделам. Создал в админ-панели раздел меню где можно добавлять новый ссылки и категории меню. В системе есть группы пользователей с определенными правмаи доступа которые добавляет админ. Соответственно админ должен открывать или закрывать отображение ссылок на разделы. С чувством легкости начал писать код и уперся в логическое непонимание.
    Имеется таблица в БД с группами пользователей:
    Админ
    Пользователь
    Менеджер
    Клиент и т.д.

    Структура таблицы:
    id login pass menu links
    Первые три поля понятны, а на счет меню и линкс сейчас поясню.
    На сайте реализовано выпадающее меню. Тоесть админ может открыть только линк и тогда он просто отобразится в меню или открыть линк с категорией, тогда линк отобразится в выпадающем меню. ну это нюансы стилизации и они сейчас нас не интерисуют.
    Едем дальше.
    В таблицу menu записуются айди категории, а в links айди ссылки черз запятую:
    1,3,9,12 и т.д.
    Далее идет проверка на in_array с использованием разбивки массива через explode и собственно выходит проверка на доступ. Опять же ж таки это чисто для информации.
    Теперь самое главное.
    Пришло время открыть или наоборот закрыть доступ к ссылке или категории.
    Сделал вот такой код и сразуже понял что фигня получается. Сейчас поясню:
    Код (PHP):
    1. <span class="syntaxhtml"><br />$grupa="7";&nbsp;//номер&nbsp;реальной&nbsp;группы&nbsp;чисто&nbsp;для&nbsp;теста<br />$sel_a=mysql_query("SELECT&nbsp;*&nbsp;FROM&nbsp;`user_group`&nbsp;WHERE&nbsp;id='".$grupa."'");<br />$res_a=mysql_fetch_array($sel_a);<br />$massiv&nbsp;=&nbsp;explode(",",$res_a['links']);&nbsp;<br />?><br /><table><br /><span class="syntaxdefault"><?php<br />$sel</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SELECT&nbsp;*&nbsp;FROM&nbsp;`menu_links`&nbsp;ORDER&nbsp;BY&nbsp;menu&nbsp;ASC"</span><span class="syntaxkeyword">);<br />while(</span><span class="syntaxdefault">$res</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_fetch_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$sel</span><span class="syntaxkeyword">)){&nbsp;</span><span class="syntaxcomment">//вот&nbsp;тот&nbsp;самый&nbsp;цикл&nbsp;который&nbsp;отображает&nbsp;все&nbsp;ссылки<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$sel_l</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SELECT&nbsp;*&nbsp;FROM&nbsp;`menu`&nbsp;WHERE&nbsp;id='"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$res</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'menu'</span><span class="syntaxkeyword">].</span><span class="syntaxstring">"'"</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$res_l</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_fetch_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$sel_l</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">?><br /></span><tr><td><span class="syntaxdefault"><?=$res</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'nazva'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">?></span></td><td><span class="syntaxdefault"><?=$res_l</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'nazva'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">?></span></td><td><br /><span class="syntaxdefault"><?php<br /></span><span class="syntaxkeyword">foreach&nbsp;(&nbsp;</span><span class="syntaxdefault">$massiv&nbsp;</span><span class="syntaxkeyword">as&nbsp;</span><span class="syntaxdefault">$val&nbsp;</span><span class="syntaxkeyword">)&nbsp;{&nbsp;</span><span class="syntaxcomment">//а&nbsp;вот&nbsp;этот&nbsp;цикл&nbsp;отображает&nbsp;доступна&nbsp;ли&nbsp;ссылка<br />&nbsp;</span><span class="syntaxkeyword">if(</span><span class="syntaxdefault">$val</span><span class="syntaxkeyword">==</span><span class="syntaxdefault">$res</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'id'</span><span class="syntaxkeyword">]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxstring">"есть&nbsp;доступ"</span><span class="syntaxkeyword">;<br />&nbsp;}<br />}<br /></span><span class="syntaxdefault">?><br /></span>&nbsp;</td><td>&nbsp;<a&nbsp;href="open.php?on&id=<span class="syntaxdefault"><?=$res</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'id'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">?></span>&grupa=<span class="syntaxdefault"><?=$grupa?></span>"&nbsp;>Включить</a>&nbsp;</td><td>&nbsp;<a&nbsp;href="open.php?off&id=<span class="syntaxdefault"><?=$res</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'id'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault">?></span>&grupa=<span class="syntaxdefault"><?=$grupa?></span>">Отключить</a></td></tr><br /><span class="syntaxdefault"><?php&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">?><br /></span></table><br /></span>
    Я б в идеале хотел сделать чтоб ссылка включить/выключить была динамичной, тоесть если выключена ссылка то отображалось "Включить" если нет то наоборот но в том виде в котором представлен код если добавить else ито мне выбивает "Выключить" кучу раз. Ну тут все понятно, система бежит по всему цыклу и условие подходит для всех значений.
    Собственно это первое чтоб хотелось исправить - создать динамическую ссылку вкл/выкл

    И теперь второе:
    Если я нажимаю вкл то каким образом добавить айди этой ссылки в БД, именно в тот массив который уже есть (через запятую) и самое главное проверить на существование этого айди уже в системе

    И третье (впринцыпе может логически связано со вторым):
    Как удалить айди ссылки из массива в БД если я нажму Выкл.

    Буду благодарен как за логические советы так и за примеры. Спасибо
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ммм

    кароче
    у тебя проблемы, потому что твои массивы невкусно приготовлены.

    их нужно приготовить так, чтобы проверка на вот это дело
    Код (PHP):
    1. foreach ( $massiv as $val ) { //а вот этот цикл отображает доступна ли ссылка
    2.  if($val==$res['id']){
    3.      echo "есть доступ";
    4.  }
    5. } 
    свелась к isset($massiv[$res['id']) тогда многое у тебя в голове встанет на свои места.

    Для этого нужно сначала приготовить массивы, а только потом отрисовывать.
     
  3. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Ок, сейчас попробую переделать. Кстати последний твой совет по поводу аякса привел меня к успеху.Спасибо. отпишусь по факту

    Добавлено спустя 10 минут 26 секунд:
    Крассава))).
    Первое требование я уже сделал)).
    Начал искать варианты с массивами и нашол решение. По первому пункту спасибо. Перехожу ко второму

    Добавлено спустя 3 минуты 29 секунд:
    Со вторым пунктом планирую сделать так:
    1)Вытягиваю с БД массив
    2)Проверяю, есть ли айди ссылки в массиве
    3)Если есть тогда сорри, если нет тогда добавляю к массиву еще одно значение обновляю БД с новым массивом
    Как такой вариант?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в принципе ты можешь выбирать из бд только те ссылки, которые нужны или наоборот

    WHERE `field` IN (2, 4, 7)

    WHERE `field` NOT IN (2, 4, 7)
     
  5. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    О вот это что то новенькое. Век живи век учись)). Тоесть в запрос к БД добавляю выше упомянутое и система сама прошестрит поле links на присутствие в нем соответствующего айди?
    Уже второе требование реализовал. Осталось последнее.

    Добавлено спустя 31 минуту 5 секунд:
    Реализовал третий пункт с помощю array_search и unset . Ищу нужное значение и удаляю его из массива. Потом через implode добавляю в БД. Ну вот как бы так.
    А теперь полет мысли донес меня до следующих размышлений. Хорошо было бы сделать так чтоб когда активируешь или деактивируешь ссылку то сразу же активировалась или деактивировалась категория меню. Тоесть добавили новое айди в links, прошла проверка на категорию и сразу же добавилась айди категории в поле menu. Что посоветуете?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну это в принципе и есть то, ради чего бд и существует - чтобы выбирать выборки в которых будет только нужное.

    нифига не понял. расскажи подробнее. можно иначе точно.

    ка добавили?
     
  7. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Код (PHP):
    1. <span class="syntaxdefault">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />$key&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">array_search</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'id'</span><span class="syntaxkeyword">],&nbsp;</span><span class="syntaxdefault">$all</span><span class="syntaxkeyword">);&nbsp;</span><span class="syntaxcomment">//ищем&nbsp;нужное&nbsp;нам&nbsp;значение&nbsp;в&nbsp;массиве<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">if&nbsp;(</span><span class="syntaxdefault">$key&nbsp;</span><span class="syntaxkeyword">!==&nbsp;</span><span class="syntaxdefault">false</span><span class="syntaxkeyword">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span class="syntaxdefault">$all</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">]);</span><span class="syntaxcomment">//удаляем&nbsp;его&nbsp;из&nbsp;массива<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxkeyword">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$last&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">implode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">","</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$all</span><span class="syntaxkeyword">);</span><span class="syntaxcomment">//забиваем&nbsp;новый&nbsp;массив&nbsp;в&nbsp;переменную&nbsp;так&nbsp;чтоб&nbsp;наши&nbsp;значения&nbsp;были&nbsp;читабельны&nbsp;для&nbsp;БД<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$off</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"UPDATE&nbsp;`user_group`&nbsp;SET&nbsp;links='"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$last</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"'&nbsp;WHERE&nbsp;id='"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'grupa'</span><span class="syntaxkeyword">].</span><span class="syntaxstring">"'"</span><span class="syntaxkeyword">);<br />&nbsp;</span><span class="syntaxdefault"></span>
    На счет того чтоб открывать сразу меню то просто добавил еще проверку на отношение ссылки к меню и по аналогии со ссылками. Конешно что можно проще, даже с твоим советом уже будет проще. Просто у меня презентация в четверг и должен сделать чтоб работало, а грамотный код буду адаптировать во время работы
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если ты сделаешь массив, в котором ключами являются id, то достаточно будет isset()

    $all[$row['id']] = $row;

    я честно говоря не очень понимаю, что именно ты делаешь, и зачем ты что-то удаляешь, если ты можешь прямо из бд взять только то, что тебе нужно и не брать то, что не нужно.