2013-09-18 4 views
1

Я искал, и я не могу найти решение моей проблемы.Неустранимая ошибка: «База данных» не найдена

Всякий раз, когда я пытаюсь начать новый объект $con = new Database();, я получаю эту ошибку:

Fatal error: Class 'Database' not found in /customers/c/6/f/rowweb.dk/httpd.www/toolkit/e/includes/php/db/connect.php on line 3 

Я troubleshooted немного, и он подключается нормально к базе данных. Я даже пытаюсь инициировать объект из того же файла, что и мой класс базы данных.

Вот мой дб подключения:

$con = new Database(); 

class Database extends mysqli { 
    function __construct() { 
     parent::__construct('host', 'username', 'pass', 'database'); 
     if (mysqli_connect_errno()) { 
      throw new Exception(mysqli_connect_error(), 
      mysqli_connect_errno()); 
     } 
    } 
} 

Тот, кто знает, что может быть проблема?

+0

Похоже, вы не включили класс в connect.php ... – Martijn

+0

Включили ли вы файл, содержащий ваш класс? Проверьте, правильно ли он включен и доступен ли с помощью 'class_exists()' –

ответ

1

В PHP классы должны быть объявлены до того, как они могут быть созданы.

От http://php.net/manual/en/language.oop5.basic.php:

new

To create an instance of a class, the new keyword must be used. An object will always be created unless the object has a constructor defined that throws an exception on error. Classes should be defined before instantiation (and in some cases this is a requirement).

С вашего экземпляра и объявления класса происходит в том же файле, и произошла ваша ошибка в строке 3, это очень вероятно, ваша проблема.

+0

Черт, конечно. Глупая ошибка, спасибо, что указали! :) –

1

Если у вас нет другого кода, который не показан здесь, ваша проблема в том, что вы не включили файл, который определяет объект базы данных.

Существует несколько способов сделать это, используя include/include_once или require/require_once или используя автозагрузчик.

Включить & Требовать

Этот метод включения будет, по сути, присоединиться к включаемый файл в текущий файл. Например, если у вас есть файл с именем a.php так:

$varA = 'I am A!'; 

и файл с именем b.php так:

include('a.php'); 
echo $varA; 

... Вы можете написать код в b.php, как если бы код в a.php были в том же файле. Альтернатива include, require, работает точно так же, с одним важным отличием. Если файл include 'd не найден, будет выдано предупреждение. Если файл require 'd не найден, это будет фатальной ошибкой.

Оба варианта имеют вариант *_once. Без него файл добавляется каждый раз, тогда как include_once добавит код только при первом вызове в заданном файле.

Autoloader

Есть два способа добавить автозагрузчик. Автозагрузчик - это «помощник», который направляет ваш скрипт в правильное расположение файла. Этот код выполняется всякий раз, когда вы пытаетесь создать новый класс с использованием ключевого слова new или в некоторых других обстоятельствах.

Один способ автозагрузки использует магическую функцию __autoload. Как правило, не используйте это. Альтернативой является spl_autoload_register [docs], который регистрирует данную функцию как «помощник». Если у вас нет конкретной причины не использовать этот подход, вам следует.

Вот простой пример, прямо из документации:

function my_autoloader($class) { 
    include 'classes/' . $class . '.class.php'; 
} 
spl_autoload_register('my_autoloader'); 

Documentation

+0

Но это не то, что я здесь делаю: '$ con = new Database();'? Все это в моем файле-подключении, который является 'require_once ('path')' on index, и находится в правильном пути, так как у него нет проблем с подключением к моей базе данных. –

+0

@JensAagren Не видя этого кода, как я мог бы его решить !? :) Почему бы вам не опубликовать весь соответствующий код в вашем вопросе, и я еще раз посмотрю. Чтобы ответить на ваш вопрос, '$ con = new Database();' не совпадает с включением соответствующего файла, no. Не без автозагрузчика! –

+0

Ну, это в блоке кода в моем оригинальном посте. Да, я забыл добавить его в первый пост, но он был отредактирован несколько через 10 секунд. –

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