2015-06-24 15 views
5

Jestem nowym PHP i zmagam się z następujących czynności:PHP: Jak sprawdzić, czy użytkownik jest już zalogowany i inaczej przekierowanie do strony logowania

Mam stronę, gdzie chcę, aby sprawdzić, czy ktoś jest zarejestrowany użytkownik przed udostępnieniem zawartości witryny. Pomyślałem więc, że w moim pliku nagłówkowym (który jest wymieniony na wszystkich pojedynczych stronach przez require_once("includes/header.php");) mogę to sprawdzić i przekierować na stronę logowania (login.php), jeśli jeszcze się nie zalogowali.

Więc tutaj jest wszystko, co mam w nagłówku:

<!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> 

Teraz to nie działa i myślę, że jestem prawdopodobnie brakuje kilku rzeczy, ale nie mogłem znaleźć dobrego samouczek lub wytyczna na ten temat. Ponadto, nie jestem pewien, czy jest coś jeszcze, co muszę zrobić, aby rozpocząć i skonfigurować sesję.

Czy ktoś może mi w tym pomóc?

Uwaga:
To tylko o sprawdzenie, czy użytkownik jest już zalogowany, ponieważ wszystkie rzeczywiste rejestracji użytkownika i weryfikacja odbywa się na odrębnej stronie logowania i za to mam już kod działa.

Aktualizacja: Włączanie komunikaty o błędach zwraca następujące błędy:

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 

Aktualizacja:
Zgodnie komentarze I teraz pisał wszystko, co jest obecnie w nagłówku.

Wielkie dzięki z góry.

Odpowiedz

10

Aktualizacja: pytanie zostało rozwiązane w chat.


Jak na edycję, zmień ten blok:

<!DOCTYPE html> 
<html> 
    <head> 
     <?php 
      define("someUnguessableVariable", "anotherUnguessableVariable"); 
      session_start(); 
      if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){ 
       header ("Location: login.php"); 
      } 

do:

<?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 
      } 
  • Wykonaj taką samą strukturę na rozpoczęcie sesji w wszystkich plików z wykorzystaniem sesji.
  • Upewnij się, że plik nie ma znaku kolejności bajtów (BOM).
  • Brak miejsca przed <?php itd. Zostało to już ustalone w komentarzach.

Użycie edytora kodu, takiego jak Notepad ++ https://notepad-plus-plus.org/, i zapisanie go jako UTF-8 bez LM, co zapewni brak znacznika kolejności bajtów.

Ponadto, używając nowej metody do sprawdzania tablicy sesji.

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

Sprawdź również zauważyć, że żaden z włączonych/wymagane pliki mają takie same problemy, w tym login.php.


Przypisy:

menu rozwijane Wewnątrz Notepad ++ 's, widać

  • kodowania. Pokaże ci, do czego jest ustawione kodowanie pliku bieżącego.

Jeśli tak pokazują bom, wykonaj następujące kroki:

  1. kliknij "Kodowanie".
  2. Konwersja na kodowanie UTF-8 bez zestawienia komponentów graficznych
  3. Zapisz plik.

    • Zrób to dla wszystkich swoich plików.

Reference (s):


Sidenote:

należy zmienić $stmt->execute(); do

if(!$stmt->execute()){ 
    trigger_error("there was an error....".$conn->error, E_USER_WARNING); 
} 
  • Lepiej nadrobić ewentualne błędy w zapytaniu.
+0

Dziękuję bardzo za to. Przykro mi, ale zmiana kodu nie naprawiła tego. Przejrzymy teraz referencje twojego i Michaela i zaktualizujemy wtedy post. – TaneMahuta

+1

@TaneMahuta Nie ma za co. Teraz zdefiniuj "nie naprawiłeś". Czy wciąż otrzymujesz te same błędy? Lub nowe?i czy otworzyłeś swoje pliki, aby zobaczyć, czym jest kodowanie? –

+0

