***Bonsoirs,

Je recrée ce sujet pour parlez de mon problème sur un script php pour un forum !

-Avant toutes chose je remercie les personnes qui m'on donnez des conseilles sur l'ancien topics qui a étez suprimé, je n'ai que 14ans je suis jeune quand je n'arrive pas a faire un truc je rage :(.
Après avoir lue plusieur fois vos solution et essayée, je n'ai pas réussi j'aimerait vraiment que quelqu'un me le dise ou essaye de me donnez des indices pour y réussir par moi même ce qui serait compréhensible.

Donc mon but et d'afficher plusieur topic sur plusieur page une pagination en gros donc voilla comment je procède niveau url:

localhost/see_topic.php?forum=1&page=1 Jusque la tout marche je suis bien limiter a 5 sujet !
Mais quand je veut accéder a l'autre page: ocalhost/see_topic.php?forum=1&page=2 Je reste sur la même page.

Voici le code:

<!-- On inclu nos fichier -->
<?php require_once 'core.php';?>
<!-- Inclusion terminer -->
<?php if(isset($_GET["forum"])){ ?>
<?php
        $sqll = $db->prepare("SELECT * FROM forum_cat WHERE id = ?");
        $sqll->execute(array($secu->get($_GET["forum"])));
        $req = $sqll->fetch(PDO::FETCH_OBJ);
        if($sqll->rowCount() < 1){
          Redirection("forum.php");
        }
        if(empty($_GET["forum"])){
          Redirection("forum.php");
        }
        else{
        ?> 

<?php

        $perPage = 1;

        $req123 = $db->query('SELECT COUNT(*) AS total FROM sujet');
        $result = $req123->fetch();
        $total = $result['total'];

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

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

 $firstOfPage = ($current-1)*$perPage;

       $reqB = $db->prepare("SELECT * FROM sujet WHERE id_cat = ? ORDER BY id ASC LIMIT $firstOfPage,$perPage");
          $reqB->execute(array($secu->get($_GET["forum"])));
       ?>

Merci d'avance d'avoir lue le sujet ou même d'y répondre !

Ps: Je fait beaucoup de faute d'orthographe je vous plein de me relire et je m'en excuse.

36 réponses


Huggy
Réponse acceptée

Là c'est facile à corriger, tu remets *COUNT()** comme avant

Huggy
Réponse acceptée

Tu utilises un jocker '?' alors que ce n'est pas une requête prepare
essaye ça

$req123 = $db->query('SELECT COUNT(*) AS total FROM sujet WHERE id_cat = '.   intval($_GET['forum'])) ;
Huggy
Réponse acceptée

Que vaut $firstOfPage ?
essaye de sortir le requête dans une variable (juste avant la reqB)

$sql = "SELECT * FROM sujet WHERE id_cat = ? ORDER BY id ASC LIMIT $firstOfPage,$perPage";
echo $sql;

copie le résultat du echo dans phpMyadmin et fait varier firstOfpage

J'ai regardé vite fait, je peux me tromper mais t'as essayé cette url localhost/see_topic.php?forum=1&p=2 par exemple au lieu de localhost/see_topic.php?forum=1&page=2

Oui, c'était un exemple dans le sujet,
Mais oui j'ai tester avec cette url vue que c'est celle qui et censé fonctioné !

Merci beaucoup d'avoir prit le temp de lire et essayer de m'aider ! :)

Et même avec le ?p au lieu du ?page, ca ne fonctionne pas ?
Essaye de faire des var_dump à certain endroits (genre dans la condition) histoire de voir comment le code s'effectue ;)

le ?p=2 ne fonctionne pas sa m'affiche la première page mais sa limite bien a 5 bizzare ?

Au passage merci de ton aide :)

Mais le truc c'est que perPage = 1 donc je vois pas pourquoi ca en afficherait 5,
Sinon pour ton erreur, il me semble que quand php reconnait un nombre en post ou en get, il le transforme automatiquement, essaye is_numeric au lieu de ctype_digit

Bref après quelques tests, ce n'est pas ca du tout, php ne le transforme pas, essaye de mettre :
$_GET['p'] = intval($_GET['p']);
Juste après le premier if

De rien ;)

