2017-09-25 11 views
1

Je suis récemment tombé sur le besoin de la pagination et je vais l'utiliser un peu, donc je me suis dit qu'un cours serait parfait, pour une raison lorsque je tente d'utiliser un __construct je reçois l'erreur fatale:Appel à une fonction membre prepare() sur null si la fonction __construct est présente

Call to a member function prepare() on null Thrown in '\App\Helpers\PaginationHelper.php' on line 31

ligne 31 est la suivante:

$sth = $this->db->prepare('SELECT * FROM '. $this->table_name .' ORDER BY id LIMIT :page_first_result, :per_page');

dans la fonction retrieveData.

C'est un gros désordre car je ne fais que commencer mais pour la vie de moi je ne peux pas comprendre cette erreur, j'ai lu quelques autres questions qui ont la même erreur, mais ils sont tous liés à PDO pas connexion, contrairement à ce problème.

\ Core \ Modèle étend juste une connexion pdo

class PaginationHelper extends \Core\Model { 

    public $results = []; 
    public $tabs = ''; 
    public $set_data; 
    public $table_name; 
    public $results_per_page; 

    public function __construct($sd){ 
     $this->set_data = $sd; 
    } 

    public function table_name($tn){ 
     $this->table_name = $tn; 
    } 

    public function results_per_page($rpp){ 
     $this->results_per_page = $rpp; 
    } 

    public function retrieveData($page_first_result, $per_page){ 
     $sth = $this->db->prepare('SELECT * FROM '. $this->table_name .' ORDER BY id LIMIT :page_first_result, :per_page'); 
     $sth->bindValue(':page_first_result', $page_first_result, PDO::PARAM_INT); 
     $sth->bindValue(':per_page', $per_page, PDO::PARAM_INT); 
     $sth->execute(); 

     return $sth->fetchAll(PDO::FETCH_ASSOC); 
    } 

    public function getResults(){ 
     $number_of_results = $this->set_data; 

     $this->number_of_pages = ceil(count($number_of_results)/$this->results_per_page); 

     // determine which page number visitor is currently on 
     if (!isset($_GET['pagination'])) { 
      $this->page = 1; 
     } else { 
      $this->page = $_GET['pagination']; 
     } 

     $this_page_first_result = ($this->page - 1) * $this->results_per_page; 

     $fetch = $this->retrieveData($this_page_first_result, $this->results_per_page); 

     foreach($fetch as $data){ 
      $this->results[] = $data; 
     } 

     return $this; 
    } 

    public function loopResults(){ 
     return $this->results; 
    } 

    public function getTabs(){ 

     if($this->page == 1){ 
      $this->back = $this->page; 
     } else { 
      $this->back = $this->page-1; 
     } 

     if($this->page == $this->number_of_pages){ 
      $this->next = $this->page; 
     } else { 
      $this->next = $this->page + 1; 
     } 

     $this->tabs .= ' 
      <div class="pagination"> 
       <a class="pagination__buttons-href" href="?pagination='.$this->back.'"><span class="pagination__buttons flaticon-keyboard-left-arrow-button"></span></a> 
       <span class="pagination__current_page"> '. $this->page .' </span> 
       <a class="pagination__buttons-href" href="?pagination='. $this->next .'"><span class="pagination__buttons flaticon-keyboard-right-arrow-button"></span></a> 
      </div> 
     '; 

     return $this->tabs; 
    } 
} 

Maintenant, voici quelque chose d'intéressant: Si je supprime le __construct function, et créer une nouvelle méthode pour mettre la propriété set_data de $ comme ci-dessous, tout fonctionne parfaitement .

public function set_data($sd){ 
    $this->set_data = $sd; 
} 

Voici comment j'appelle la classe:

Voici comment j'appelle la classe avec la fonction set_data:

$pagination = new PaginationHelper(); 
$pagination->set_data($array_data); 
$pagination->table_name('recipe'); 
$pagination->results_per_page(20); 
$pagination->getResults(); 
+2

vous devez lancer '$ this-> db' correctement, peut-être dans le constructeur. Pour l'instant c'est juste une propriété non initialisée (et non déclarée) – Calimero

+0

Le modèle \ Core \ passe le '$ this-> db' de sa fonction de construction dans la classe de base de données. – Craig

+2

le message d'erreur indique explicitement autrement. Le constructeur parent doit être appelé explicitement pour qu'il s'exécute du tout. – Calimero

Répondre

3

Si vous définissez votre propre constructeur, le constructeur du parent ne sera pas appelé automatiquement.

Essayez de faire ceci:

public function __construct($sd){ 
    parent::__construct(); 
    $this->set_data = $sd; 
} 

citation directe de la documentation (http://php.net/manual/en/language.oop5.decon.php):

Note: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required. If the child does not define a constructor then it may be inherited from the parent class just like a normal class method (if it was not declared as private).

3

Lorsque vous étendez une classe et une __constructor() fonction, vous devez appeler le constructeur de son parent ainsi:

parent::__construct(); 

Si vous sautez e est la ligne, le constructeur \ Core \ Model n'est jamais appelé. Si vous supprimez le constructeur, il est appelé automatiquement.

1

essayez celui-ci

public function __construct($sd){ 
parent::__construct(); 
$this->set_data = $sd; 

}

appelez le constructeur parent manuellement