2011-01-20 284 views
1

的那一刻,我是從表單POST取信息,並把它傳遞給它運行他們通過這個功能的login.php頁面:PHP/MySQL的登錄系統

function verify_Username_and_Pass($un, $pwd) { 

    $query = "SELECT * 
      FROM users 
      WHERE username = ? AND password = ? 
      LIMIT 1"; 

    if($stmt = $this->conn->prepare($query)) { 
     $stmt->bind_param('ss', $un, $pwd); 
     $stmt->execute(); 

     if($stmt->fetch()) { 
      $stmt->close(); 
      return true; 
     } 
    } 

} 

目前,唯一的這個檢查的是匹配的記錄是否存在,進而將用戶與此有關secret.php重定向:

function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     header("location: ../secret.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

但我需要做的是不是一個祕密頁面,有一個PHP頁面數據庫中的每個用戶(只會是一對夫婦),所以我需要該函數返回用戶名稱,如果成功ssful並將它們重定向到[username] .php,並在其中設置用戶名的會話,因此在祕密頁面上,我可以檢查合適的用戶是否進入正確的頁面?有道理?

+1

我得到的都是'祕密'頁面,爲什麼你需要爲每個用戶創建一個?爲什麼不使用會話和一個'祕密'頁面? – 2011-01-20 09:45:30

+0

請參閱Matt Lowdens的評論回答 – benhowdle89 2011-01-20 09:48:59

回答

1
function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     $_SESSION['username'] = $un; 
     header("location: ../secret.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

secret.php

<?php 
session_start(); //important; 

if($_SESSION['status'] != 'authorized') { 
    header("Location: ../index.php"); // not logged in 
} 

/* user specific stuff.. */ 
echo '<h1>' . $_SESSION['username'] . '</h1>'; 

$query = 'SELECT * FROM `user_profile` WHERE `username`="' . $_SESSION['username'] . '"'; 
//etc 

編輯 如果你堅持在具有特定的網頁,有這樣的事情:

羅斯。PHP

<?php 
session_start(); 
if($_SESSION['username'] != 'Ross') { die('you shouldn\'t be here..'); } 

// ok it's Ross, carry on 
?> 

大概都使用DB +會話

0

您可以擁有一個名爲member.php的頁面,並將用戶名作爲參數傳遞。

例如member.php?username=benhowdle89

這樣就夠了嗎? 「祕密」頁面上的內容是什麼?

如果你真的需要爲每一個單獨的頁面,那麼你可以這樣做:

if(!is_file($username.'.php')){ 
    $user_file = fopen($username.'.php', 'w'); 
    fwrite($user_file, '<p>User content</p>'); 
} 

header('Location:'.$username.'.php', true, 302); 
exit; 

它仍然似乎不是解決這一問題的最佳解決方案。我個人的用戶ID /名稱只是保存到會話,如:

session_start(); 
$_SESSION['user_id'] = 23; 

然後我可以建立動態每個用戶的頁面內容,根據該值。

+0

我明白了你的觀點,但每頁都會有略微不同的內容。一個用戶不需要看到另一個用戶頁面就勢在必行。但我不能告訴這些頁面上還會有什麼,所以爲什麼我要爲每個用戶創建一個頁面 – benhowdle89 2011-01-20 09:47:36

1

我不討論這是否是正確和明確的實施。我只是嘗試「修理」你的代碼:

function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     $_SESSION['username'] = $un; 
     header("location: ../{$un}.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

進入<username>.php您可以檢查是否$_SESSION['username']是等於文件名減去擴展名爲.php

但是!也許有更好的實現...例如,而不是具有N PHP文件(onece用戶),您可以只有一個PHP文件,將根據$_SESSION['username']

更新的加載正確的數據: 在頭<username> .PHP

<?php 
session_start(); 
if ($_SESSION['status'] == 'authorized' && preg_match("/^{$_SESSION['username']}\\.php$/",__FILE__)){ 
    echo "OK";! 
}else{ 
    header("location: ../index.php"); 
} 
?> 
+0

感謝您給我一個可行的解決方案,我希望只有一個頁面,但我喜歡我說的每個網頁都會有不同的內容。 – benhowdle89 2011-01-20 09:50:58

+0

看看我的更新 – 2011-01-20 09:58:09

0

重定向他們更好地做頭secret.php?USER = $未

0

這有一定道理,它是可行的,雖然我沒有看到你爲什麼想要做那樣複雜的事情? 首先你需要從你的查詢中返回數據而不是true,我不知道你在使用什麼庫,儘管$ stmt-> fetch()的東西應該返回一個數組,對象,對象數組,所以做這樣的事情$ data = $ stmt-> fetch();返回$ data;把一個print_r($ data)看看裏面是什麼。從上面的aswer使用與member.php的東西。

2

或者不通過用戶名作爲參數獲得,但保存的用戶名在會話:

if($ensure_credentials) { 
    $_SESSION['status'] = 'authorized'; 
    $_SESSION['username'] = $un; 
    header("location: ../secret.php"); 
} 

secret.php

if ($_SESSION['username'] == 'Jack') { 
    echo 'Hey Jack!'; 
} 
elseif ($_SESSION['username'] == 'Jill') { 
    echo 'Hello Jill!'; 
} 
else { 
    // die/send 404 
} 

或匹配用戶名與數據庫中的自定義頁面內容。