IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête qui pose problème


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Requête qui pose problème
    Bonsoir,
    Voici une partie de mon code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
    			if(isset($_POST['pageBillets']))
    			{
    				$nombreEntrees = $bdd->query('SELECT COUNT(*) as nombre FROM billets');
    				$nombrePages = $nombreEntrees->fetch();
    				$nombrePages['nombre'] /= 5;
    				$nombrePages2 = ceil($nombrePages['nombre']);
    				$nombreEntrees->closeCursor();
    				$resultat = $bdd->prepare('SELECT *, DATE_FORMAT(date_creation, \'%d/%m/%y %h:%i:%s\') as date_creat FROM billets ORDER BY id DESC LIMIT ?,5');
    				$resultat->execute(array($_POST['pageBillets']));
    			}
    			else
    			{
    				$nombreEntrees = $bdd->query('SELECT COUNT(*) as nombre FROM billets');
    				$nombrePages = $nombreEntrees->fetch();
    				$nombrePages['nombre'] /= 5;
    				$nombrePages2 = ceil($nombrePages['nombre']);
    				$nombreEntrees->closeCursor();
    				$resultat = $bdd->query('SELECT *, DATE_FORMAT(date_creation, \'%d/%m/%y %h:%i:%s\') as date_creat FROM billets ORDER BY id DESC LIMIT 0,5');			
    			}
    			while($donnees = $resultat->fetch())
    			{
    		?>
    				<h3><span id="h3_titre"><?php echo strip_tags($donnees['titre']);?></span><span id="h3_auteur"><?php echo strip_tags($donnees['auteur']);?></span><span id="h3_date"><?php echo $donnees['date_creat'];?></span></h3>
    				<p id="billet_contenu"><?php echo strip_tags($donnees['contenu']) . '   ';?></p>
    				<p id="billet_commentaire"><a href="index.php?billet=<?php echo $donnees['id'];?>">Les commentaires...</a></p>
    		<?php
    			}
    			$resultat->closeCursor();
    			if($nombrePages2 > 1)
    			{
    		?>
    				<form method="post" action="index.php">
    					<p>
    						<label for="pageBillets">Selectionnez la page de la news souhaité : </label>
    						<select name="pageBillets" id="pageBillets">
    							<?php $page = 0;?>
    							<option value="<?php echo $page;?>">Page 1</option>
    		<?php
    						for($i=2;$i<=$nombrePages2;$i++)
    						{
    							$page+=5;
    		?>
    							<option value="<?php echo $page;?>">Page <?php echo $i;?> </option>
    		<?php
    						}
    		?>
    						</select>
    						<input type="submit" />
    					</p>
    				</form>
    		<?php
    			}
    		?>
    Ce code affiche les entrées et un formulaire. Il Permet également de sélectionner des pages pour remonter dans les archives (entrées anciennes).
    Le problème se situe au niveau de la requête préparée dans le if. Je ne sais pas ou est l'erreur, mais il y a une erreur de syntaxe. Pouvez-vous svp me l'indiquer car je ne la trouve pas.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    ça nous aiderait de connaître le message d'erreur que tu obtiens.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Bonjours rawsrc,

    Erreur : 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 ''5',5' at line 1

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    casting incorrect : essaies avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $limit = intval($_POST['pageBillets']);
    $resultat->execute(array($limit));

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    J'ai remplacer ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultat->execute(array($_POST['pageBillets']));
    ...par tes 2 lignes de codes. Il y a toujours le même problème.

    Erreur : 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 ''5',5' at line 1

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ah bon ?
    On va changer un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $resultat = $bdd->prepare('SELECT *, DATE_FORMAT(date_creation, "%d/%m/%y %h:%i:%s") as date_creat FROM billets ORDER BY id DESC LIMIT :limit, 5');
    $resultat->bindValue(':limit', intval($_POST['pageBillets']), PDO::PARAM_INT);

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Il n'y a plus d'erreur. En revanche, maintenant il n'y a plus que le formulaire qui s'affiche quand je clique sur 'envoyer' (page 1 ou page 2).

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    il faut regarder comment tu retournes tes données parce que mon code ne change rien à l'exécution, il ne modifie juste que la passage de paramètre.
    J'ai remarqué dans ton code que d'un côté tu prépares ta requête et de l'autre pas.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Si $_POST['pageBillets'] n'existe pas, pas besoin de préparer la requête car il n'y a ps de variable dedans.

    il faut regarder comment tu retournes tes données
    Dans les requêtes ou avec le formulaire ?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    J'ai repris ton code et il se résume à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
     
    $page = 5;
    $nombreEntrees = $bdd->query('SELECT COUNT(*) as nombre FROM billets');
    $nombrePages = $nombreEntrees->fetch();
    $nombrePages['nombre'] /= 5;
    $nombrePages2 = ceil($nombrePages['nombre']);
    $nombreEntrees->closeCursor();
     
    $sql  = 'SELECT *, DATE_FORMAT(date_creation, "%d/%m/%y %h:%i:%s") as date_creat FROM billets ORDER BY id DESC LIMIT ';
    $sql .= isset($_POST['pageBillets']) ? intval($_POST['pageBillets']) : '0';
    $sql .= ', 5';
     
    $resultat = $bdd->query($sql);
     
    while($donnees = $resultat->fetch()):
       array_map('strip_tags', $donnees) ?>
    <h3><span id="h3_titre"><?php echo $donnees['titre'];?></span><span id="h3_auteur"><?php echo $donnees['auteur'];?></span><span id="h3_date"><?php echo $donnees['date_creat'];?></span></h3>
    <p id="billet_contenu"><?php echo $donnees['contenu'] . '   ';?></p>
    <p id="billet_commentaire"><a href="index.php?billet=<?php echo $donnees['id'];?>">Les commentaires...</a></p>
    <?php endwhile; ?>
     
    <?php if ($nombrePages2 > 1): ?>
    <form method="post" action="index.php">
       <p>
          <label for="pageBillets">Selectionnez la page de la news souhaité : </label>
          <select name="pageBillets" id="pageBillets">
             <option value="0">Page 1</option>
             <?php for($i = 2; $i <= $nombrePages2; ++$i, $page += 5): ?>
             <option value="<?php echo $page;?>">Page <?php echo $i; ?> </option>
             <?php endfor; ?>
          </select>
          <input type="submit" />
       </p>
    </form>
    <?php endif; ?>
    Je crois avoir raté la gestion des numéros des pages, je vérifie.
    Corrigé

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Je ne comprend pas les lignes 9, 10, 11, 13, 16, 20, 22, 23, 29(++$i), 36

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    On écrit la chaine SQL à plat. Vu que le paramètre attendu est un entier, je me suis juste contenté de l'ajouter à la fin de la chaine SQL en ayant au préalable bien vérifié qu'il était entier : intval().

    Le .= est équivalent à ce que tu utilise pour ajouter et stocker dans la même variable +=, sauf que là au lieu de l'addition c'est la concaténation de chaines.

    Ensuite une fois que l'on a les $donnees, on passe tout le tableau à la fonction strip_tags() au lieu d'avoir à l'appeler à chaque fois que tu utilises une donnée. C'est le rôle de array_map().

    Enfin le ++$i est équivalent à $i++ dans une boucle for, sauf qu'il est un poil plus rapide. C'est un réflexe que j'ai gardé depuis des années, donc je n'y pense pas. D'ailleurs question rapidité, je me pose la question s'il n'y aurait pas depuis une optimisation automatique du parser PHP. A voir.

    Pour les notations alternatives (les structures de contrôle avec les deux-points) regardes ici
    C'est plus visuel de repérer dans un rendu des endwhile | endfor qu'une simle accolade fermante.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    A la fin de la ligne 17 avant '?>', il y a un ';' non ?

    Sinon, c'est bon j'ai compris tes modifs.
    J'ai remplacé dans mon code la condition de départ if else (avec les 2 requêtes) par ton bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql  = 'SELECT *, DATE_FORMAT(date_creation, "%d/%m/%y %h:%i:%s") as date_creat FROM billets ORDER BY id DESC LIMIT ';
    $sql .= isset($_POST['pageBillets']) ? intval($_POST['pageBillets']) : '0';
    $sql .= ', 5';
     
    $resultat = $bdd->query($sql);
    Le reste étant une autre façon de présenter, je préfère garder le plus de chose possible venant de moi. En tout ca, je te remercie pour tes explication, j'ai appris beaucoup de chose.

    Au final, ça fonctionne correctement maintenant, merci !

    Juste une question : pourquoi ça n'a pas marché avant ?

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par MarvinR18 Voir le message
    A la fin de la ligne 17 avant '?>', il y a un ';' non ?
    Ce n'est pas obligatoire mais il vaut mieux le mettre.

    Citation Envoyé par MarvinR18 Voir le message
    Juste une question : pourquoi ça n'a pas marché avant ?
    Je te répète mon post précédent :
    il faut regarder comment tu retournes tes données parce que mon code ne change rien à l'exécution, il ne modifie juste que la passage de paramètre.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    J'ai une autre question : Il s'agit d'une requête non préparé. Cette requête n'est-il pas vulnérable à une faille sql ?

  16. #16
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par MarvinR18 Voir le message
    J'ai une autre question : Il s'agit d'une requête non préparé. Cette requête n'est-il pas vulnérable à une faille sql ?
    Non, la fonction intval() extrait la partie entière de la valeur $_POST['pageBillets'].
    Bon je te l'accorde, intval ne sert pas uniquement à ça et peut avoir parfois un comportement quelque peu déroutant.
    Le mieux c'est d'utiliser les fonctions de filtrages comme filter_var() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql  = 'SELECT *, DATE_FORMAT(date_creation, "%d/%m/%y %h:%i:%s") as date_creat FROM billets ORDER BY id DESC LIMIT ';
    $lim  = isset($_POST['pageBillets']) ? filter_var($_POST['pageBillets'], FILTER_VALIDATE_INT) : 0;
    $sql .= (false === $lim) ? 0 : $lim;
    $sql .= ', 5';
    Mais avec les fonctions de filtrage, tu es limité par la taille des différents types de données de ton système. Par exemple un entier (int) signé sur un système 32 bits oscille entre deux limites : − 2 147 483 648 to 2 147 483 647, si tu tombes pour pour n'importe quelle raison sur une valeur en dehors des limites, tu risques d'avoir des suprises.
    Un autre moyen pour être absolument sûr de n'avoir que des chiffres et ceci quelque soit le système c'est ctype_digit()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $lim  = (isset($_POST['pageBillets']) && ctype_digit($_POST['pageBillets'])) ? $_POST['pageBillets'] : '0';
    $sql  = 'SELECT *, DATE_FORMAT(date_creation, "%d/%m/%y %h:%i:%s") as date_creat FROM billets ORDER BY id DESC LIMIT '.$lim.', 5';

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Requête avec sous requête qui pose problème
    Par redoran dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 13/04/2014, 16h46
  2. Requête SQL qui pose problème
    Par berko dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/11/2013, 14h02
  3. Requête qui pose problème
    Par Tifany.Pitel dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 11/11/2011, 16h47
  4. Une requête qui pose problème
    Par supertoms dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/04/2008, 18h25
  5. Un cast de SmartPointer qui pose probléme
    Par Higestromm dans le forum C++
    Réponses: 3
    Dernier message: 13/10/2005, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo