2013-09-05 4 views
-1

У меня есть это, ошибка (И да, я искал его, но не нашел никаких решений).PDO prepare() error

Fatal error: Call to a member function prepare() on a non-object in C:\inetpub\oop\_classes\class.users.php on line 19 

Class.users.php:

<?php 
include_once("class.db.php"); 

class Users { 

    protected $vpanel; 

    public function __construct() { 

     $this->vpanel = new Database(); 
     $this->vpanel = $this->vpanel->dbConnection(); 

    } 

    public function Login($username, $password) { 

     if(!empty($username) || !empty($password)) { 

      $sth = $this->vpanel->prepare("SELECT * FROM `users` WHERE `username` = ? AND `password` = ?"); 
      $sth->bindParam(1, $username); 
      $sth->bindParam(2, $password); 
      $sth->execute(); 

      if($sth->rowCount() == 1) { 

       echo "Correct details."; 

      } else { 

       echo "Incorrect details."; 

      } 


     } else { 

      echo "Fill out all the fields."; 

     } 
    } 
} ?> 

class.db.php:

<?php 

class Database { 

    public function dbConnection() { 

     $dbhost = "localhost"; 
     $dbname = "DBNAME"; 
     $dbusername = "DBUSERNAME"; 
     $dbpass = "PASSWORD"; 

     try { 

      $this->vpanel = new PDO("mysql:host".$dbhost.";dbname=".$dbname."", $dbusername, $dbpass); 
      $this->vpanel->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     } catch(PDOException $e) { 

      echo $e->getMessage() . " (class.core.php) "; 

     } 

    } 
} ?> 

global.php:

<?php 

session_start(); 

ini_set('display_errors', 1); 

require_once $_SERVER['DOCUMENT_ROOT'] . "/_includes/config.php"; 

try { 

    $vpanel = new PDO("mysql:host".$Config['db']['host'].";dbname=".$Config['db']['dbname']."", $Config['db']['uname'], $Config['db']['pass']); 

} catch(PDOException $e) { 

    echo $e->getMessage(); 

} 

require_once $_SERVER['DOCUMENT_ROOT'] . "/_classes/class.db.php"; 
require_once $_SERVER['DOCUMENT_ROOT'] . "/_classes/class.users.php"; 

$database = new Database(); 
$users = new Users(); ?> 

Я не знаю, Что неправильно, я новичок в методах PDO (и некоторых ООП) ... так ... спасибо.

+0

'$ this-> vpanel = $ this-> vpanel-> DBConnection()' присвоит '' NULL' до $ this-> vpanel' после 'dbConnection()' заканчивается, так как он ничего не возвращает. – DCoder

+0

, если вы успешно установили соединение с вашей базой данных mysql, тогда запрос, который вы запускаете, возвращает false, следовательно, сбой –

+0

Кстати, избавьтесь от этого файла try..catch. это бесполезно и подвержена ошибкам здесь –

ответ

0

Ваше dbConnection ничего не возвращает. Вам нужно, чтобы он возвращал $ this-> vpanel, так что Users -> __ construct может назначить его переменной класса.

public function dbConnection() { 

    $dbhost = "localhost"; 
    $dbname = "DBNAME"; 
    $dbusername = "DBUSERNAME"; 
    $dbpass = "PASSWORD"; 

    try { 

     $this->vpanel = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpass); 
     $this->vpanel->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     return $this->vpanel; 
    } catch(PDOException $e) { 

     echo $e->getMessage() . " (class.core.php) "; 
     return false; 
    } 
} 

И ваш Логин Функция:

public function Login($username, $password) { 

    if($this->vpanel === false){ 
     echo "There is no database connection."; 
     return false; 
    } 

    if(!empty($username) && !empty($password)) { 

     $sth = $this->vpanel->prepare("SELECT * FROM `users` WHERE `username` = ? AND `password` = ?"); 
     $sth->bindParam(1, $username); 
     $sth->bindParam(2, $password); 
     $sth->execute(); 

     if($sth->rowCount() == 1) { 

      echo "Correct details."; 

     } else { 

      echo "Incorrect details."; 

     } 


    } else { 

     echo "Fill out all the fields."; 

    } 
} 
+0

Это не единственная причина для сбоя prepare() –

+0

Неустранимая ошибка: Не удалось исключить «PDOException» с сообщением «SQLSTATE [3D000]: Недопустимое имя каталога: 1046 В базе данных не выбрана база данных: \ inetpub \ oop \ _classes \ class.users.php: 21 Трассировка стека: # 0 C: \ inetpub \ oop \ _classes \ class.users.php (21): PDOStatement-> execute() # 1 C: \ inetpub \ oop \ index.php (10): Users-> Login ('d', 'd') # 2 {main} брошен в C: \ inetpub \ oop \ _classes \ class.users.php в строке 21 – user2722718

+0

Честно говоря, я «Я удивлен, что вы не получаете ошибку на своем улове внутри dbConnection. Я изменил строку «новый PDO», чтобы он действительно подключался к базе данных. Я также добавил проверку внутри вашей функции входа, чтобы проверить, существует ли соединение с базой данных. – aynber

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