2016-03-26 2 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 28вызов функции-члена подготовить() на не-объект в (Фатальная ошибка)

<?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(); 
      } 
     } 

    } 
    ?> 

Это мой DBConfig.php

Я не могу найти то, что это ошибка в моей код

кто-нибудь мне помочь, пожалуйста ...

+0

Мне кажется, что '$ conn' - это не соединение db. Другими словами ... Ошибка подключения к базе данных. Тогда значение '$ conn' является ложным. –

ответ

1

Вы пишете класс с этими свойствами:

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

Внутри метода класса переменная область схожа с функциями: внешние переменные недоступны.

Чтобы получить доступ к свойствам класса внутри метода класса вы должны использовать $this:

$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

извините одно сообщение об ошибке ...... любая проблема в версии xampp –

+0

Код должен быть выполнен. Измените вопрос, добавив код, в котором вы называете класс базы данных. – fusion3k

0

Вы пытаясь сохранить дескриптор соединения DB в переменной $conn. Но это всего лишь локальная переменная, не свойство класса $conn. Чтобы использовать более позднюю версию, вы должны получить доступ к ней: $this->conn.

Таким образом, ваш метод соединения должно быть что-то вроде

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(); 
    } 
} 

Учитывая, что теперь вы можете использовать $this->conn в других функциях

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(); 
    } 
} 

Другими словами, используя $conn вместо $this->conn делает не см к объекту property $conn, но локальная переменная $conn в методах. Но локальными переменными являются не стойкий. Поэтому, как только вы покинете метод dbConnection() и попытаетесь повторно использовать эту переменную, выбрав одно и то же имя в login(), идентификатор $conn на самом деле относится к двум другим локальным переменным. Это, конечно, означает, что оно не имеет значения в методе login(), что приводит к ошибке, которую вы получаете.

Существуют и другие подходы к этому, такие как «ввод объекта соединения» в ваши методы. Но выше это чистый и обычно предпочтительный подход.

+0

Извините, такое же сообщение об ошибке ...... любая проблема в версии xampp –

+0

ОК, в этом случае может случиться так, что соединение с базой данных просто не работает (почему бы и нет). Ваш код не содержит обнаружение или обработку ошибок для такого инцидента, поэтому он не обнаружен.Поэтому я предлагаю вам: 1. Проверьте свой файл журналов ошибок в http-серверах, в чем проблема (как разработчик php, которому вы всегда должны следить за этим файлом), а затем добавляете обнаружение ошибок и обработку кода. – arkascha

Смежные вопросы