J'ai modifié le PerPage hier ^^
J'essaye sa :)
Merci

D'ailleurs saurais-tu mettre
var_dump($current);
Juste après la condition voir si cette valeur est bien celle que tu veux obtenir

J'ai essayer de modifier par is_numeric sa fait rien mais quand je mais vard_dump($current); après $current = 1; sa m'affiche int(1)

Déjà tu peux retirer le
isset($_GET['p'])
Puisqu'il est compris dans le !empty ;)

Il faut que tu mettes le var_dump juste avant $firstOfPage = ($current-1)*$perPage;

j'ai un doute sur
ctype_digit($_GET['p']) == 1
la fonction ctype_digit() retourne un booleen
essayes plutôt
$_GET['p'] == intval($_GET['p'])

J'ai enlever le isset et changer de plasse le var dump sa fonctionne toujours pas sa me mais int(1)

Salut @ huggy quand tu dit $_GETget['p'] == intval($_GET['p']) C'est $_GET['p'] == intval($_GET['p']) plutôt non ?

Simple question tu es sur d'avoir plus d'une page de posts ? ^^'

J'ai pas spécialement lu les commentaires.

Il faut que tu travailles ta requete sql avec des LIMIT. Là je t'invite à aller voir comment ca fonctionner dans la doc, il n'y a rien de sorcier.
Là où tu devras jouer c'est savoir sur quelle page tu es.

Pour ton script je trouve que c'est p'tet pas spécialement la bonne méthode
Je pars du principe que :
Soit la page est définie dans l'url soit elle ne l'est pas (page est un $_GET['page'])

$page = !empty($page) ? $page : '1';

Tu peux évidement vérifier si ta page est bien is_numeric() Il va te renvoyer un booléen (vrai ou faux)

Ensuite, tu vas construire le minimum de ta limite en fonction de ta page chargée.

$min = ($page * LIMIT_MESSAGES) - (LIMIT_MESSAGES);

J'ai utilisé une constante pour modifier cela plus facilement ;).
tu as ton minimum (là où tu commences ta lecture) et tu as le nombre à récupérer :)

Kewai, ton minimum ce retoruve ici $firstOfPage = ($current-1)*$perPage; dans la mesure ou il a factorisé ^^
Donc en soite il fait ce que tu lui dis, avec une ou deux vérification en plus ;)

Ouais, mais quand je lis le code, je vois qu'il fait des totaux des sujet, pour toute sa table, il n'utilise pas l'id de son forum.
La vérification de la page est mega longue...

Après moi je ne me préoccupe pas de vérifier si page est numérique, car j'utilise un routing qui gère ça...
Le code est en spaghettis un peu bordelique.
Ce que je conseillerai c'est de faire le code le plus simple possible et que ca fonctionne, sans vérification et après on les rajoute les unes aux autres.

@MrReskill alors je te conseil deux choses :

  • faire un var_dump($firstOfPage , $current, $nbPage); pour voir si tu as bien la page, le saut de pages et le nombre de pages attendu, fait des essais sur
    ?p=2, ?p=3, et ?p=4 au moins
  • comme dit plus haut, quand tu compte les sujest, tu ne compte pas les sujets du forum en cours, ce qui fausse le calcul
    $req123 = $db->query('SELECT COUNT(\*) AS total FROM sujet WHERE car\_id =?');

    voilà, déjà fait ça et les dump devraient te dire où est l'erreur. À noter que avec ton script actuel
    pour ?p=2 : $current = 2 et $firstOfPage = 1
    pour ?p=5 : $current = 5 et $firstOfPage = 4 normalement vu que c'est 1 par page quoi

PS : c'est quoi ton " $secu->get() " que tu fais là ? sachant que pdo securise déjà ta requête quand tu fais un prepare

J'ai modifié la requète $req123
cela me renvoie a une érreur
et le vardump m'affiche 1 et 3 sur toutes les pages !

Ce n'est pas normal que le va_dump me m'envoie que 2 résultat alors qu'on a demender 3 résulta ? $FirshOfPage $nbPage $current ?

Affiches-tu toutes les erreurs ?
tu devrais ajouter error_reporting(E_ALL); en début de script

