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">&laquo; 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 :

https://www.zupimages.net/viewer.php?id=23/15/sfjh.png

10 réponses


Carouge10
Réponse acceptée

de rien, n'oublie pas de passer le sujet en résolu

bonjour

relis la requête en question. tu as des caractères en trop

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];

ce n'est pas cette ligne qui pose soucis.
c'est celle avec sélect

Mais dans quel page le select ? show.php ?

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

Merci tu est un genie ;) je chercher depuis ce matin ...

c'est fait merci