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();
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
Le modèle \ Core \ passe le '$ this-> db' de sa fonction de construction dans la classe de base de données. – Craig
le message d'erreur indique explicitement autrement. Le constructeur parent doit être appelé explicitement pour qu'il s'exécute du tout. – Calimero