Я опубликовал аналогичный пост этого с другим кодом, но немного изменил его и не получил ответов, на которые я надеялся (ответы мне не очень помогли). Надеюсь, это хорошо, скажите, если это не так. 🙂
Я пытаюсь сделать защиту страницы для страницы администратора, и я не могу заставить ее работать. Я уверен, что это не было бы проблемой, если бы я не был новичком в 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); } } }