2016-05-09 6 views
2

私の質問は誰にでも簡単です。ちょうどこのPHPをほぼ1ヶ月学んでいます。私はOOPスタイルを使って自分のログインシステムを実行しようとしました。ユーザー名とパスワードがadminの既定のユーザーとしてログインする必要がある場所。ログインしようとしたときに、オブジェクトが見つかりませんでした。だからここ ログインシステムでOOPスタイルを実行する

Object not found!

以下の私のコード。

表:

CREATE TABLE loginmodule 
(
loginId INT PRIMARY KEY AUTO_INCREMENT, 
loginUsername VARCHAR(50), 
loginPassword VARCHAR(50) 
) 

ここに私のログインスクリプトがあります。

loginMe.php

<?php 
require_once('../connection/connection.php'); 
require_once('../connection/loginCRUD.php'); 
require_once('../process/createProcess.php'); 
?> 


<!doctype html> 
<html> 
<head> 
    <title>Login Frame</title> 
</head> 
<body> 
    <div id = "container"> 
    <h1>Login</h1> 
    <form action = "post" action = "../process/createProcess.php"> 

    <div class = "form-field"> 
     <input type = "text" id = "username" name = "loginUsername" placeholder = "Enter Username"> 
    </div> 

    <div class = "form-field"> 
     <input type = "password" id = "password" name = "loginPassword" placeholder = "Enter Password"> 
    </div> 

    <div class = "form-field"> 
     <input type = "submit" id = "submit" name = "submit" value = "Login"> 
    </div> 
    </form> 
    </div><!--- end container ---> 
    </body> 
    </html> 

だから私は、別のファイルに私のCRUDを脇に置きます。 loginCRUD.php

<?php 
error_reporting(0); 
class CRUD 
{ 
public function readLogin($dbusername,$dbpassword) 
{ 
    global $myDatabase; 
    $result = $myDatabase->query("SELECT * FROM loginmodule WHERE loginUsername = '$dbusername' AND loginPassword = '$dbpassword'"); 

    if($result->num_rows > 0) 
    { 
     $row = $result->fetch_assoc(); 
     return $row; 
    } 
} 
} 
?> 

私はまた私の検証が起こる私のプロセスを脇に置き最終。私が何かを逃した場合 createProcess.php

<?php 

require_once('../connection/connection.php'); 
require_once('../connection/loginCRUD.php'); 

session_start(); 

$dbusername = $_POST['loginUsername']; //Get the value from textfield. 
$dbpassword = $_POST['loginPassword']; 

if(!empty($dbusername) && !empty($dbpassword)) 
{ 
    if($loginUsername == $dbusername && $loginPassword == $dbpassword) 
    { 
     $create = loginCRUD::readLogin($dbusername,$dbusername); 
     echo "You are logged in!"; 
     @$_SESSION['loginUsername'] = $loginUsername; 
    } 
} 

?> 

は私をガイド。これは私が知っているよりも、ショートカットのスタイルがある場合:)

+0

完全なエラーメッセージで質問を更新できますか?それはあなたを助けることがより簡単になります。 – olibiaz

+0

'$ myDataase'はタイプミスです。 '$ myDatabase'でしょうか? – chris85

+0

この文は、 '$ loginUsername == $ dbusername && $ loginPassword == $ dbpassword){...'、 '$ loginUsername'と' $ loginPassword'をどこから取得しましたか? –

答えて

3

など、あなたのコード内のいくつかのエラー、があります。

  • があなたのformタグに2つのaction属性があります。 createProcess.phpページで

    <form method="post" action="../process/createProcess.php"> 
    
  • <form action = "post" action = "../process/createProcess.php"> 
         ^   ^
    

    それがあるべき、

    、次の行を見て、

    1) if($loginUsername == $dbusername && $loginPassword == $dbpassword) 
          ^        ^
    

    $loginUsername$loginPassword

    をという名前の変数がありません

    あなたはreadLogin()メソッドを間違った方法で呼び出しています。あなたはファーストクラスCRUDのインスタンスを作成し、この方法のように、それはインスタンスメソッドreadLogin()だ呼び出す必要があります:

    (new CRUD)->readLogin($dbusername,$dbpassword); 
    
    3) $_SESSION['loginUsername'] = $loginUsername; 
    

    私が言ったように、$loginUsernameという名前の変数が存在しません。

    <?php 
        session_start(); 
        // your code 
    
  • あなたのクエリはSQLインジェクションの影響を受けやすい:それは

    $_SESSION['loginUsername'] = $dbusername; 
    
  • 常にこのように、右開きのPHPタグの後、あなたのPHPスクリプトのあなたの一番上にセッションを開始する、する必要があります。任意のSQLインジェクションを防ぐために、mysqliのプリペアドステートメントを使用してください。 And this is how you can prevent SQL injection in PHP

  • 平文のテキストとしてパスワードを保存しないでください。テーブルに挿入する前に、生パスワードで常にsalted password hashingを実行してください。

  • 提案:あなたのコードでglobalを使用しないでください。 Why Globals are evil?

だからあなたのコードは次のようにする必要があります:

CRUDクラス:

class CRUD{ 
    public function readLogin($dbusername,$dbpassword){ 
     global $myDatabase; 
     $statement = $myDatabase->prepare("SELECT * FROM loginmodule WHERE loginUsername = ? AND loginPassword = ? LIMIT 1"); 
     $statement->bind_param("ss", $dbusername, $dbpassword); 
     if($statement->execute()){ 
      $result = $statement->get_result(); 
      if($result->num_rows){ 
       $row = $result->fetch_assoc(); 
       return $row; 
      }else{ 
       return false; 
      } 
     }else{ 
      return false; 
     } 
    } 
} 

createProcess.php

if(isset($_POST['submit'])){ 
    $dbusername = $_POST['loginUsername']; 
    $dbpassword = $_POST['loginPassword']; 

    if(!empty($dbusername) && !empty($dbpassword)){ 
     if((new CRUD)->readLogin($dbusername,$dbpassword)){ 
      echo "You are logged in!"; 
      $_SESSION['loginUsername'] = $dbusername; 

      // redirect the user to the home page 
     }else{ 
      echo "Incorrect username and/or password"; 
     } 
    } 
} 

HTM L

<div id = "container"> 
    <h1>Login</h1> 
    <form method = "post" action = "../process/createProcess.php"> 
     <div class = "form-field"> 
      <input type = "text" id = "username" name = "loginUsername" placeholder = "Enter Username"> 
     </div> 

     <div class = "form-field"> 
      <input type = "password" id = "password" name = "loginPassword" placeholder = "Enter Password"> 
     </div> 

     <div class = "form-field"> 
      <input type = "submit" id = "submit" name = "submit" value = "Login"> 
     </div> 
    </form> 
</div> 
+0

これは私が遭遇する最良の説明でした。最後の質問 '' ss "の目的は' $ statement-> bind_param( "ss"、$ dbusername、$ dbpassword); ' – Francisunoxx

+2

@MiaLegaspi' s'は対応するバインド変数の型を指定します。ここで '' ss "'は '$ dbusername'と' $ dbpassword'の両方が 'string'型であることを意味します。ここに[ドキュメンテーション](http://php.net/manual/en/mysqli-stmt.bind-param.php)があります。 –

関連する問題