2011-10-29 11 views
0

ユーザーが入力したものと一致するようにログインプロセッサを取得しようとしていますが、ハードコードされたオブジェクト配列に姓、名字、パスワード。私はログインとオブジェクト配列の間でチェックを行う方法がわかりません。私は3ページ、student.class.php、login.php、およびprocessor.phpを持っています。

また、session_start()と$ _SESSION配列を使用する必要がありますが、これをプロジェクトに実装する方法がわかりません。別のセッションファイルを作成するか、それを自分のプロセッサに組み込みますか?あなたが設定する必要が任意のページの上部に

Student.class.php

<?php 

class Student 
{ 

    private $f_name; 
    private $l_name; 
    private $full_name; 
    private $password; 

    //Constructor method 
    public function __construct($f_name,$l_name,$password) { 
     $this->f_name = $f_name; 
     $this->l_name = $l_name; 
     $this->password = $password; 
    } 



    function get_name(){ 
     $full_name = $this->f_name.' '.$this->l_name; 
     return $full_name; 
    } 

    function get_level(){ 
     return $this->level; 
    } 

    function get_gender(){ 
     return $this->gender; 
    } 

    function get_password(){ 
     return $this->password; 
    } 
} 
?> 

login.php

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 
    </head> 

    <body> 
    <?php 

    require_once 'student.class.php'; 

    $students = array(); 

    $students[0] = new Student('Trey', 'Smith', 'senior', 'male', 'sailor1234'); 
    $students[1] = new Student('Kyle', 'McAulay', 'junior', 'male', 'abc123'); 
    $students[2] = new Student('Stacey', 'Keibler','senior','female', 'hotdawg23'); 
    $students[3] = new Student('Lindsey', 'Mullins', 'junior','female','gonoles69'); 
    $students[4] = new Student('Kenneth', 'Jaggers','senior', 'male', 'peterpanpan'); 
    $students[5] = new Student('Chad', 'Endris', 'sophomore', 'male','back2thefuture'); 

    ?> 

    <h1>Sign up for our site!</h1> 
    <form method="post" action="processor.php">  
     <fieldset>   
      <label>First Name</label> 
      <input type="text" name="first_name"/> 

      <label>Last Name</label> 
      <input type="text" name="last_name"/> 

      <label>Password</label> 
      <input type="text" name="password"/>      
     </fieldset> 

     <br><input type="submit" value="Submit"></input></br> 
    </body> 
</html> 

processor.php

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 
    </head> 

    <body> 

    <?php 

    require_once 'student.class.php'; 
    require_once 'login.php'; 

    function check_submit($field_to_check) 
    { 
     if (isset($_POST[$field_to_check]) && $_POST[$field_to_check] != '') 
     { 
      return TRUE; 
     } 
     else 
     { 
      return "Please fill in the $field_to_check category!"; 
     } 
    } 


    $errors = array(); 

    $_POST['first_name'] = strip_tags(trim($_POST['first_name'])); 
    $_POST['last_name'] = strip_tags(trim($_POST['last_name'])); 
    $_POST['password'] = strip_tags(trim($_POST['password'])); 


    if (check_submit('first_name') !== TRUE) 
    { 
     $errors[] = check_submit('first_name'); 
    } 

    if (check_submit('last_name') !== TRUE) 
    { 
     $errors[] = check_submit('last_name');  
    } 

    if (check_submit('password') !== TRUE) 
    { 
     $errors[] = check_submit('password');  
    } 

    if (count($errors)> 0){ 
     echo "<ul>"; 
     foreach($errors as $message){ 
     echo "<li>$message</li>"; 
    } 

    echo "</ul>"; 

    die(); 
    } 

    ?> 

    <h1>Thank you for registering <?php echo $_POST['first_name']." 
    ".$_POST['last_name']?>!</h1> 
    <h2>Your password was correct!</h2> 

    </body> 
</html> 

答えて

1

プットのsession_start() /セッションデータを取得する

ログインを提出すると、students配列をループし、$ _POST入力に対してそれぞれをテストします。あなたは試合を取得する場合、これは、これを行うための素晴らしい方法ではありませんように$ _SESSION [「学生」]

foreach ($students as $student) { 

    if ($student->f_name == $_POST['f_name'] && 
     $student->l_lame == $_POST['l_lame'] && 
     $student->password == $_POST['password']) { 

     $_SESSION['student'] = $student; 
     break; 

    } 

} 

としてセッション変数にオブジェクトを保存する...理想的な新しいをインスタンス化されませんあなたが後でそれらのすべてを使うつもりでない限り、すべての生徒のためのオブジェクトです。

また、processor.phpに、あなたは$ _POSTを探している[「first_nameの」]が、入力フィールドの名前は、すべての「F_NAME」

+0

f_name、l_nameなどが気になりましたが、プライベートです。それは必要ですか?その場合は、オブジェクトからそれらを渡すか、ログイン・チェッカーをクラスのメソッドとして配置する必要があります。 –

0

