Page 1 sur 1

Probleme function fetch on boolean

Posté : 08 févr. 2017, 17:43
par Nosperato
Bonjour, je viens à vous car j'ai un petit problème et avec toute mes recherches je n'ai rien trouvé pour pouvoir résoudre mon problème ou du moins l'implémenter à mon code. J'ai réalisé un tableau avec pour objectif de récupérer mes données de ma base de données et de les affichés dans mon tableau selon leur section et j'ai essayé de mettre en place une pagination sauf que j'ai une erreur :

Fatal error: Call to a member function fetch() on boolean in C:\wamp64\www\Jeux\index.php on line 54


Voici mon code entier :

Code à la connexion de la base de donnée :
<?php

$username = "root";
$password = "";
$hostname = "localhost";
$namebase = "jeux";
// on tente la connexion à la base de donnée
try
{
    $db = new PDO('mysql:host='.$hostname.';dbname='.$namebase.'', $username, $password);
}
catch (Exception $e)
{
    // En cas d'erreur, on affiche un message et on arrête tout
    die('Erreur : ' . $e->getMessage());
}
// Si tout va bien, on peut continuer
echo "la connexion a reussie.";


?>

Mon script :
<?php
if(isset($_GET['pp']) && !empty($_GET['pp']) && ctype_digit($_GET['pp']) == 1){
    $page = $_GET['pp'];

}else{

    $page = 5;
}

$req = $db->query("SELECT COUNT(*) AS total FROM items_hippique");
$resultat = $req -> fetch();
$total = $resultat['total'];


$nbPage = ceil($total/$page);

echo $nbPage;

if (isset($_GET['p']) && !empty($_GET['p']) && ctype_digit($_GET['p']) == 1){
    if($_GET['p'] > $nbPage){
        $current=$nbPage;
    }else{
        $current=$_GET['p'];
    }
}else{
    $current=1;
}

$page1 = ($current-1)*$page;

$reqItem = $db->query("SELECT * FROM items_hippique ORDER BY id ASC LIMIT $page1, $page");

var_dump($reqItem);
?>


Et voici mon code index.php où j'ai l'erreur à la ligne 54 ainsi j'ai aussi d'autre erreur $reqItem et $current me dit que c'est des variables qui ne sont pas définis alors que j'inclus mes fichiers php.
<?php

include ("connection.php");
include ("script.php");

?>

<meta charset="utf-8">

<!DOCTYPE html>
<html lang="fr">
<head>
    <title>Bootstrap Example</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<form method="get">

    <label>Nombre d'item par page:</label>
    <select name="pp">
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
    </select>
    <input type="hidden" name="p" value="<?php echo $current ?>">
    <button class ="btn btn-primary btn-xs" type="submit">Appliquer</button>




</form>
<div class="container">
    <h2>Bordered Table</h2>
    <p>The .table-bordered class adds borders to a table:</p>
    <table class="table table-bordered">
        <thead>
        <tr>
            <th>#</th>
            <th>Article</th>
            <th>Prix</th>
        </tr>
        </thead>
        <tbody>

        <?php

        while ($items = $reqItem->fetch()){
        ?>
        <tr>
            <td> <?php echo $items['nom']; ?></td>
            <td> <?php echo $items['type']; ?></td>
            <td> <?php echo $items['prix']; ?></td>
        </tr>

        <?php
        }
        ?>
        </tbody>
    </table>
</div>

    <ul class="pagination">

        <li> class="<?php if($current == '1'){ echo "disabled"; } ?>" <a href="?p=<?php if($current != '1'){ echo $current-1; }else{ echo $current; }?>&&pp=<?php echo $_GET['pp']; ?>">&laquo;</a> </li>

        <?php
        for ($i=1; $i<=$nbPage; $i++){

            if ($i == $current){
                ?>
                    <li class="active"><a href="?p=<?php echo $i?>&&pp=<?php echo $_GET['pp'];?>"<?php echo $i ?></a></li>
                <?php
            } else {
                ?>
                    <li><a href="?p=<?php echo $i ?>&&pp=<?php echo $_GET['pp'];?>"<?php echo $i ?></a></li>
                <?php
            }
        }
        ?>

        <li> class="<?php if($current == $nbPage){ echo "disabled"; } ?>" <a href="?p=<?php if($current != $nbPage){ echo $current+1; }else{ echo $current; }?>&&pp=<?php echo $_GET['pp'];?>">&raquo;</a> </li>


    </ul>


