Защита страницы не работает правильно для страницы администратора

Я опубликовал аналогичный пост этого с другим кодом, но немного изменил его и не получил ответов, на которые я надеялся (ответы мне не очень помогли). Надеюсь, это хорошо, скажите, если это не так. 🙂

Я пытаюсь сделать защиту страницы для страницы администратора, и я не могу заставить ее работать. Я уверен, что это не было бы проблемой, если бы я не был новичком в PHP-кодировании, хе-хе.

Когда обычный пользователь с типом «0» пытается получить доступ к странице администратора, index_admin.php , пользователь будет перенаправлен на обычную страницу пользователя, index.php . И если у пользователя есть тип «1», пользователь / администратор останется на странице.

Вот код, который я пытался получить. (Этот файл требуется в index_admin.php, и он называется index_admin_check.php ).

index_admin_check.php :

<?php session_start(); ?> <?php $vert = "localhost"; $brukarnamn = "root"; $passord = ""; $db_namn = "nettsidebunad"; $tbl_namn = "kunde_register"; // Connection to the MySQL database. mysql_connect("$vert", "$brukarnamn", "$passord") or die ("Kan dessverre ikkje koble til databasen."); mysql_select_db("$db_namn") or die ("Kan ikkje finna den ynkjande databasen."); ?> <?php if (isset($_SESSION['mittbrukarnamn'])) { $sql1 = "SELECT `type` FROM $tbl_namn"; $rad1 = mysql_query($sql1); $type1 = mysql_fetch_row($rad1); if ($type1 == 0) { echo "You do not have access to this page."; //header("location: index.php"); } else { echo "You have access to this page."; } } ?> 

Часть этого текста находится на норвежском языке.

$ vert = $ host (на английском языке)

$ brukarnamn = $ usernamn (на английском)

$ passord = $ password (на английском)

$ db_ namn = $ db_name (на английском языке)

$ tbl_ namn = $ tbl_name (на английском языке)

$ _SESSION [ 'mittbrukarnamn' ] = $ _SESSION ['myusername'] (на английском языке)

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

Вам необходимо проверить тип пользователя, который в настоящий момент зарегистрирован

 $sql1 = "SELECT `type` FROM $tbl_namn WHERE <user_name> = '$_SESSION[mittbrukarnamn]'"; 

Другое предложение было бы не использовать MYSQL, а MYSQLi или PDO для операций с базой данных, так как MYSQL больше не поддерживается PHP и полностью устареет в PHP 5.5.0. Некоторые из функций MYSQL уже устарели.

Изменить: В коде есть еще одна проблема. mysql_fetch_row возвращает массив, поэтому вам нужно будет получить значение из вашего массива.

 if($type1['type'] == 0) 

вместо

 if($type1 == 0) 

Как мне кажется, сегодня много ответов, у меня есть панель администратора на github, которая, кажется, отвечает на множество распространенных вопросов о входах php. В вашем случае вы просто хотите получить type из своей базы данных и использовать это. Обратите внимание, что вы должны предоставить инструкцию WHERE в своем SQL, иначе у вас не будет информации этого пользователя. У вас будет каждая часть этого стола .

Ниже приводятся подготовленные запросы . mysql_* устарели (больше не поддерживаются, см. этот вопрос SO )

 function get_user_array() { /* Does all of the heavy lifting for getting user stats. */ $db = new db(); // where db() is an abstraction class that implements mysqli and adds login details. if (isset($_SESSION["id"])) { $sid = $_SESSION["id"]; if ($query = $db->prepare("SELECT id, name, status FROM `users` WHERE id=?")) { $query->bind_param("i", $sid); // i = integer $query->execute(); $query->bind_result($id, $name, $status); $query->fetch(); $query->close(); $db->close(); return array("name" => $name, "status" => $status, "id" => $id); } else { return false; } } else { return false; } } 

Мое предложение – также использовать идентификатор пользователя и найти все из базы данных. Таким образом, если их имя пользователя изменится, весь сайт не взорвется при загрузке страницы.


Фактическое сравнение было бы:

 $user = get_user_array(); if (@$user["type"] != 'admin') { // @ error-handling will make it NULL anyway. header("Location: index.php"); // note: this must be sent BEFORE any output! } 

И быстрое сравнение, чтобы проверить, зарегистрирован ли обычный пользователь (например if logged_in() ):

 $user = get_user_array(); if (!@$user["id"]) { // continue only if logged in // not logged in handle } 

Примечание: db() – этот класс (отлично переопределить публичные функции mysqli для сокращения кода в конечном счете при условии, что вы вызываете родителя):

 class db extends mysqli { public function __construct($a = DB_HOST, $b = DB_USER, $c = DB_PASS, $d = DB_NAME, $persistent = true) { if ($persistent) { parent::__construct("p:" . $a, $b, $c, $d); } else { parent::__construct($a, $b, $c, $d); } } }