2016-05-09 4 views
2

Ich weiß, meine Frage ist einfach für jedermann. Erlernte gerade dieses PHP fast einen Monat. Ich habe versucht, mein Login-System im OOP-Stil auszuführen. Wo muss ich mich als Standardbenutzer einloggen, wo der Benutzername und das Passwort admin ist. Als ich mich anzumelden versuchte, sagte ich, dass das Objekt nicht gefunden wurde.Ausführen von OOP-Stil in Login-System

Object not found!

Also hier unter meinem Code.

Tabelle:

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

Hier ist mein Login-Skript.

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> 

Also habe ich meine CRUD in einer anderen Datei zur Seite. 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; 
    } 
} 
} 
?> 

Last, wo ich meinen Prozess auch meine Validierung beiseite legen, wo passiert. 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; 
    } 
} 

?> 

leite mich, wenn ich etwas verpasst. Wenn es eine Verknüpfung Stil ist als das lass es mich wissen :)

+0

Können Sie die Frage mit der vollen Fehlermeldung bitte aktualisieren? Es wird einfacher sein, dir zu helfen. – olibiaz

+0

'$ myDataase' ist ein Tippfehler. Sollte '$ myDatabase' sein, oder? – chris85

+0

Diese Anweisung, 'if ($ loginUsername == $ dbusername && $ loginPassword == $ dbpassword) {...', woher haben Sie $ loginUsername und $ loginPassword? –

Antwort

3

Es gibt mehrere Fehler im Code, wie zum Beispiel:

  • Es gibt zwei action-Attribut in Ihrem form-Tag.

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

    Es sollte,

    <form method="post" action="../process/createProcess.php"> 
    
  • Auf createProcess.php Seite, Blick auf die folgenden Zeilen ein,

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

    Es sind keine Variablen namens $loginUsername und $loginPassword

    2) $create = loginCRUD::readLogin($dbusername,$dbusername); 
                ^  ^
               both the arguments are same 
    

    Sie rufen readLogin() Methode in einer falschen Art und Weise. Sie sollten zunächst eine Instanz der Klasse CRUD erstellen und rufen dann ist es Instanzmethode readLogin(), wie auf diese Weise:

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

    Wie gesagt, es gibt keine Variable $loginUsername benannt ist.Es sollte sein,

    $_SESSION['loginUsername'] = $dbusername; 
    
  • Immer Sitzung an Ihrem ganz oben auf der PHP-Skript starten, direkt nach der Eröffnung PHP-Tag, wie folgt aus:

    <?php 
        session_start(); 
        // your code 
    
  • Ihre Anfrage ist anfällig für SQL-Injection. Verwenden Sie vorbereitete Anweisungen für mysqli, um jede Art von SQL-Injektion zu verhindern. And this is how you can prevent SQL injection in PHP.

  • Niemals Passwort als klar lesbaren Text speichern, führen Sie immer auf Raw-Passwort aus, bevor Sie es in die Tabelle einfügen.

  • Vorschlag: Verwenden Sie nicht global in Ihrem Code. Why Globals are evil?

So Ihr Code wie folgt sein sollte:

CRUD Klasse:

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

Das war die beste Erklärung, der ich begegne. Letzte Frage, was der Zweck von '" ss "' in $ statement-> bind_param ("ss", $ dbusername, $ dbpassword) ist; ' – Francisunoxx

+2

@MiaLegaspi's' gibt den Typ für die entsprechende Bindevariable an. Hier bedeutet "ss" sowohl "$ dbusername" als auch "$ dbpassword" vom Typ "string". Hier ist [die Dokumentation] (http://php.net/manual/en/mysqli-stmt.bind-param.php). –