2015-02-18 14 views
10

Ich versuche, auf eine Liste von Kategorien und deren Inhalt zuzugreifen. Ich habe eine Klasse namens Kategorien. Ich bekomme diesen Fehler immer wieder. Das Seltsame ist, dass ich denselben genauen Code bisher an zwei anderen Orten ohne Probleme verwendet habe. Alles, was ich hier getan habe, war, den Code wiederzuverwenden und alle Variablen zu ändern.Schwerwiegender Fehler: Aufruf einer Memberfunktion prepare() auf Null

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

Hier ist der Code zu meiner Klasse:

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

?> 

Und hier ist der Code, den ich anrufen versuche:

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

'var_dump ($ pdo)', '$ pdo' ist kein Objekt (noch nicht initialisiert), wenn' prepare' aufgerufen wird. – Jigar

+1

@JandenHale: Haben Sie vorher eine (globale) Variable mit dem Namen '$ pdo' initialisiert? –

+0

Es ist global in der Klasse, zumindest dachte ich es war. – ddonche

Antwort

22

Es sieht aus wie Ihre $pdo Variable initilazied nicht. Ich kann nicht sehen, in dem Code, den Sie hochgeladen haben, wo Sie es initialisieren.

Stellen Sie sicher, dass Sie ein neues PDO-Objekt in der global scope erstellen, bevor Sie die Klassenmethoden aufrufen. (Sie sollten es im globalen Gültigkeitsbereich deklarieren, weil Sie die Methoden in der Category-Klasse implementiert haben).

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

+0

Das ist es richtig, ich habe es in meiner Konfigurationsdatei als $ db anstelle von $ pdo. Vielen Dank! – ddonche

0

Sie können versuchen,/catch PDOException s (Ihre configs könnte unterscheiden, aber der wichtige Teil ist die 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); 
    } 

Die print_r($e); Linie zeigt Ihnen alles, was Sie brauchen, für Beispiel Ich hatte kürzlich einen Fall, in dem die Fehlermeldung wie unknown database 'my_db' war.

Verwandte Themen