Erreur syntaxe forum PHP

Résolu/Fermé
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016 - Modifié par jordane45 le 29/03/2016 à 19:36
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016 - 29 mars 2016 à 20:40
Bonjour,
j'etais en train de faire un systeme de pagination en PHP.
Mais cela m'affiche deux erreurs:

( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''0','2'' à la ligne 1' in C:\wamp\www\...\...\forum.php on line 180

( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''0','2'' à la ligne 1 in C:\wamp\www\...\...\forum.php on line 180

Voici le code:

<?php 

 $topicsParPage = 2;
 $topicsTotalesReq = $bdd->query("SELECT id FROM topics WHERE forum_id = '".$_GET['id']."'");
 $topicsTotales = $topicsTotalesReq->rowCount();
 $pagesTotales = ceil($topicsTotales/$topicsParPage);
 if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pagesTotales) {
    $_GET['page'] = intval($_GET['page']);
    $pageCourante = $_GET['page'];
 } else {
    $pageCourante = 1;
 }
 $depart = ($pageCourante-1)*$topicsParPage;

   $topic_sql = $bdd->prepare("SELECT * FROM topics WHERE forum_id = '".$_GET['id']."' AND sticked = 0 ORDER BY id desc LIMIT ?,?");
    $topic_sql->execute(array($depart,$topicsParPage));

    if ($topic_sql->rowCount() < 1) {
     echo '<div class="plan-nothing">Aucun sujet pour le moment</div>';
    } else {
     while($topic = $topic_sql->fetch(PDO::FETCH_OBJ)) { ?>
      

     <div class="plan-content">
      <div class="plan-area plan-title-area">
       <div class="plan-wrapper">
        <div class="plan-icon"><i class="fa fa-file-o"></i>
         <?php if($topic->locked > 0) { ?>
          <div class="plan-locked"><i class="fa fa-lock"></i></div>
         <?php } ?>
        </div>
        <a href="viewtopic.php?id=<?= $topic->id; ?>" class="secondary-link"><?= $topic->name; ?></a>
        <div class="plan-meta">Par <a href="profil.php?id=<?= $topic->author_id; ?>" class="primary-link"><?php echo getUsernameByAuthorId($topic->author_id); ?></a>, le <?= $topic->added_date; ?> à <?= $topic->added_time; ?></div>
       </div>
      </div>
      <div class="plan-area plan-stats-area">
       <div class="plan-wrapper">
        <div class="plan-replies"><?php echo countReplies($topic->id); ?> réponses</div>
       </div>
      </div>
      <div class="plan-area plan-posts-area">
       <div class="plan-wrapper">
        ...
       </div>
      </div>
     </div> 

     <?php
     } 

     for($i=1;$i<=$pagesTotales;$i++) {
             if($i == $pageCourante) {
                echo $i.' ';
             } else {
                echo '<a href="forum.php?id='.$_GET['id'].'&page='.$i.'">'.$i.'</a> ';
             }
          }
    } ?>


En gros la pagination ne s'affiche pas et affiche une erreur qui englobe tout le code HTML. La ligne 180 est a partir du execute().

1 réponse

jordane45 Messages postés 38359 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 décembre 2024 4 720
Modifié par jordane45 le 29/03/2016 à 19:50
Bonjour,

Il semble donc que ce soit ta requête qui pose problème
   $topic_sql = $bdd->prepare("SELECT * FROM topics WHERE forum_id = '".$_GET['id']."' AND sticked = 0 ORDER BY id desc LIMIT ?,?");
    $topic_sql->execute(array($depart,$topicsParPage));


Déjà ... (ça n'a rien à voir avec le souci..mais bon...), commence par récupérer PROPREMENT les variables AVANT de les utiliser. (surtout pour les GET ou les POST
Comme ceci :

$id = !empty($_GET['id']) ? $_GET['id'] : NULL;
  • j'ai mis comme valeur par défaut "null" .. mais tu peux mettre autre chose.


Tu peux les utiliser dans ton code :
$topic_sql = $bdd->prepare("SELECT * FROM topics WHERE forum_id = '$id' AND sticked = 0 ORDER BY id desc LIMIT ?,?");
$topic_sql->execute(array($depart,$topicsParPage));
</code>


Ensuite, prends l'habitude de séparer les "requête" de son exécution afin de pouvoir en faire un echo en cas de problème. ( avec un bloc try/catch c'est encore mieux)
comme ceci :
//---------------------------------------------------------------------------------------//
//On prépare la requete et les variables
//---------------------------------------------------------------------------------------//
$sql = "SELECT * 
     FROM topics 
     WHERE forum_id = :id 
        AND sticked = 0 
      ORDER BY id  DESC
      LIMIT :depart,:topicsParPage ";
    
$a_datas = array(':id'=>$id 
                   , ':depart'=>$depart 
                   ,':topicsParPage'=>$topicsParPage);

//---------------------------------------------------------------------------------------//
//on exécute la requête dans un bloc try/catch pour intercepter les erreurs
// et faire du debug  en affichant la requête en cause et les variables :
//---------------------------------------------------------------------------------------//
try{
 $topic_sql = $bdd->prepare($sql);
 $topic_sql->execute($a_datas);
 
}catch(Exception $e){
 // en cas d'erreur
 echo "<br><b>Erreur ! </b>" . $e->getMessage();;
 echo "<br><b>Requete : </b><br>".$sql."<br>";
 echo "<br><b>Variables : </b><br>";
 print_r($a_datas);
}



Si l'erreur persiste ... tu prends la requête qui va s'afficher grâce au debug (le catch) ... tu remplaces les variables par leur valeurs (également grâce au debug...)
et tu testes cette requête DIRECTEMENT dans ta BDD.
Là .. tu devrais être en mesure de comprendre l'erreur.



Cordialement, 
Jordane                                                                 
0
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016
29 mars 2016 à 20:18
Enfait le problème était tout con, j'ai juste remplacé les doubles griffes par des griffes simples comme ceci:


$topic_sql = $bdd->query('SELECT * FROM topics WHERE forum_id = '.$_GET['id'].' AND sticked = 0 ORDER BY id desc LIMIT '.$depart.','.$topicsParPage);


Quelqu'un pourrait m'expliquer car j'ai pas compris pourquoi cette erreur quand je faisais cela:


$topic_sql = $bdd->prepare("SELECT * FROM topics WHERE forum_id = '".$_GET['id']."' AND sticked = 0 ORDER BY id desc LIMIT ?,?");
$topic_sql->execute(array($depart,$topicsParPage));
0
jordane45 Messages postés 38359 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 décembre 2024 4 720 > zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016
29 mars 2016 à 20:20
Tu es passé d'une requête préparée avec des variables en "?" ... à une requête dans laquelle tu as mis directement tes variables !!!

Par contre.. tu n'as tenu compte d'aucune de mes remarques.... ni -même pris la peine d'essayer le code que je t'ai donné !
0
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016
Modifié par zack5163v le 29/03/2016 à 20:44
J'ai voulu essayer juste après ma dernière tentative, comme je ne suis pas habitué a coder comme tu m'as montrer dans ton essai de code, je me suis rapidement trouvé perdu. C'est une question d'habitude ^^. Mais je prendrais la peine de réecrire mon code en tenant compte de tes indications pour m'améliorer, Merci ;)
0