problème sql
- Accueil
- Forum
- Programmation
- SQL
- problème sql
lecteursdb Le 19 août 2016 à 13:59 (Édité le 25 janvier 2019 à 17:52)
J'obtiens l'erreur suivante :
Fatal error: Call to a member function fetch_object() on a non-object in ...\projet_son\pages\articles.php on line 76
par rapport au code ci-dessous:
<?php
require "includes/connect_db.php";
$req = $db->query('SELECT id FROM lisy_posts');
$nbre_total_articles = $req->rowCount();
$nbre_articles_par_page = 12;
$nbre_pages_max_gauche_et_droite = 4;
$last_page = ceil($nbre_total_articles / $nbre_articles_par_page);
if(isset($_GET['page']) && is_numeric($_GET['page'])){
$page_num = $_GET['page'];
} else {
$page_num = 1;
}
if($page_num < 1){
$page_num = 1;
} else if($page_num > $last_page) {
$page_num = $last_page;
}
$limit = 'LIMIT'.($page_num - 1) * $nbre_articles_par_page. ',' . $nbre_articles_par_page;
//Cette requête sera utilisée plus tard
$sql = "SELECT *
FROM lisy-posts ORDER BY id DESC $limit";
$pagination = '';
if($last_page != 1){
if($page_num > 1){
$previous = $page_num - 1;
$pagination .= '<a href="index.php?page='.$previous.'">Précédent</a> ';
for($i = $page_num - $nbre_pages_max_gauche_et_droite; $i < $page_num; $i++){
if($i > 0){
$pagination .= '<a href="index.php?page='.$i.'">'.$i.'</a> ';
}
}
}
$pagination .= '<span class="active">'.$page_num.'</span> ';
for($i = $page_num+1; $i <= $last_page; $i++){
$pagination .= '<a href="index.php?page='.$i.'">'.$i.'</a> ';
if($i >= $page_num + $nbre_pages_max_gauche_et_droite){
break;
}
}
if($page_num != $last_page){
$next = $page_num + 1;
$pagination .= '<a href="index.php?page='.$next.'">Suivant</a> ';
}
}
?>
<!-- Blog Content
================================================== -->
<div class="row">
<!-- Blog Posts
================================================== -->
<div class="span8 blog">
<!-- Blog Post 1 -->
<?php
echo "<p><strong>($nbre_total_articles)</strong> articles au total !<br/>";
echo "Page <b>$page_num</b> sur <b>$last_page</a>";
$req = $db->query($sql);
while($data = $req->fetch_object()){
echo '<div class="post"><b>'.$data['title'].'</b><br/>'.$data['content'].'<br/>Publié le '.$data['date'].'</div>';
}
echo '<div id="pagination">'.$pagination.'</div>';
$req->closeCursor();
?>
La connexion à la BDD est bien établie par
<?php
try{
$db = new PDO('mysql:host=******;dbname=*****', '****', '*****');
} catch(PDOException $e){
die('Erreur: '.$e->getMessage());
}
?>
les étoiles ne sont, bien entendu, pas dans mon code...
Merci d'avance pour votre aide
TheOldNoob Le 19 août 2016 à 18:27 (Édité le 1 janvier 1970 à 01:00)
Essais ça pour afficher plus d'erreur :
$db = new PDO('mysql:host=******;dbname=*****', '****', '*****', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
lecteursdb Le 19 août 2016 à 18:42 (Édité le 1 janvier 1970 à 01:00)
TheOldNoob Le 19 août 2016 à 19:03 (Édité le 1 janvier 1970 à 01:00)
lecteursdb Le 19 août 2016 à 23:27 (Édité le 1 janvier 1970 à 01:00)
$req = $db->query($sql);
TheFlameflo Le 20 août 2016 à 00:13 (Édité le 1 janvier 1970 à 01:00)
Tu peux toujours essayer un try/catch sur la requête.
Sinon, j'ai regardé la variable $limit et on dirait que la contenu est celui-ci : LIMITunNombre,deuxiemeNombre.
Je ne sais pas s'il y a un lien entre le faire qu'il n'y a pas d'espace entre le LIMIT et le premier nombre, mais tu peux toujours essayer.
Si ça ne fonctionne pas, essaye quand même le try/catch, ça pourrait donner la raison de l'erreur ! 😄
J’espère t'avoir aidé !
Bonne chance ! 😉
TheOldNoob Le 20 août 2016 à 00:15 (Édité le 20 août 2016 à 00:26)
Je viens de voir la même chose, je me demande si ça vien pas juste de la.
Normalement tu doit écrire 'LIMITE 10,20' pour afficher les resultat de 10 a 20, la tu dit 'LIMIT10,20', ça va forcement créer une erreur
Jeannot avait eu la même erreur dans son systeme de pagination.
lecteursdb Le 20 août 2016 à 14:35 (Édité le 1 janvier 1970 à 01:00)
'Pouvez-vous m'indiquer svp comment utiliser ce try/catch cas le cas présent ? avec ou sans espace au niveau du $limit le problème reste le même...
lecteursdb Le 23 août 2016 à 14:06 (Édité le 1 janvier 1970 à 01:00)
Ce que j'ai fais c'est modifier ma requete après le "$limit"
$sql = "SELECT * FROM lisy-posts ORDER BY id DESC $limit";
en
$sql = "SELECT id, title, content, DATE_FORMAT(date,'%d/%m/%Y à %Hh%imin%ss') as date FROM lisy_posts ORDER BY id DESC $limit";
et également le
$req->fetch_object()
en
$req->fetch()
et ma pagination s'est affichée normalement sans erreurs...
Voici le nouveau code:
<?php
require "includes/f-connect.php";
$req = $db->query('SELECT id FROM lisy_posts');
$nbre_total_articles = $req->rowCount();
$nbre_articles_par_page = 2;
$nbre_pages_max_gauche_et_droite = 4;
$last_page = ceil($nbre_total_articles / $nbre_articles_par_page);
if(isset($_GET['page']) && is_numeric($_GET['page'])){
$page_num = $_GET['page'];
} else {
$page_num = 1;
}
if($page_num < 1){
$page_num = 1;
} else if($page_num > $last_page) {
$page_num = $last_page;
}
$limit = 'LIMIT '.($page_num - 1) * $nbre_articles_par_page. ',' . $nbre_articles_par_page;
//Cette requête sera utilisée plus tard
$sql = "SELECT id, title, content, DATE_FORMAT(date,'%d/%m/%Y à %Hh%imin%ss') as date FROM lisy_posts ORDER BY id DESC $limit";
$pagination = '';
if($last_page != 1){
if($page_num > 1){
$previous = $page_num - 1;
$pagination .= '<a href="articles.php?page='.$previous.'">Précédent</a> ';
for($i = $page_num - $nbre_pages_max_gauche_et_droite; $i < $page_num; $i++){
if($i > 0){
$pagination .= '<a href="articles.php?page='.$i.'">'.$i.'</a> ';
}
}
}
$pagination .= '<span class="active">'.$page_num.'</span> ';
for($i = $page_num+1; $i <= $last_page; $i++){
$pagination .= '<a href="articles.php?page='.$i.'">'.$i.'</a> ';
if($i >= $page_num + $nbre_pages_max_gauche_et_droite){
break;
}
}
if($page_num != $last_page){
$next = $page_num + 1;
$pagination .= '<a href="articles.php?page='.$next.'">Suivant</a> ';
}
}
?>
<!-- Blog Content
================================================== -->
<div class="row">
<!-- Blog Posts
================================================== -->
<div class="span8 blog">
<!-- Blog Post 1 -->
<?php
echo "<p><strong>($nbre_total_articles)</strong> articles au total !<br/>";
echo "Page <b>$page_num</b> sur <b>$last_page</a>";
$req = $db->query($sql);
while($data = $req->fetch()){
echo '<div class="post"><b>'.$data['title'].'</b><br/>'.$data['content'].'<br/>Publié le '.$data['date'].'</div>';
}
echo '<div id="pagination">'.$pagination.'</div>';
$req->closeCursor();
?>
Cependant je rencontre un nouveau problème avec les liens de ma pagination, ils
ne me renvoient pas à la page désirée.
Par exemple si je suis à la page 1, je clique sur la page 2 mais je suis renvoyé vers une page qui n'existe pas. Idem pour les autres pages
Je rappelle que je travail suivant une architecture MVC basique. Ma page articles.php se situe dans un dossier pages, qui lui même est situé dans le dossier principal de mon site, au même
niveau de ce dossier pages se trouve mon dossier index.php par lequel toutes les autres pages du site sont générées. Exemple:
dossier_du_site(
index.php
dossier pages(
articles.php)
)
merci de votre aide
lecteursdb Le 31 août 2016 à 09:10 (Édité le 1 janvier 1970 à 01:00)
Problème résolu (solution trouvée dans un autre forum...Dans la structure de mon site, j'ai une page index dans laquelle j'ai défini des feuilles de style et qui inclus les autres pages de mon site avec du php.
La seule page que devrait voir le navigateur, c'est donc ma page index (avec les paramètres nécessaires pour inclure les contenus à afficher).
Si dans mon lien j'indique au navigateur d'ouvrir ma page article, le navigateur va l'ouvrir directement sans passer par ma page index et donc sans effectuer les traitements de cette dernière.
Mon lien devrait être quelque chose du genre <a href=\"indexphp?page=articles&num=$i\">$i</a>. j'appelerais ainsi la page index.php en lui demandant d'ouvrir / inclure le contenu de articles.php, ce script ayant alors accès à $_GET['num'] pour savoir quel numéro de page afficher. Si cela pourrait aider d'autres...cordialement