Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2011, 22h02   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
Par défaut Requête qui pose problème

Bonsoir,
Voici une partie de mon code source :

Code :
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.
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 22h39   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

ça nous aiderait de connaître le message d'erreur que tu obtiens.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h35   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
Bonjours rawsrc,

Citation:
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
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h44   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

casting incorrect : essaies avec ça :
Code :
1
2
$limit = intval($_POST['pageBillets']);
$resultat->execute(array($limit));
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h57   #5
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
J'ai remplacer ceci...

Code :
$resultat->execute(array($_POST['pageBillets']));
...par tes 2 lignes de codes. Il y a toujours le même problème.

Citation:
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
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h04   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Ah bon ?
On va changer un peu :
Code :
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);
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h11   #7
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
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).
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h42   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h45   #9
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
Si $_POST['pageBillets'] n'existe pas, pas besoin de préparer la requête car il n'y a ps de variable dedans.

Citation:
il faut regarder comment tu retournes tes données
Dans les requêtes ou avec le formulaire ?
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h46   #10
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
J'ai repris ton code et il se résume à ceci :
Code :
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é
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h57   #11
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
Je ne comprend pas les lignes 9, 10, 11, 13, 16, 20, 22, 23, 29(++$i), 36
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 11h09   #12
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2011, 11h42   #13
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
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 :
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 ?
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 11h59   #14
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2011, 13h21   #15
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
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 ?
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h49   #16
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
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 :
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';
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 14h00   #17
Invité de passage
 
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 0
Points : 0
Merci !
MarvinR18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h23.


 
 
 
 
Partenaires

Hébergement Web