Bonjour
J'ai un soucis de syntaxe dans mon code pourtant je n'aie pas l'impression d'avoir un soucis...
Sur mon navigateur j'ai cette erreur :
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' . 4' at line 1
Je suis a 13:57 de la vidéo :
https://grafikart.fr/tutoriels/tp-pagination-refactor-php-1170#autoplay
Mon fichier src/PaginatedQuery.php
<?php
namespace App;
use \PDO;
class PaginatedQuery {
private $query;
private $queryCount;
private $classMapping;
private $pdo;
private $perPage;
public function __construct(string $query, string $queryCount, string $classMapping, ?\PDO $pdo = null, int $perPage = 12) {
$this->query = $query;
$this->queryCount = $queryCount;
$this->classMapping = $classMapping;
$this->pdo = $pdo ?: Connection::getPDO();
$this->perPage = $perPage;
}
public function getItems(): array {
$currentPage = URL::getPositiveInt('page', 1);
$count = (int)$this->pdo
->query( $this->queryCount)
->fetch(PDO::FETCH_NUM)[0];
$pages = ceil($count / $this->perPage);
if ($currentPage > $pages) {
throw new Exception('Cette page existe pas');
}
$offset = $this->perPage * ($currentPage - 1);
return $this->pdo->query(
$this->query .
" LIMIT {$this->perPage} OFFSET $offset ")
->fetchAll(PDO::FETCH_CLASS, $this->classMapping);
}
}
Mon fichier views/category/show.php
<?php
use App\Connection;
use App\Model\{Category, Post};
use App\PaginatedQuery;
$id = (int)$params['id'];
$slug = $params['slug'];
$pdo = Connection::getPDO();
$query = $pdo->prepare(('SELECT * FROM category WHERE id = :id'));
$query->execute(['id' => $id]);
$query->setFetchMode(PDO::FETCH_CLASS, Category::class);
/** @var Category|false */
$category = $query->fetch();
//dd($post);
// si aucun article est trouver
if ($category === false) {
throw new Exception('Aucune catgéforie ne correspont à cet ID');
}
// Permet de rediriger l'url vers le bon slug
if ($category->getSlug() !== $slug) {
$url = $router->url('category', ['slug' => $category->getSlug(), 'id' => $id]);
http_response_code(301);
header('Location ' . $url);
}
$title = "Catégorie {$category->getName()}";
$paginatedQuery = new PaginatedQuery(
"SELECT p.*
FROM post p
JOIN post_category pc ON pc.post_id = p.id;
WHERE pc.category_id = {$category->getID()}
ORDER BY created_at DESC ;",
"SELECT COUNT(category_id) FROM post_category WHERE category_id = ' . {$category->getID()}",
Post::class
);
/** @var Post[] */
$posts = $paginatedQuery->getItems();
dd($posts);
$link = $router->url('category', ['id' => $category->getID(), 'slug' => $category->getSlug()]);
?>
<h1> <?= $title; ?> </h1>
<div class="row">
<?php foreach ($posts as $post) : ?>
<div class="col-md-3">
<?php require dirname (__DIR__) . '/post/card.php' ?>
</div>
<?php endforeach ?>
</div>
<div class="d-flex justify-content-between my-4">
<?php if ($currentPage > 1) : ?>
<?php
$link = $router->url('home');
$l = $link;
if ($currentPage > 2 ) $l = $link . '?page=' . ($currentPage - 1); ?>
<a href="<?= $l ?>" class="btn btn-primary">« Page précédente </a>
<?php endif ?>
<?php if ($currentPage < $pages ): ?>
<a href="<?= $link ?>?page=<?= $currentPage + 1 ?>" class="btn btn-primary"> Page suivante </a>
<?php endif ?>
</div>
L'image de l'erreur sur mon navigateur :
je ne voit pas le caracter en trop honnetement sur cetet requete
$currentPage = URL::getPositiveInt('page', 1);
$count = $this->pdo->query($this->queryCount)
->fetch(PDO::FETCH_NUM)[0];
dans quel code tu as un SELECT COUNT.... ?
ligne 38 je crois d'après ton sujet sur le forum ocr
Mon select count est dans la page views/category/show.php à la ligne 44
l'erreur a la ligne 38 ets dans le fichier src/PaginatedQuery.php
sauf que php t'indique toujours la dernière erreur rencontrolé et pas forcément là où elle est vraiment
"SELECT COUNT(category_id) FROM post_category WHERE category_id = ' . {$category->getID()}"
cette requête est fausse