web-dev-qa-db-ja.com

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

更新:
コメントに従って、現在ヘッダーにあるすべてのものを投稿しました。

よろしくお願いします。

5
TaneMahuta

更新:質問は chat で解決されました。


編集に従って、このブロックを変更します。

_<!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/ そして、バイトオーダーマークがないことを保証するBOMなしでUTF-8として保存します。

また、セッションの配列チェックに新しいメソッドを使用します。

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

また、_login.php_など、含まれている/必要なファイルに同じ問題がないことを確認してください。


脚注:

Notepad ++のドロップダウンメニュー内に表示されます

  • エンコーディング。現在のファイルのエンコーディングが何に設定されているかが表示されます。

バイトオーダーマークが表示される場合は、次の手順に従います。

  1. 「エンコーディング」をクリックします。
  2. BOMなしでUTF-8に変換する
  3. ファイルを保存します。

    • すべてのファイルに対してこれを行います。

参照:


サイドノート:

$stmt->execute();をに変更する必要があります

_if(!$stmt->execute()){
    trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}
_
  • クエリで発生する可能性のあるエラーをキャッチすることをお勧めします。
10

あなたは移動する必要があります

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

スクリップの一番上に移動して!ブラケットの内側。

2
petebolduc

ログインページの後に呼び出す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");
?>

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");
    }   
?>
1
Luca

次の部分は_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をクリアする必要があります。

1
Onimusha