Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 04/05/2011, 02h34   #1
Invité régulier
 
Inscription : juin 2009
Messages : 24
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 24
Points : 8
Points : 8
Par défaut un else qui refuse de s'éxécuter.

Bonjours!
Sur l'un de mes sites, j'ai ajouté quelques pages pour la mise en ligne de photo.

Tout s'est plutôt bien déroulé: upload sans problème, les photos s'affichait bien quand on cliquait sur leur titre dans une liste.

Seulement voilà: quand on veut regarder l'album photo en entier, c'est assez lassant de revenir à chaque fois à la liste pour sélectionner la photo suivante.
Du coup, j'ai rajouté un petit bouton, permettant de passer directement à la photo d'après, qui marchait lui aussi à la perfection: les photos étant numérotées d'un id, il suffisait d'incrémenter l'id et ça marchais.

Cependant, faille insidieuse, il arrive que des photos ait été supprimées. Du coup, il y as un "trou" dans la liste des id (ex: la photo 4 supprimée, la liste d'id est: [1,2,3,5,6...]).
Bien sûr, quand on clique sur "photo suivante" depuis la photo 3, on obtiens une page blanche pour la photo 4 (logique!).

J'ai ainsi écrit un petit scrit qui vérifiais si la photo existais ou pas (en vérifiant si par exemple son nom étais différent de "") et qui, en fonction, renvoyais l'id de la photo à afficher (le suivant, ou celui d'encore après, etc.).

Voici le script:
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
<?php
$test = "0";
$id = $_GET['photo'];
		while($test == "0")
		{
			try
			{
				$bdd = new PDO('mysql:host=localhost;dbname=ecole_db', 'root', '');
			}
			catch (Exception $e)
			{
				die('Erreur : ' . $e->getMessage());
			}
			$req = $bdd->query('SELECT * FROM photo WHERE id = '.$id.'');
			while ($donnees = $req->fetch())
			{
				if($donnees['nom'] != "")
				{
					$test = "1";
				}
				else
				{
					$id++;
				}
			}
		}
?>
Si la photo existe, tout ce passe bien: la variable $test passe à 1 comme prévu, la boucle s'arrête, et on peut récupérer $id pour afficher la photo.

En revanche, si ce n'est pas le cas... Eh bien, on n'entre pas dans le if... mais pas dans le else non plus!

C'est-à-dire qu'on tourne sur une boucle infinie.

Si je sort le $id++; du else, il s’exécute correctement et la boucle se termine (mais du coup, la boucle n'as plus aucun intérêt...).

Si je rajoute quelque chose d'autre dans le else (un echo, par exemple) il ne s'exécute pas.

Je ne vois pas du tout ce qui pourrais créer cela (pour moi, si on a un if... else, on rentre forcément soit dans le if, soit dans le else?) et toute aide serait la bienvenue =)

En vous remerciant d'avance...
Snap luvs pastèque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 08h45   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Méthode beaucoup plus simple : ta requête l'id précédent ou suivant directement.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 
$sens = ($_GET['sens'] == 'next') ? '>' : '<';
$id = intval($_GET['photo']);
 
try
			{
			$bdd = new PDO('mysql:host=localhost;dbname=ecole_db', 'root', '');
			}
			catch (Exception $e)
			{
				die('Erreur : ' . $e->getMessage());
			}
			$req = $bdd->query('SELECT nom FROM photo WHERE id ' . $sens .   $id  . ' ORDER BY id LIMIT 1');
			while ($donnees = $req->fetch())
			{
                         echo 'ma photo ' . $donnees['nom']
			}
?>
Je passerais rapidement sur les erreurs de construction de ton code comme la reconnexion à la base pour chaque requête, l'utilisation de chaine comme des entiers, l'absence de protection des variables, la non-utilisation de requêtes préparées pour des requêtes répétées.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/05/2011, 09h40   #3
Membre chevronné
 
Avatar de Elwyn
 
Homme
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 836
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux

Informations forums :
Inscription : juillet 2006
Messages : 836
Points : 712
Points : 712
Par défaut Volontairement oubliée

Bonjour,

pourquoi ne pas traiter ce problème directement avec MySQL ?
Une requête comme celle là ne conviendrait-elle pas ?

Code :
1
2
$current_id = mysql_real_escape_string($_GET['current_id']);
mysql_query("SELECT * FROM photo WHERE id > $current_id LIMIT 1");
Puisque ton auto-incrémentation est gérée de manière automatique, la requête, grâce à la condition, renverra forcément l'enregistrement suivant.
Par contre, comme l'a dit sabotage, se connecter à chaque fois à la base de données n'est vraiment pas bon..
__________________
Dire Straits, Bob Dylan, Led Zeppelin, the Who, Pink Floyd, AC/DC, Guns & Roses, the Doors, ...
Elwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 11h53   #4
Membre confirmé
 
Inscription : décembre 2006
Messages : 307
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 307
Points : 226
Points : 226
Je pense que la solution a été apportée, mais comme une chose m'a sauté aux yeux dans 2 posts sur 3 ....

Quelque chose du genre est une hérésieen terme de sécurité :
Code :
1
2
3
 
$var = $_GET['var'];
$ma_requete = "SELECT * FROM table WHERE colonne = $var";
Il faut toujours filtrer les entrées utilisateurs (cf intval de Sabotage).
__________________
Prestataires, inscrivez vous dans l'annuaire e-commerce des prestataires - foe.hn : un raccourcisseur d'url fun, avec API
max-mag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h25   #5
Invité régulier
 
Inscription : juin 2009
Messages : 24
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 24
Points : 8
Points : 8
Effectivement, la solution proposée fonctionne et est manifestement plus élégante.
Merci à tous pour vos réponses et conseils =)
Snap luvs pastèque 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 10h46.


 
 
 
 
Partenaires

Hébergement Web