2015-02-18 18 views
10

Próbuję uzyskać dostęp do listy kategorii i ich zawartości. Mam klasę o nazwie Kategorie. Wciąż dostaję ten błąd. Dziwne jest to, że użyłem tego samego kodu w dwóch innych miejscach, bez żadnych problemów. Wszystko, co tu zrobiłem, to ponowne użycie kodu i zmiana wszystkich zmiennych.Błąd krytyczny: wywołanie funkcji członkowskiej prepare() na wartości zerowej

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

Oto kod do mojej klasy:

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

?> 

I Oto kod próbuję zadzwonić:

<?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' nie jest obiektem (jeszcze nie zainicjowanym) po wywołaniu' prepare'. – Jigar

+1

@JandenHale: czy wcześniej zainicjalizowałeś zmienną (globalną) o nazwie '$ pdo'? –

+0

Jest globalny w klasie, przynajmniej myślałem, że to. – ddonche

Odpowiedz

22

Wygląda na to zmienna $pdo nie initilazied. Nie widzę w kodzie przesłanym podczas inicjowania.

Upewnij się, że utworzysz nowy obiekt PDO w global scope przed wywołaniem metod klasy. (powinieneś zadeklarować go w zasięgu globalnym ze względu na sposób implementacji metod w klasie Kategoria).

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

+0

To właśnie tam, mam go w moim pliku konfiguracyjnym jako $ db zamiast $ pdo. Dzięki! – ddonche

0

Można spróbować/catch PDOException s (twoje configs mogą się różnić, ale ważną częścią jest 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); 
    } 

Linia print_r($e); pokaże wszystko, czego potrzeba, aby przykład miałem ostatnio przypadek, w którym komunikat o błędzie był podobny do unknown database 'my_db'.

Powiązane problemy