2017-04-17 116 views
3

我真的很困擾整個'只有登錄的用戶可以查看此頁'。 Php對我來說是新的,我似乎無法弄清楚這一點。也許這是一個愚蠢的問題,或者我的代碼是不正確的,但我真的想弄明白這一點。如何確保只有登錄用戶才能訪問頁面?

的login.php:

<?php 
    session_start(); 

    function is_logged() { 
     if (isset($_SESSION['username'])) return $_SESSION['username']; 
     else return false; 
    } 

    if (is_logged()) { 
     $user_id = is_logged(); 

     do_something($user_id); 
    } else { 
     if (isset($_POST['submit'])) { //form submitted 
      //check login and password, if they are correct, do this: 
      $_SESSION['username'] = $username_from_database; 
      //if not correct 
      unset($_SESSION['username']); 

      header('Location: welcome.php'); //refresh page 
     } else { 
      //show login form with button named 'submit' 
     } 
    } 
?> 



<html> 
<head> 
    <title>Login</title> 
</head> 
<body> 
<?php 
if (!isset($_POST['submit'])){ 
?> 
<!-- The HTML login form --> 
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post"> 
     Username: <input type="text" name="username" /><br /> 
     Password: <input type="password" name="password" /><br /> 

     <input type="submit" name="submit" value="Login" /> 
    </form> 
<?php 
} else { 
    require_once("db_const.php"); 
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 
    # check connection 
    if ($mysqli->connect_errno) { 
     echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>"; 
     exit(); 
    } 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $sql = "SELECT * from GEBRUIKERS WHERE username LIKE '{$username}' AND password LIKE '{$password}' LIMIT 1"; 
    $result = $mysqli->query($sql); 
    if (!$result->num_rows == 1) { 
     echo "<p>Invalid username/password combination</p>"; 
    } else { 
     echo "<p>Logged in successfully</p>"; 
     // do stuffs 
    } 



    if (mysqli_num_rows($result) > 0) { 
    // Output data of each row 
    while($row = mysqli_fetch_assoc($result)) { 
     $_SESSION['+login_user']=$user; // Initializing Session 
     header("location: welcome.php"); // Redirecting To Other Page 
    } 
} 


else { 
    $error = "Username or Password is invalid"; 
} 

mysqli_close($conn); // Closing Connection 

} 
?>  
</body> 
</html> 

的welcome.php:

<?php 
session_start(); 

?> 
<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<link rel="stylesheet" type="text/css" href="style.css"/> 
<!--Header wordt opgehaald--> 
</head> 
<?php 
    require "header2.php" 
?> 

<?php 
$servername = "localhost"; 
$username = ""; 
$password = ""; 
$database = ""; 
// Create connection 
$conn = mysqli_connect($servername, $username, $password, $database); 
// Check connection 
if (!$conn) { 
       die("Connection failed: " . mysqli_connect_error());  
} 
echo "Connected successfully"; 
?> 

<body> 

<?php 
//Perform queries 
$sql = "SELECT acteur_voornaam, acteur_tussenvoegsel, acteur_achternaam, acteur_geboortedatum FROM FILM_ACTEURS"; 
$result = $conn->query($sql); 
//Films 
if ($result->num_rows > 0) { 
    echo "<table style='border: solid 1px grey; margin-left: auto; margin-right: auto; margin-top:50px;'><th>Voornaam</th><th>Tussenvoegsel</th><th>Achternaam</th><th>Geboortedatum</th></tr>"; 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     echo "<tr><td>" . $row["acteur_voornaam"] . "<td>" . $row["acteur_tussenvoegsel"]. "<td> " . $row["acteur_achternaam"]. "<td> " . $row["acteur_geboortedatum"] . "" . "</td></tr>"; 
    } 
     echo "<table>"; 
} else { 
    echo "0 results"; 
} 

$conn->close(); 
?> 
    </body> 
    <?php 
//Footer wordt opgehaald 

    include "footer.php" 

?> 


    </html> 
+2

頂部調用每個頁面上is_logged()'。並且如果它返回false重定向登錄.php –

+0

**警告:**您打開'sql注入',請閱讀[如何使用預處理語句](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)。 'sql注入'意味着你是開放的攻擊,他們可以訪問你的數據庫和manupulate它。 **另一個警告**將您的密碼進行哈希處理,將其保存爲數據庫時不會**。使用'password_hash()'和'password_verify()'來加密你的密碼。 – Nytrix

+0

謝謝,我想我是開放的SQL注入。現在這是一個學校作業。 – Nienke

回答

0

在session_start();並檢查is_logged();必須包含在所有僅限會員的頁面中,還有一個原因是您的代碼無法正常工作,即您在註銷後未清除會話變量,因此您的瀏覽器會自動登錄您

+0

哦,真的嗎?我如何清除該會話? – Nienke

+1

@Nienke'unset($ _ SESSION [「loggedIn」);' – Nytrix

+0

我也認爲問題在於它被清除*正確*設置後...只是* mayybbeee *。 – Nytrix

0

在您的登錄功能中創建會話像成功登錄塊內部變量:

$_SESSION['loggedIn'] = true; 

現在每個頁面,登錄被訪問頁面所需的把下面的檢查:

if(!isset($_SESSION['loggedIn']) && ($_SESSION['loggedIn'] != true)) 
{ 
    // redirect the user to login screen if the session variable is not set and its value is not true 
    header('location: login.php'); 
} 

注:要訪問會話,您必須在每個頁面上放置session_start(),並且它必須是第一行。

0

首先創建一個名爲session.php頁面,你必須在所有的頁面

<?php 
    session_start(); 

    function is_logged() { 
     if (isset($_SESSION['username'])) return $_SESSION['username']; 
     else return false; 
    } 

    if (is_logged()) { 
     $user_id = is_logged(); 

     do_something($user_id); 
    } else { 
     if (isset($_POST['submit'])) { //form submitted 
      //check login and password, if they are correct, do this: 
      $_SESSION['username'] = $username_from_database; 
      //if not correct 
      unset($_SESSION['username']); 

      header('Location: welcome.php'); //refresh page 
     } else { 
      //show login form with button named 'submit' 
     } 
    } 
?> 

其次包括:包括session.php頁面中的所有頁面。這將檢查會話或重定向到登錄頁面。

在歡迎頁面

Welcome.php在頁面的頂部包括session.php像:

<?php 
inlcude 'session.php'; 
?> 

如果需要的話不要在session.php文件進行必要的更改。

注意:您可以給任何名稱session.php文件。

+0

我在嘗試,但第一次很難。 – Nienke

+0

這是一個好的實踐,還是對問題的回答?它並沒有解釋任何問題,或解決這個問題...... – Nytrix

0

嘗試在PHP中使用isset函數。將會話開始後的波紋管代碼放在welcome.php文件中。

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

如果會話「用戶名」未設置,則在登錄頁面上重定向。如果會話已經初始化,然後重定向到welcome.php。

+0

這使我回到登錄頁面,但現在當我想登錄時,我只是留在登錄頁面。 – Nienke

+0

也在登錄頁面中應用相同的條件並確保會話啓動與否。你可以用<?php echo $ _SESSION ['username']; ?> –

+0

這沒有任何意義,爲什麼你會把這個相同的條件在登錄頁面?你也明顯錯過了她有一個函數'is_logged()',這使得它更容易。如果一切正常,它不應該重定向到登錄頁面。因此,將它添加到登錄頁面,不會改變*任何*。 – Nytrix

相關問題