2014-07-12 4 views
1

로그인 양식으로 로그인하면 authentication.php는 입력 데이터가 데이터베이스에 있는지 확인합니다. 일치하는 항목이있을 때 사용자는 자신의 역할에 대한 페이지로 이동하여 사용자가 admin이라고 말하면 admin.php로 연결됩니다. 사용자가 성공적으로 로그인하면 welcome firstname lastname과 같은 메시지를 표시하려고합니다. 내 데이터베이스에는 firstname이라는 필드와 lastname이라는 필드가 있습니다. 난 내가세션을 기반으로 데이터베이스에서 데이터 가져 오기

authentication.php에게 :(를 알아낼 수 없기 때문에 사람이 좀 도와 수 있기를 바랍니다

<?php 
    session_start(); 
    // Making a connection with the database. 
    $mysqli=new MySQLi("localhost", "root", "root", "portfolio"); 
    $role=""; 

    // Declaring the username and password input. 
    $username=filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); 
    $password=filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); 

    // If role from members where username and password from inputs exicts in database bind parameters. 
    // If given parameters not excists in database die 
    if($query=$mysqli->prepare("SELECT `role` FROM members WHERE username=? AND password=?")) { 
     $query->bind_param("ss", $username, $password);           
     $query->execute();                 
     $query->bind_result($role); 
     $query->fetch(); 
    } else {                      
     echo "Errors in the Query. ".$mysqli->error;            
     die(); 
    } 

    // If $role is filled make session for username to check if logged in and session role for redirect page. 
    // If $role and $username is not filled invalid password, username combination. 
    if($role!="") {                   
     $_SESSION['ingelogt']=$username;               
     $_SESSION['user_role']=$role;             
     $location="$role.php";                 
     header("location: $location");               
    } else {                     
     echo "Invalid password, username combination"; 
     echo "<br/><a href='login.html'>Click to go back</a>";           
    } 
?> 

관리자를 호출 admin.php로 이동합니다 페이지

<?php 
    session_start(); 
    // If session is not ingelogt lead back to index.php. 
    if(!isset($_SESSION['ingelogt'])) { 
     header("location: index.php"); 
    } 

    // The role that has access to this page. 
    $page_role="admin"; 
    $role=$_SESSION['user_role']; 
    // If a user with a different role visits wrong page. 
    if($role!=$page_role) 
    { 
     echo "You are not supposed to be here."; 
     die(); 
    } 

    // Start new DOMDocument and load html file. 
    $dom = new DOMDocument(); 
    libxml_use_internal_errors(true); 
    $dom->loadHTMLFile("admin.html"); 
    libxml_use_internal_errors(false); 

    // If user is logged in add logg out icon in the menu. 
    if($_SESSION['ingelogt']) { 
     $oUl = $dom->getElementById('navUl'); 
      $oList = $dom->createElement('li'); 

       $oLink = $dom->createElement('a'); 
       $oLink->setAttribute('href','logout.php'); 

        $oI = $dom->createElement('i'); 
        $oI->setAttribute('class','icon-logout'); 

        $oLink->appendChild($oI); 

       $oList->appendChild($oLink); 

      $oUl->appendChild($oList); 
    } 
    // Save DOMDocument with html document. 
    echo $dom->saveHTML(); 
?> 
+1

HTTP 응답에서 클라이언트가 '위치'헤더를 건너 뛸 수 있다는 점에 주목하십시오. 이것은 브라우저를 리다이렉트하도록 "묻는"방법 일 뿐이지 만, "듣는"것을 의미하지는 않습니다. 사용자가 코드에서 그 지점을 지나갈 수 없도록하려면'header ("Location : some_uri")'뒤에'die()'또는'exit()'를 사용하십시오. – Max

+0

좋습니다! 나쁘게 그 미래를 사용하십시오 :-) –

답변

1