まずあり、ハードコードされた配列は、である必要がありlogin.phpではなく、ログインフォームをレンダリングするユーザーの資格情報を実際に確認します。そして、何らかの形で生徒の配列をたどって、ユーザーが入力したものが有効かどうかを確認する必要があります。しかしまず、Student.phpに便利な小さな関数を追加しましょう。

class Student { 
    function checkCredentials($firstname, $lastname, $password) { 
     $firstname = strip_tags(trim($firstname)); 
     $lastname = strip_tags(trim($lastname)); 
     $password = strip_tags(trim($password)); 

     if(
      $this->f_name == $firstname 
      && $this->l_name == $lastname 
      && $this->password == $password 
     ) { 
      return true; 
     } 

     return false;  
    } 
} 

私は入力サニタイズをクラスに移しました。そして、我々は今、少しprocessor.php変更することができます。

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 
    </head> 

    <body> 

    <?php 

    function check_submit($field_to_check) 
    { 
     if (isset($_POST[$field_to_check]) && $_POST[$field_to_check] != '') 
     { 
      return TRUE; 
     } 
     else 
     { 
      return "Please fill in the $field_to_check category!"; 
     } 
    } 

    if (check_submit('first_name') !== TRUE) 
    { 
     $errors[] = check_submit('first_name'); 
    } 

    if (check_submit('last_name') !== TRUE) 
    { 
     $errors[] = check_submit('last_name');  
    } 

    if (check_submit('password') !== TRUE) 
    { 
     $errors[] = check_submit('password');  
    } 


    if (count($errors)> 0){ 
     echo "<ul>"; 
     foreach($errors as $message){ 
      echo "<li>$message</li>"; 
     } 
     echo "</ul>";  
     die(); 
    }    

    // so far we've only checked if the post values exist 

    require_once "student.class.php"; 

    $students = array(); 

    $students[0] = new Student('Trey', 'Smith', 'senior', 'male', 'sailor1234'); 
    $students[1] = new Student('Kyle', 'McAulay', 'junior', 'male', 'abc123'); 
    $students[2] = new Student('Stacey', 'Keibler','senior','female', 'hotdawg23'); 
    $students[3] = new Student('Lindsey', 'Mullins', 'junior','female','gonoles69'); 
    $students[4] = new Student('Kenneth', 'Jaggers','senior', 'male', 'peterpanpan'); 
    $students[5] = new Student('Chad', 'Endris', 'sophomore', 'male','back2thefuture'); 

    $user = false; // Will store the logged in user, if login succeeds 

    // Here we traverse the array and checkCredentials for each stored Student object 
    foreach($students as $student) { 

     if($student->checkCredentials($_POST["first_name"], $_POST["last_name"], $_POST["password"]) {      
      $user = $student; 
      break; // Since there can be only one logged in user, there is no point to let foreach continue 
     } 
    } 

    if($user == false) { 
     echo "No such user exits"; 
     die(); 
    }       

    ?> 

    <h1>Thank you for registering <?php echo $user->get_name; ?> !</h1> 
    <h2>Your password was correct!</h2> 

    </body> 
</html> 

ログインに成功するための最も一般的なアプローチは、セッション変数にユーザー情報(より一般的にユーザーID)を特定のいくつかの種類を格納し、保護にリダイレクトされますページ。これはハードコードされた配列では不可能なので、オブジェクト全体をセッションに入れるだけです。それは非常に粗悪で安全ではないので、データベースをミックスに追加することを実際に考えるべきです。

のは、そのページのadmin.phpとprocessor.phpの終わりを呼ぼうと、次のようになります。だから何ここで起こることはあり

<?php 

session_start(); 

require_once "student.class.php"; 

if(
    !isset($_SESSION["user"]) 
    || !($_SESSION["user"] instanceof Student) 
) { 
    header("Location: login.php"); 
    die(); 
} 

$user = $_SESSION["user"]; 

?> 

<h1>Thank you for registering <?php echo $user->get_name; ?> !</h1> 
<h2>Your password was correct!</h2> 

if($user == false) { 
     echo "No such user exits"; 
     die(); 
    }       

    $_SESSION["user"] = $user; 

    header("Location: admin.php"); 
    die(); 

admin.phpは次のようになります

  • session_start()はセッションを使用するように指示します。また、それを使用するすべてのスクリプト内にある必要があります。 (すなわち、スクリプトの一番上に、htmlの前に)。また、$ _SESSION [「ユーザー」]変数が初期化されている場合といない場合、それは学生対象
  • を保持している場合、ユーザは、我々がチェックadmin.phpに何かをさせる前に、processor.php
  • にそれを置く必要があります私たちはユーザーをログインに戻しました。
  • もしそうなら、私たちはStudentオブジェクトを素敵な変数に入れて遊びます。
+0

すべてが驚くほどうまくいっていますが、私はadmin.phpヘッダーを取得してadmin.phpページにリダイレクトできません。何も起こらないようにlogin.phpページをリロードするだけです。 – webminer07

+0

processor.phpの上部にはsession_start()がありますか? –

関連する問題