Errore irreversibile: chiamata a una function membro prepare () su null

Sto cercando di accedere a un elenco di categorie e ai loro contenuti. Ho una class chiamata Categories. Continuo a ricevere questo errore. La cosa strana è che ho usato lo stesso identico codice in altri due posti finora senza problemi. Tutto ciò che ho fatto qui è stato riutilizzare il codice e modificare tutte le variables.

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

Ecco il codice per la mia class:

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

Ed ecco il codice che sto cercando di call:

 <?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'); ?> 

Sembra che la tua variabile $pdo non sia inizializzata. Non riesco a vedere nel codice che hai caricato where lo stai inizializzando.

Assicurati di creare un nuovo object PDO nell'ambito global scope prima di call i methods della class. (dovresti dichiararlo nell'ambito globale a causa di come hai impiantato i methods all'interno della class Category).

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

Puoi provare / catturare PDOException s (le tue PDOException potrebbero essere diverse ma la parte importnte è il 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 ); } 

Il print_r( $e ); line ti mostrerà tutto ciò di cui hai bisogno, per esempio ho avuto un caso recente in cui il messaggio di errore era come il unknown database 'my_db' .