Bonjour les Grafikarts,

Voila je rencontre un petit problème avec mon code que je ne comprend pas. J'ai repris le tuto plusieurs fois pour voir si je peut reussir et comparer apres mais nada. Il s'agit du TP du chapitre 38 su le PHP.
Voici l'erreur qu'affiche le navigateur:
Erreur fatale : Uncaught PDOException: SQLSTATE [HY000]: Erreur générale: 1 aucune colonne de ce type: nameasc dans C: \ xampp \ htdocs \ TP0 \ index.php: 40 Trace de pile: # 0 C: \ xampp \ htdocs \ TP0 \ index .php (40): PDO-> prepare ('SELECT * FROM ...') # 1 {main} jeté dans C: \ xampp \ htdocs \ TP0 \ index.php à la ligne 40
la ligne 40 fait referance a la 11,j'ai commente ces deux dans le code.Merci d'avance.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

<?php
use App\NumberHel;
use App\URLHel;
define('PER_PAGE', 20);

require 'vendor/autoload.php';
$pdo = new PDO("sqlite:./data.sql",null, null, [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$query = " SELECT * FROM products ";//la ligne 40 fait refereance a cette ligne
$queryCount = "SELECT COUNT(id) as count FROM products";
$params = [];
$sortable = ["id","name","city","price","address"];
//recherche par ville
if(!empty($_GET['q'])){
    $query.= " WHERE city LIKE :city";
    $queryCount .= " WHERE city LIKE :city";
    $params['city'] ='%' . $_GET['q'] .'%';
}
//fin de rechercher par ville

//organisation
if(!empty($_GET['sort']) && in_array($_GET['sort'], $sortable)){
    $direction = $_GET['dir'] ?? 'asc';
    if(!in_array($direction,['asc','desc'])){
        $direction = 'asc';
    }
    $query .= " ORDER BY " . $_GET['sort'] . "$direction";
}

//pagination
$page = (int)($_GET['p'] ?? 1);
$offset = 0;
if($page > 1){
    $offset = ($page-1)*PER_PAGE;
}

$query .= " LIMIT " .PER_PAGE ." OFFSET $offset";
$statement = $pdo->prepare($query); // c'est ici la ligne 40
$statement ->execute($params);
$products = $statement->fetchAll();

$statement = $pdo->prepare($queryCount);
$statement->execute($params);
$count = $statement->fetch()['count'];
$pages = ceil($count / PER_PAGE);

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="bootstrap.min.css">
    <title>immobiliers</title>
</head>
<body class="p-4">
<h1>Immobilier</h1>
<form action="">
<div class="form-group mb-3">
<input type="text" class="form-control" name="q" placeholder="Recherhe par ville" value=<?= htmlentities($_GET['q'] ?? null) ?>>
</div>
<button class="btn btn-primary mb-2">Recherche</button>
</form>
    <table class="table table-striped">
        <thead>
            <tr>
                <th>ID</th>
                <th>Nom</th>
                <th>Prix</th>
                <th>Ville</th>
                <th>Adresse</th>
            </tr>
        </thead>
        <tbody>
        <?php foreach($products as $product):?>
         <tr>
            <td>#<?= $product['id']?></td>
            <td><?= $product['name']?></td>
            <td><?= NumberHel::price($product['price'])?></td>
            <td><?= $product['city']?></td>
            <td><?= $product['address']?></td>
         </tr>
         <?php endforeach ?>
        </tbody>
    </table>
    <?php if($pages > 1 && $page > 1): ?>
        <a href="?<?= URLHel::withParam("p",$page - 1)?>" class="btn btn-primary">Page precedente</a>
    <?php endif ?>
    <?php if($pages > 1 && $page < $pages): ?>
        <a href="?<?= URLhel::withParam("p",$page + 1)?>" class="btn btn-primary">Page suivante</a>
    <?php endif ?>
</body>
</html>

Ce que je veux

Décrivez ici ce que vous cherchez à obtenir

Ce que j'obtiens

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

8 réponses


Carouge10
Réponse acceptée

Bonjour,
Une nouvelle fois, un problème d'espace....

merciful
Auteur
Réponse acceptée

Sans blague j'ai compris que le SQL n'aime pas etre coinser.desoler j'ai un clavier Anglais

Carouge10
Réponse acceptée

c'est ce que l'erreur dit .....
perso c'est des mots propre à SQL ( comme "SELECT", "FROM", "ASC", "AS", "LIMIT", "WHERE", "LIKE", "SUM()"....) je les écrit en majuscules, ce qui me permet de voir plus rapidement mon erreur

merciful
Auteur
Réponse acceptée

Merci infiniment courage 10 tu m'as sauver enormement. En fait je mettais l'espace la ou je ne devais pas.Il s'agit en faite de la ou j'ai defini "asc et desc ".Merci encore.

Carouge10
Réponse acceptée

super, passe ton sujet en résolu

merciful
Auteur

mais j'ai ajuster en vain

rien compris. As-tu ajouté l'espace manquant pour séparer "name" de "asc" ?

merciful
Auteur

ok donc c'est laba merci,moi je le faisais au niveau de SELECT * FROM.
Merci encore.Je pense que le probleme se trouve laba