puis donne nous les messages d'erreurs

Je déjeune et je fait sa merci a toi huggy !

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS total FROM sujet WHERE car_id =?' at line 1' in C:\xampp\htdocs\pm\see_forums.php:24 Stack trace: #0 C:\xampp\htdocs\pm\see_forums.php(24): PDO->query('SELECT COUNT(*...') #1 {main} thrown in C:\xampp\htdocs\pm\see_forums.php on line 24

Merci :P Mais sa m'affiche une autre érreur (je débute en php)

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1' in C:\xampp\htdocs\pm\see_forums.php:24 Stack trace: #0 C:\xampp\htdocs\pm\see_forums.php(24): PDO->query('SELECT COUNT(*)...') #1 {main} thrown in C:\xampp\htdocs\pm\see_forums.php on line 24

Peux-tu nous montrer la requête SQL

Ba je te donne toute le code concerné :

<!-- On inclu nos fichier -->
<?php require_once 'core.php';?>
<!-- Inclusion terminer -->
<?php if(isset($_GET["forum"])){ ?>
<?php
        $sqll = $db->prepare("SELECT * FROM forum_cat WHERE id = ?");
        $sqll->execute(array($secu->get($_GET["forum"])));
        $req = $sqll->fetch(PDO::FETCH_OBJ);
        if($sqll->rowCount() < 1){
          Redirection("forum.php");
        }
        if(empty($_GET["forum"])){
          Redirection("forum.php");
        }
        else{
        ?> 

<?php
error_reporting(E_ALL);
        $perPage = 1;

        $req123 = $db->query('SELECT COUNT(*) AS total FROM sujet WHERE id_cat = ?');
        $result = $req123->fetch();
        $total = $result['total'];

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

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

          }
        }else{
          $current = 1;
        var_dump($firstOfPage,$current,$nbPage);
        }

 $firstOfPage = ($current-1)*$perPage;

       $reqB = $db->prepare("SELECT * FROM sujet WHERE id_cat = ? ORDER BY id ASC LIMIT $firstOfPage,$perPage");
          $reqB->execute(array($secu->get($_GET["forum"])));
       ?>

  <div class="center">
  <div class="row">
<div class="col-lg-11">
<div class="alert alert-danger">
    <p class="lead"><center><b>Vous n'ètes actuellement pas connecter..</b></center></p>
</div>
 </div>
    <div class="col-lg-8">
<div class="panel panel-default">
<div class="panel-heading">
&roarr; <?php echo $req->name;?>
</div> 
<ul class="list-group">

        <?php
          $sql = $db->prepare("SELECT * FROM sujet where id_cat = ? order by id");
          $sql->execute(array($_GET["forum"]));
          while($req2 = $reqB->fetch(PDO::FETCH_OBJ)): ?>

<li class="list-group-item"><a href="./see_sujet.php?id=<?php echo $req2->id;?>" class="label label-success"><?php echo $req2->name;?></a></li>
    <?php endwhile ?>
    </ul></div>

   </div>
  </div><?php } ?>
</div> <!-- /container -->

<?php } ?>

Merci hurry ya plus l'érreur mais quand je vais sur ?p=2 cela m'affiche aucun résultat ma div panel et vite il n'y a aucun sujet pourtant dans la db il y a 12 sujets qui sont égal a ?forum=5&p=2

l'"ancien topic qui a été supprimé" comme tu dis c'est toi qui la supprimé parce que tu n'es pas capable de chercher une erreur simple tout seul, que tu es malpoli et que tu n'aimes pas les remarques.

Donc un peu facile de supprimer un topic et de revenir faire le gars sympa.

Non l'ancien topic a étez suprimé aucunement par moi,
Et comme tu peut voir, je suis plus polie que tu pense est-ce toi qui te focalise sur moi ?

Cependant, merci d'avoir prit le temp de lire le sujet.

C'est a dire ? Excuse moi je débute et je comprend pas forcément tout :/ Excuse moi je doit te prendre du temp :/

@Hurry ? :)

Le écho réécritA requête $sil ;(

Soucis règlez grace a toi hurry, merci a tout ceux qui ont essayer de m'aider ! :)