</body>
</html>


Merci beaucoup de votre aide !!

Re: Probleme function fetch on boolean

Posté : 09 févr. 2017, 13:14
par moogli
salut,

le message est clair : Fatal error: Call to a member function fetch() on boolean in C:\wamp64\www\Jeux\index.php on line 54
ligne 54 du fichier index.php tu utilises la méthode fetch sur une variable ($reqItem) qui est un booléen et pas un objet.

en clair tu fais une requête sql qui se passe mal et le chose retourne false plutôt qu'un objet.
il faut toujours tester le retour d'un query pour éviter cela.
ensuite tu peux récupérer l'erreur.
La doc de la méthode query t'indique les retours possible : http://php.net/manual/fr/pdo.query.php (oui une exception serait mieux).

le var_dump en dernière ligne de ton script.php doit indiquer le booléen ?
il faut que tu affiche la requête ligne 31 ("SELECT * FROM items_hippique ORDER BY id ASC LIMIT $page1, $page") histoire de pouvoir la tester (dans un client mysql) et voir si elle est syntaxiquement correcte.

si le retour est false utilise la méthode errorInfo()

ton code qui requête la base devient
<?php
// pour pouvoir l'afficher et en plus l'autoconcaténation c'est boff ;)
$sql  = 'SELECT * FROM items_hippique ORDER BY id ASC LIMIT '.$page1.', '.$page;
$reqItem = $db->query($sql);

$dataItem = [];
if($reqItem !== false){
    $dataItem = $reqItem->FetchAll();
    $reqItem->closeCursor();
}else {
    $error = $db->errorInfo()[2];
}
je met les données dans un tableau pour séparer complètement le code "DAO" du code d'affichage (on s'approche du MVC ; ) )

L'affichage devient donc :
<?php
foreach ($dataItem as $items){
        ?>
        <tr>
            <td> <?php echo $items['nom']; ?></td>
            <td> <?php echo $items['type']; ?></td>
            <td> <?php echo $items['prix']; ?></td>
        </tr>

        <?php
        }[/code]

pour afficher le message d'erreur (quand t'est pas en production) 
[php]<?php
// avant le tableau par exemple mais pas avant le début de la page il faut que visuellement tu ne casse pas tout ;)
if(!empty($error)) {
echo '<p class="erreur-sql">',$error,'</p>';
}
en exécutant cela tu auras ton erreur qui, je pense, ce situe autour de la clause limite.

@+

Re: Probleme function fetch on boolean

Posté : 09 févr. 2017, 14:24
par Nosperato
Bonjour, j'ai réglé moi même le problème, du coup j'ai fais des requêtes préparés et cela marche beaucoup mieux, par contre maintenant je m'oppose à un différent problème car maintenant j'ai réussi à afficher une table, mais maintenant je veux paginer tous les items de chaque table exemple : récupérer les item de la table cheval, de la table hippique etc et ensuite les afficher et les paginer tous ce joue au niveau des requêtes il me semble, mais j'ai aucune idée de comment je peux le faire

Voici mon code :
<?php


if (isset($_GET['pp']) && !empty($_GET['pp']) && ctype_digit($_GET['pp']) == 1){
    $page= $_GET['pp'];
}else{
    $page=intval($_GET['pp']);
}

$total = $db->query('SELECT COUNT(*) FROM items_hippique')->fetchColumn();

$nbPage = ceil($total+$total/$page);



if (isset($_GET['p']) && !empty($_GET['p']) && ctype_digit($_GET['p']) == 1){
    if($_GET['p'] > $nbPage){
        $current=$nbPage;
    }else{
        $current=$_GET['p'];
    }
}else{
    $current=1;
}

$page1 = ($current-1)*$page;

try{
    $db = new PDO('mysql:host='.$hostname.';dbname='.$namebase.'', $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Échec lors de la connexion : ' . $e->getMessage();
}



$reqItem = $db->prepare("SELECT * FROM items_hippique ORDER BY id_items_hippique ASC LIMIT :start, :count");
$reqItem->bindValue('start', $page1, PDO::PARAM_INT);
$reqItem->bindValue('count', intval($page), PDO::PARAM_INT);
$reqItem->execute();

?>