Неустранимая ошибка: вызов функции-члена prepare() на null

Я пытаюсь получить доступ к списку категорий и их содержимому. У меня есть класс под названием "Категории". Я продолжаю получать эту ошибку. Странно то, что я использовал этот же точный код в двух других местах до сих пор без проблем. Все, что я сделал здесь, это повторное использование кода и изменение всех переменных.

Fatal error: Call to a member function prepare() on null

Вот код для моего класса:

    <?php

class Category {
    public function fetch_all() {
        global $pdo;

        $query = $pdo->prepare("SELECT * FROM dd_cat");
        $query->execute();

        return $query->fetchAll();
    }

    public function fetch_data($cat_id) {
        global $pdo;

        $query = $pdo->prepare("SELECT * FROM dd_cat WHERE cat_id = ?");
        $query->bindValue(1, $cat_id);
        $query->execute();

        return $query->fetch();
    }
}

?>

И вот код, который я пытаюсь вызвать:

<?php
session_start();
//Add session_start to top of each page//
require_once('includes/config.php');
require_once('includes/header.php');
include_once('includes/category.php');

?>
<link rel="stylesheet" href="css/dd.css">
    <div id="menu">
        <a class="item" href="drop_index.php">Home</a> -
        <a class="item" href="create_topic.php">Create a topic</a> -
        <a class="item" href="create_cat.php">Create a category</a>
        <div id="userbar">
<?php
    if( $user->is_logged_in() )
    {
        echo 'Hello ' . $_SESSION['user_name'] . '. Not you? <a href="logout.php">Sign out</a>';
    }
    else
    {
        echo '<a href="login.php">Sign in</a> or <a href="index.php">create an account</a>.';
    } 
?>
        </div>
    </div>

<?php

$category = new Category;
$categories = $category->fetch_all();

?>
    <div id ="wrapper">
        <h1>Categories</h1>
        <section>
            <ul>
                <?php foreach ($categories as $category) { ?>
                    <li><a href="category.php?id=<?php echo $category['cat_id']; ?>">
                        <?php echo $category['cat_title']; ?></a> 
                    </li>
                <?php } ?>
            </ul>
        </section>
    </div>
<?php
require_once('includes/footer.php');
?>

Ответ 1

Похоже, что ваша переменная $pdo не инициализирована. Я не вижу в коде, который вы загрузили, где вы его инициализируете.

Перед вызовом методов класса убедитесь, что вы создали новый объект PDO в global scope. (вы должны объявить его в глобальной области действия из-за того, как вы ввели методы внутри класса Category).

$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

Ответ 2

Вы можете попробовать/уловить PDOException (ваши конфигурации могут отличаться, но важной частью является try/catch):

try {
        $dbh = new PDO(
            DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET,
            DB_USER,
            DB_PASS,
            [
                PDO::ATTR_PERSISTENT            => true,
                PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
                PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES ' . DB_CHARSET . ' COLLATE ' . DB_COLLATE

            ]
        );
    } catch ( PDOException $e ) {
        echo 'ERROR!';
        print_r( $e );
    }

Строка print_r( $e ); покажет вам все, что вам нужно, например, у меня был недавний случай, когда сообщение об ошибке было похоже на unknown database 'my_db'.