Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur syntaxe SQL

Aller Plus Loin - TP du blog en PHP

Sujet résolu
    20 janvier 2018 à 16:59:02

    Bonjour, 

    Je suis un débutant en PHP et je travaille sur la partie Aller plus loin du TP sur le blog du cours "Concevez votre site web avec PHP et MySQL". Mon erreur concerne la partie où il faut paginer...

    J'ai cette erreur (j'ai remplacé le chemin par des ../.. ): Fatal error: Uncaught PDOException: 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 ''0', 5' at line 1 in /../.. :57 Stack trace: #0 /../.. (57): PDOStatement->execute(Array) #1 {main} thrown in /../.. on line 57

    Sachant que la ligne 57 correspond à cette ligne : 

    $reponse->execute(array(
    			'nb_start' => ($nb_billets_voulus*($var-1))));

    Pourtant, tout me parait bon....

    Pourriez-vous m'indiquer mon erreur svp ?

    Voici mon code : 

    	<?php 
    
    	/* Connexion à la BDD */
    
    	try{
    		$bdd = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    	}catch (Exception $e){
    		die('Erreur : ' . $e->getMessage());
    	}
    
    	$nb_billets_voulus = 5;
    
    
    	$requete = $bdd->query('SELECT COUNT(*) AS nb_billets FROM billets');
    	$nb = $requete->fetch();
    	if(($nb['nb_billets'] == $nb_billets_voulus) OR $nb_billets_voulus == 1){
    		$nb_page = (int) ($nb['nb_billets']/$nb_billets_voulus);
    	}else{
    		$nb_page = (int) ($nb['nb_billets']/$nb_billets_voulus)+1;
    	}
    		//echo $nb_page;
    
    	//REQUÊTE 
    
    	$reponse = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y\') AS date_day, DATE_FORMAT(date_creation, \'%Hh%imin%ss\') AS date_time FROM billets ORDER BY id DESC LIMIT :nb_start, 5');
    
    	$var =  $_GET['page'];
    
    	//Une partie est en commentaire car je faisais des tests pour trouver la cause de l'erreur
    
    
    	/*if(empty($_GET['page'])){
    		$reponse->execute(array(
    			'nb_start' => ($nb_billets_voulus*0),	
    			'voulus' => $nb_billets_voulus
    		));
    	}/*else{*/
    		$reponse->execute(array(
    			'nb_start' => ($nb_billets_voulus*($var-1))
    			//'voulus' => $nb_billets_voulus
    		));
    	//}
    
    			//POUR CHAQUE ENTRÉE, ON LISTE LE CONTENU
    
    	while($donnees = $reponse->fetch()){
    		?>
    		<div class='news'>
    			<?php echo '<h3>' . htmlspecialchars($donnees['titre']) . ' <em>le ' . htmlspecialchars($donnees['date_day']) . ' à ' . htmlspecialchars($donnees['date_time']) . '</em></h3>';
    			echo '<p>' . htmlspecialchars($donnees['contenu']) . '</p>';
    			?>
    
    
    			<!--ON DIRIGE VERS LA PAGE AVEC L'ID EN PARAMÈTRE (GET)-->
    
    			<a href=<?php echo 'commentaires.php?id=' . $donnees['id']?>>Commentaires</a>
    			</div><?php
    		}
    
    		?><p>Page : <?php
    
    		for($i=1; $i<=$nb_page; $i++){
    
    			?>
    
    			<a href='<?php echo 'index.php?page=' . $i ?>'><?php echo $i ?></a>
    
    			<?php
    
    		} ?>
    
    	</p>
    
    	<?php
    
    	$reponse->closeCursor();
    
    	?>



    -
    Edité par Pres' the Cobra 20 janvier 2018 à 17:01:42

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2018 à 18:43:10

      Bonjour, 

      Tu ne peux pas mettre de marqueur pour le LIMIT, ça équivaut à entourer un nombre de quotes.

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2018 à 18:56:54

        Salut,

        Remplace simplement par :

        $var =  ((int) $_GET['page']) > 0 ? (int) $_GET['page'] : 1;
        
        $reponse = $bdd->prepare('SELECT id, titre, contenu, DATE_FORMAT(date_creation, \'%d/%m/%Y\') AS date_day, DATE_FORMAT(date_creation, \'%Hh%imin%ss\') AS date_time FROM billets ORDER BY id DESC LIMIT ' . ($var - 1) . ', 5');

        De cette manière tu évites les failles XSS et ton script fonctionne correctement ;)

        Quand tu obtiens "You have an error in your SQL syntax", regardes ta requête plutôt que la ligne ou l'erreur est survenue.

        -
        Edité par Skayotix 20 janvier 2018 à 19:00:02

        • Partager sur Facebook
        • Partager sur Twitter
        Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
          20 janvier 2018 à 19:01:57

          C'est même l’idéal d'utiliser PDO::PARAM_INT
          • Partager sur Facebook
          • Partager sur Twitter
          Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
            20 janvier 2018 à 19:33:12

            Bonsoir tout le monde, et merci pour vos réponses !!

            En effet, avec cette erreur, je regardais ma requête mais sans savoir qu'on ne pouvait pas utiliser de marqueurs pour le LIMIT :D donc je pensais que c'était bon ;)

            Tout fonctionne mieux maintenant avec la solution proposée par Skyaotix, merci !

            Je mets en résolu :)

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2018 à 19:36:00

              Ravi d'avoir pu t'aider, n’hésites pas a utiliser les pouce ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

              Erreur syntaxe SQL

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown