2017-01-18 5 views
0

В основном я пытаюсь ограничить то, что может видеть пользователь, зарегистрированный в системе, в зависимости от того, каков его рейтинг. Содержимое - несколько строк, все с разными требованиями к рангам. Если у пользователя нет требуемого ранга, он не сможет просмотреть эту строку. Однако моя проблема заключается в том, что если одна строка имеет более высокий ранг, чем любые строки ниже нее, и у пользователя нет этого ранга, все строки ниже также не будут видны.Ограничить содержание по рангу пользователей

public function Categories() { 
    global $Template, $CatArray; 

    $CatArray = array(); 
    $PermissionTable = array(); 

    $QueryCat = $this->mysqli->query("SELECT * FROM categories ORDER BY id ASC"); 

    while($FetchCat = $QueryCat->fetch_array()) { 
     $PermissionTable["category"] = array("id" => $FetchCat["id"]); // store category ID as an id sub-array 
     $data = explode(",", $FetchCat["ranks"]); // the ranks row in the database contains all ranks that can see this category, so here we split them up. 
     foreach($data as $number) { 
      $PermissionTable["category"] += array(
       "rank" => $data // apply rank requirements in a sub-array again 
      ); 
     } 

     if(in_array($Template["user"]["user_group"], $PermissionTable["category"]["rank"])) { // here, if the users rank is in the rank sub-array, they will be able to see it 
      $CatArray[] = $FetchCat; 
     } else { // otherwise display nothing 
      $CatArray[] = null; 
     } 
    } 

    $Template["CatArray"] = $CatArray; 
    return $CatArray; 
} 

UPDATE: Это то, что я имею в виду enter image description here

+0

Можете ли вы не просто добавьте текущий ранг пользователя к запросу, например 'WHERE rowRank <= userRank' – RiggsFolly

+0

Нет, потому что таблица рангов выглядит как 1,2,3,4,5 и т. д., поэтому я не могу использовать <= opreator (его ограничение не ограничивается минимальным ранг, но какие ранги он написал в таблице) –

+0

Пожалуйста, покажите нам свою структуру базы данных и реальный пример того, что вам нужно сделать. Например, пользователь X имеет 1,4,8 разряда, ему нужно видеть категории a, b и c. –

ответ

1

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

public function Categories() { 
    global $Template, $CatArray; 

    $CatArray = array(); 
    $PermissionTable = array(); 

    $QueryCat = $this->mysqli->query("SELECT * FROM categories ORDER BY id ASC"); 

    while($FetchCat = $QueryCat->fetch_array()) { 
     $categoryRanks = explode(",", $FetchCat["ranks"]); // the ranks row in the database contains all ranks that can see this category, so here we split them up. 

     $userCategoriesPermitted = in_array($Template["user"]["user_group"], $categoryRanks); //here we check if user rank is inside category rank 

     if($userCategoriesPermitted) { 
      $CatArray[] = $FetchCat; //add to return array 
     } 
    } 

    $Template["CatArray"] = $CatArray; 
    return $CatArray; 
} 

Но это только отразится на плохом дизайне базы данных, который не соответствует First Normal Form

+0

Это, кажется, показывает мне категории, даже если у меня нет необходимого ранга. –

+0

Моя вина. Замените эту строку 'if (count)' на новую. –

+0

Отлично, спасибо. Я обязательно буду учитывать эту статью. –

Смежные вопросы