내가 어떤 식 으로든 오해하고있는 경우 힌트를 주시면 답변을 삭제하겠습니다. 사용자가 원하는 것은 인사말을 페이지의 어딘가에서 인쇄하고 사용자의 이름과 성.

기본적으로 $_SESSION 요소를 선언하면 다른 페이지에서 액세스 할 수 있습니다 ($_COOKIE과 비슷하지만 동일하지는 않음). 따라서 가장 좋은 해결책은 $_SESSION 변수를 데이터베이스에서받은 성과 이름으로 초기화 한 다음 해당 변수를 원하는 페이지에 인쇄하는 것입니다 (역할에 사용한 것과 같은 방법).

if($query=$mysqli->prepare("SELECT `role`, `firstname`, `lastname` FROM members WHERE username=? AND password=?")) //assuming that your columns are called `firstname` and `lastname` 

이를 가져 오기 위해, 당신은 또한 필요

첫째, 다음에 authentication.phpif -statement을 변경하여 수행 할 수있는 데이터베이스의 이름을 가져 오기 위해 필요 아래로 더 행을 변경 :

$query->bind_result($role, $first, $last); 

다음 행에 fetch를 사용하는 경우, 귀하의 변수는 자신의 적절한 결합 된 것들에 투입 될 것입니다. 그래서 문 다음에, 당신은 (바람직하게는 $_SESSION['user_role']=$role; 후) 다음을 수행 할 수 있습니다 당신이 원하는 목적지

$_SESSION["firstname"] = $first; 
$_SESSION["lastname"] = $last; 

그 시점 후에는 1 세대와 성을 echo 수 있습니다 (당신이 원하는 위치에 따라 달라집니다 놓다...).

echo "Hello " . $_SESSION["firstname"] . " " . $_SESSION["lastname"] . "!"; 

당신이 뭔가를 넣어 어디에 혼란스러워 경우, 다시 읽기를 시도 : 당신이 원하는 경우는 예를 들어, 당신은 단순히 $dom = new DOMDocument(); 전에이를 넣을 수 있습니다, admin.php의 맨 위에 표시합니다 주어진 지침. 필자의 예제는 단순히 대체해야 할 것이고 (이 경우 해당 코드를 찾아야 함), 그렇지 않은 경우 사용자를 리디렉션하려고했습니다. 이러한 것들이 코드를 손에 넣지 않고 알아야하는 것이 중요하다는 것을 알고 있기 때문에 이해하려고 노력하십시오.

+0

고마워요 @ MAX! 나는 메신저 집에 다시 메신저를 보려고 지금 메릴랜드 대 brazillie을보고 있습니다! 나는 그것이 어떻게 지금 작동하는지 완전하게 이해한다! 무언가가 잘못되면 아프게 여기에 게시하지만 지금은 감사합니다! –

+0

그것은 작동합니다 :)하지만 당신은 domdocument의 H1의 값에 메아리를 넣을 수 있다면 어떤 생각이 있습니까? $ oDiv = $ dom-> getElementById ('ttWelcomeText'); $ oH1 = $ dom-> createElement ('h1', 'echo "Hello". $ _SESSION [ "firstname"]. ""$ _SESSION [ "lastname"]. "!";'); $ oDiv-> appendChild ($ oH1); 그러면 echo가 평범한 텍스트로 표시됩니다 @Max –

+1

@KingMike 듣고 기쁘게 생각합니다 (또한 다른 사람의 시간을 절약하기 위해 대답을 수락 할 수 있음). 다른 질문에 대해서는 다음과 같이 해보자 :'$ oH = $ dom-> createElement ('h1'); $ oGreeting = $ dom-> createTextNode ("Hello". $ _SESSION [ "firstname"]. "". $ _SESSION [ "lastname"]. "!")); $ oH-> appendChild ($ oGreeting);', 그런 다음 원하는 요소에 추가하십시오 (물론 문장 사이에 줄 바꿈을 사용해야합니다. 주석문에서는 그렇게 할 수 없습니다). – Max

관련 문제