PHP: как проверить, был ли пользователь уже зарегистрирован и иным образом перенаправлен на страницу входа в систему

Я новичок в 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 } 
  • Следуйте той же структуре для начала сеанса во всех ваших файлах, используя сеансы.
  • Убедитесь, что ваш файл не имеет знака порядка байтов (BOM).
  • Нет пробела до <?php и т. Д., Это уже было установлено в комментариях.

Используя редактор кода, например Notepad ++ https://notepad-plus-plus.org/, и сохраните его как UTF-8 без спецификации, который гарантирует отсутствие байтового байта.

Также, используя новый метод для проверки массива сеансов.

 if(!isset($_SESSION['login']) && $_SESSION['login'] != ''){ 

Также убедитесь, что ни один из ваших включенных / требуемых файлов не имеет одинаковых проблем, включая login.php .


Примечания:

В раскрывающемся меню «Notepad ++» вы увидите

  • Кодирование. Он покажет вам, для чего установлена ​​кодировка текущего файла.

Если он показывает отметку порядка байтов, выполните следующие действия:

  1. Нажмите «Кодирование».
  2. Преобразование в UTF-8 без спецификации
  3. Сохраните файл.

    • Сделайте это для всех ваших файлов.

Рекомендации):

  • Как исправить ошибку «Заголовки уже отправлены» в PHP

Примечание:

Вы должны изменить $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 для этого домена.