2016-03-26 5 views
-1

Fatal error: Call to a member function prepare() on a non-object in G:\xampp\htdocs\live\Billing Suryas\model\DBConfig.php on line 28Anruf auf eine Elementfunktion() auf einem Nicht-Objekt in (Fatal Error) vorbereiten

<?php 
    class Database 
    { 
     private $host = "localhost"; 
     private $db_name = "new_suryas1"; 
     private $username = "root"; 
     private $password = ""; 
     public $conn; 
     public function dbConnection() 
     { 
      $this->conn = NULL;  
      try 
      { 
       $conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password); 
       $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      } 
      catch(PDOException $exception) 
      { 
       echo "Connection error: " . $exception->getMessage(); 
      } 

      return $conn; 
     } 
     public function login($usname,$uspswd) 
     { 
      try 
      { 
       $stmt =$conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'"); 
       $stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd)); 
       $userRow=$stmt->fetch(PDO::FETCH_ASSOC); 
       if($stmt->rowCount() == 1) 
       { 
        if(password_verify($uspswd, $userRow['password'])) 
        { 
         $_SESSION['user_session'] = $userRow['user_id']; 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
      catch(PDOException $exception) 
      { 
       echo $exception->getMessage(); 
      } 
     } 

    } 
    ?> 

Das ist mein DBConfig.php

Ich kann nicht finden, was der Fehler in meinem Code

jemand bitte helfen Sie mir ...

+0

Es scheint mir '$ conn' ist keine db-Verbindung. Mit anderen Worten ... Eine Verbindung zur Datenbank konnte nicht hergestellt werden. Der Wert von $ Conn ist dann falsch. –

Antwort

1

Sie schreiben eine Klasse mit diesen Eigenschaften:

class Database 
{ 
    private $host = "localhost"; 
    private $db_name = "new_suryas1"; 
    private $username = "root"; 
    private $password = ""; 
    public $conn; 

Innerhalb einer Klassenmethode entspricht der Variablenbereich den Funktionen: auf externe Variablen kann nicht zugegriffen werden.

Um innerhalb einer Klassenmethode auf Klasseneigenschaften zugreifen Sie $this verwenden:

$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password); 
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

(...) 

$stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'"); 

+0

sorry selbe Fehlermeldung ...... jedes Problem in Xampp Version –

+0

Der Code muss funktionieren. Bearbeiten Sie die Frage, indem Sie den Code hinzufügen, in dem Sie die Datenbankklasse aufrufen. – fusion3k

0

Sie sind versuchen, das DB-Verbindungshandle in einer Variablen 01 zu speichern. Aber das ist nur eine lokale Variable, nicht die Klasseneigenschaft $conn. Um das zu verwenden, müssen Sie darauf zugreifen: $this->conn.

So sollte Ihre Verbindungsmethode so etwas wie

public function dbConnection() 
{ 
    try { 
     $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password); 
     $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $exception) { 
     echo "Connection error: " . $exception->getMessage(); 
    } 
} 

Da Sie jetzt $this->conn in anderen Funktionen

public function login($usname, $uspswd) 
{ 
    try { 
     $stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'"); 
     $stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd)); 
     $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
     if($stmt->rowCount() == 1) { 
      if(password_verify($uspswd, $userRow['password'])) { 
       $_SESSION['user_session'] = $userRow['user_id']; 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } catch(PDOException $exception) { 
     echo $exception->getMessage(); 
    } 
} 

Mit anderen Worten verwenden können: mit $conn statt $this->conn tut nicht verweisen auf die Objekte Eigenschaft $conn, aber eine lokale Variable $conn in den Methoden. Aber lokale Variablen sind nicht persistent. Wenn Sie also die Methode dbConnection() verlassen und versuchen, diese Variable wiederzuverwenden, indem Sie denselben Namen in login() auswählen, bezieht sich der Bezeichner $conn tatsächlich auf zwei verschiedene lokale Variablen . Was natürlich bedeutet, dass es keinen Wert in der login() Methode hält, die zu dem Fehler führt, den Sie erhalten.

Es gibt andere Ansätze wie "injizierendes Verbindungsobjekt" in Ihre Methoden. Aber das Obige ist ein sauberer und normalerweise bevorzugter Ansatz.

+0

Entschuldigung gleiche Fehlermeldung ...... jedes Problem in Xampp Version –

+0

OK, in diesem Fall könnte es sein, dass Ihre Datenbankverbindung einfach fehlschlägt (whyjever). Ihr Code enthält keine Fehlererkennung oder -behandlung für einen solchen Vorfall, weshalb er nicht erkannt wird.Also schlage ich vor, dass Sie 1. Ihre HTTP-Server-Fehlerprotokolldatei einchecken, was das Problem ist (als PHP-Entwickler müssen Sie diese Datei immer überwachen) und fügen Sie dann Fehlererkennung und -verarbeitung Ihrem Code hinzu. – arkascha

Verwandte Themen