Я новичок в PHP и борюсь со следующим:
У меня есть страница, где я хочу проверить, зарегистрирован ли пользователь, прежде чем позволить им увидеть содержимое сайта. Поэтому я думал, что в моем заголовочном файле (который упоминается на всех отдельных страницах через require_once("includes/header.php");
) Я могу проверить это и перенаправить их на страницу входа ( login.php
), если они есть еще не зарегистрирован.
Итак, вот все, что у меня есть в моем заголовке:
<!DOCTYPE html> <html> <head> <?php define("someUnguessableVariable", "anotherUnguessableVariable"); session_start(); if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){ header ("Location: login.php"); } include "system/config.php"; $pageURL = basename($_SERVER["REQUEST_URI"]); $pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME); $selectedLang = $_GET["lang"]; if(!isset($selectedLang)){ $selectedLang = "de"; } $langURL = "?lang=" . $selectedLang; $conn = new mysqli($dbServer, $dbUser, $dbPass, $dbName); $conn->set_charset("utf8"); if($conn->connect_error){ die("Connection failed: " . $conn->connect_error); } // fetch main translations $location = "%main%"; $stmt = $conn->prepare("SELECT tID, " . $selectedLang . " FROM TranslationsMain WHERE location LIKE ? ORDER BY tID"); $stmt->bind_param("s", $location); $stmt->execute(); $result = $stmt->get_result(); while($arrTranslations = $result->fetch_assoc()){ $trans[] = array("ID" => $arrTranslations["tID"], "trans" => $arrTranslations[$selectedLang]); } $conn->close(); // get main translations by ID function fetchTransMain($trans, $itemID){ foreach($trans as $key => $val){ if($val["ID"] == $itemID){ return $val["trans"]; } } } ?> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="author" content="Some author" /> <meta name="description" content="Created: 2015-06" /> <base href="http://www.myurl.de" target="_self" /> <title>Some title</title> <!-- CSS --> <link rel="stylesheet" type="text/css" href="includes/styles.css" /> <!-- CSS - Font Awesome --> <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" /> <!-- include favicon --> <link rel="shortcut icon" href="images/favicon/favicon.ico" type="image/x-icon" /> <link rel="icon" href="images/favicon/favicon.png" type="image/png" /> <link rel="icon" sizes="32x32" href="images/favicon/favicon-32.png" type="image/png" /> <link rel="icon" sizes="64x64" href="images/favicon/favicon-64.png" type="image/png" /> <link rel="icon" sizes="96x96" href="images/favicon/favicon-96.png" type="image/png" /> <link rel="icon" sizes="196x196" href="images/favicon/favicon-196.png" type="image/png" /> <link rel="apple-touch-icon" sizes="152x152" href="images/favicon/apple-touch-icon.png" /> <link rel="apple-touch-icon" sizes="60x60" href="images/favicon/apple-touch-icon-60x60.png" /> <link rel="apple-touch-icon" sizes="76x76" href="images/favicon/apple-touch-icon-76x76.png" /> <link rel="apple-touch-icon" sizes="114x114" href="images/favicon/apple-touch-icon-114x114.png" /> <link rel="apple-touch-icon" sizes="120x120" href="images/favicon/apple-touch-icon-120x120.png" /> <link rel="apple-touch-icon" sizes="144x144" href="images/favicon/apple-touch-icon-144x144.png" /> <meta name="msapplication-TileImage" content="favicon-144.png" /> <meta name="msapplication-TileColor" content="#ffffff" /> <script> var baseURL = '<?php echo $baseURL; ?>'; var pageURL = '<?php echo $pageURL; ?>'; var pageName = '<?php echo $pageName; ?>'; var selectedLang = '<?php echo $selectedLang; ?>'; </script> </head> <body>
Теперь это не работает, и я думаю, что, вероятно, я пропустил пару вещей, но я не смог найти хороший учебник или руководство по этому вопросу. Кроме того, я не уверен, есть ли что-то еще, что мне нужно сделать, чтобы начать и настроить сеанс.
Может кто-то помочь мне с этим ?
Заметка:
Это касается только проверки того, что пользователь уже зарегистрирован, поскольку вся фактическая регистрация и верификация пользователя выполняется на отдельной странице входа, и для этого у меня уже есть код.
Обновление. Включение сообщений об ошибках возвращает следующие ошибки:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9 Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 9 array(0) { } Warning: Cannot modify header information - headers already sent by (output started at /homepages/21/d580042014/htdocs/index.php:2) in /homepages/21/d580042014/htdocs/includes/header.php on line 12 Notice: Undefined index: lang in /homepages/21/d580042014/htdocs/includes/header.php on line 18
Обновить:
В соответствии с комментариями я теперь разместил все, что находится в заголовке.
Спасибо заранее.
Обновление: вопрос был разрешен в чате .
В соответствии с вашим редактированием измените этот блок:
<!DOCTYPE html> <html> <head> <?php define("someUnguessableVariable", "anotherUnguessableVariable"); session_start(); if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){ header ("Location: login.php"); }
чтобы:
<?php session_start(); ?> <!DOCTYPE html> <html> <head> <?php define("someUnguessableVariable", "anotherUnguessableVariable"); if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){ header ("Location: login.php"); exit; // stop further executing, very important }
<?php
и т. Д., Это уже было установлено в комментариях. Используя редактор кода, например Notepad ++ https://notepad-plus-plus.org/, и сохраните его как UTF-8 без спецификации, который гарантирует отсутствие байтового байта.
Также, используя новый метод для проверки массива сеансов.
if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){
Также убедитесь, что ни один из ваших включенных / требуемых файлов не имеет одинаковых проблем, включая login.php
.
Примечания:
В раскрывающемся меню «Notepad ++» вы увидите
Если он показывает отметку порядка байтов, выполните следующие действия:
Сохраните файл.
Рекомендации):
Примечание:
Вы должны изменить $stmt->execute();
в
if(!$stmt->execute()){ trigger_error("there was an error....".$conn->error, E_USER_WARNING); }
Вам нужно двигаться
session_start(); if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){ header ("Location: login.php"); }
на вершину скрипта и двигаться !
внутри кронштейна.
Поместите профиль пользователя в переменные сеанса в скрипт PHP, который вы вызываете после страницы входа в систему
$_SESSION['user_id'] = $row["user_id"]; $_SESSION['profile_id'] = $row["profile_id"]; $_SESSION['name'] = $row["name"]; $_SESSION['surname'] = $row["surname"]; $_SESSION['application_auth'] = $row["application_auth"];
Поместите следующий код вверху каждой страницы, которую вы хотите защитить недействительными пользователями
<?php include("sessionCheck.php"); ?>
в<?php include("sessionCheck.php"); ?>
Сценарий sessionCheck В этом случае я также проверяю, имеет ли пользователь право просматривать конкретную страницу с помощью profile_id, но вы можете удалить ее
<?php session_start(); if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1) { header("location: http://www.yourdomain.com/login.php?message=Invalid user"); } ?>
Следующая часть должна идти до include "system/config.php";
потому что кажется, что этот файл выводит, а также тот факт, что следующий код не зависит от каких-либо других данных.
session_start(); if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){ header ("Location: login.php"); }
Во- вторых:
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){
Вероятно, должно быть: if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){
значение == ''
а не != ''
Пользователь, который не вошел в систему, скорее всего (в зависимости от вашего кода) не имеет значения, поэтому ваш код проверяет, не является ли он пустым, поэтому только зарегистрированные пользователи будут перенаправлены.
Следовательно:
<?php define("someUnguessableValue", "anotherUnguessableValue"); session_start(); if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){ header("location:login.php"); } include "system/config.php"; //.... the rest ?> <!DOCTYPE html> <html> <head>
Если он не переадресовывается, скорее всего будет установлен $ _SESSION ['login'], вам необходимо очистить файлы cookie для этого домена.