Jeszcze raz dziękuję. Zmniejszyło liczbę błędów, więc jest częściowy sukces. :) Zamiast 4 otrzymuję teraz tylko 2: array (0) {} Uwaga: Niezdefiniowany indeks: login w /homepages/21/d580042014/htdocs/includes/header.php on line 13 Uwaga: Niezdefiniowany indeks: lang w /homepages/21/d580042014/htdocs/includes/header.php on line 23 – TaneMahuta

1

Umieść profil użytkownika w zmiennych sesyjnych w skrypcie PHP wywołaniu po stronie logowania

$_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"]; 

Umieść następujący kod w górnej części każdej strony, którą chcesz chronić przez nieprawidłowy użytkowników

<?php 
include("sessionCheck.php"); 
?> 

Skrypt SessionCheck W tym przypadku sprawdzam również, czy użytkownik jest uprawniony do wyświetlenia konkretnej strony za pomocą identyfikatora profilu, ale można go usunąć

<?php 
    session_start(); 
    if(!IsSet($_SESSION['user_id']) or $_SESSION['profile_id'] !=1) 
    { 
     header("location: http://www.yourdomain.com/login.php?message=Invalid user"); 
    } 
?> 
+0

Wielkie dzięki za to - pozwól mi sprawdzić. – TaneMahuta

+0

Aby potwierdzić, chcesz, żebym zapisał zmienne sesji jako oddzielny plik sessionCheck, a następnie umieść to na odpowiednich stronach przed nagłówkiem i uruchom sesję ... u góry nagłówka? – TaneMahuta

+0

Tak sessionCheck jest oddzielnym skryptem, który musisz uwzględnić u góry stron, które chcesz chronić. Oczywiste jest, że musisz zapisać szczegóły profilu użytkownika w zmiennej sesji po sprawdzeniu, czy użytkownik istnieje w bazie danych oraz że dane logowania są poprawne. – Luca

2

Trzeba przenieść

session_start(); 
if((!isset($_SESSION['login']) && $_SESSION['login'] != '')){ 
    header ("Location: login.php"); 
} 

do góry scrip i przenieść ! wewnątrz uchwytu.

+0

Dzięki za to - pozwól mi sprawdzić. – TaneMahuta

+0

Ok, umieszczam to na samym szczycie nagłówka, ale nadal nie przekierowuje. – TaneMahuta

+0

jest nagłówkiem wywoływanym po kolejnym skrypcie? – petebolduc

1

Następująca część powinna iść przed include "system/config.php";, ponieważ wydaje się, że ten plik wyprowadza, a także fakt, że poniższy kod nie jest zależny od żadnych innych danych.

session_start(); 
if(!(isset($_SESSION['login']) && $_SESSION['login'] != '')){ 
    header ("Location: login.php"); 
} 

drugie:

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

prawdopodobnie powinien być: if(!isset($_SESSION['login']) && $_SESSION['login'] == ''){

oznacza == '' a nie != ''

Użytkownik niezalogowany najprawdopodobniej (w zależności od kod) nie ma ustaw wartość, aby twój kod sprawdził, czy nie jest pusty, więc tylko zalogowani użytkownicy zostaną przekierowani.

Stąd:

<?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> 

Jeśli nie jest spedycja, następnie $ _SESSION [ 'login'] jest najprawdopodobniej zestaw, trzeba wyczyścić ciasteczka dla tej domeny.

+0

Dzięki - masz rację co do drugiej części. Sprawdziłem to, ale też nie przekierowałem. – TaneMahuta

+0

@TaneMahuta Dodałem edycję. To wszystko, czego najprawdopodobniej potrzebujesz. Jeśli nie przekazuje dalej, najprawdopodobniej zostanie ustawione $ _SESSION ['login'], musisz wyczyścić pliki cookie dla tej domeny. – Onimusha

+0

Dzięki. Próbowałem tego, ale przykro mi, że nadal nie działa. – TaneMahuta

Powiązane problemy