8796 sujets

Développement web côté serveur, CMS

Salut,

Voilà, j'ai un problème je cherche depuis quelques temps mais je trouve rien... Voilà mon code :


			if( preg_match("#^[a-z0-9-]+$#",$_GET['categorie']) && preg_match("#^[a-z0-9-]+$#",$_GET['niveau']) )
				{
			
				
				$niveau = explode("-", $_GET['niveau']);
				
				// Requête SQL
				$reponse = mysql_query("SELECT * FROM equipements WHERE categorie='".mysql_real_escape_string($_GET['categorie'])."' AND niveau>='".mysql_real_escape_string($niveau[0])."' AND niveau<='".mysql_real_escape_string($niveau[1])."' ORDER BY cast(niveau AS signed) ");
				}


Donc j'ai créer un script pour ne pas avoir à créer des tonnes de pages elle seront généré automatiquement.

Donc les pages générés auront ce type d'url.
http://www.mon-site.com/mapage.php?categorie=***&niveau=***

Je sélectionne ma catégorie et tous vas bien mais pour les niveaux il y a un souçi c'est qu'il n'affiche pas les bons niveaux ( les niveaux varient entre 1 et 200 )

Et quand je sélectionne par exemple la catégorie "sac" et je veux qu'il m'affiche ceux entre le niveau 1 et 190
Résultat : j'ai les objets du niveau 1 à 19 et ceux du level 190.

Tous les objets compris entre 19 et 190 sont zaapés.
Et c'est si je change les valeurs pour 1 à 40 par exemple, tous les objets du niveau 1 à 40 seront affichés jusqu'à là je suis content sauf que je vois un maudit objet niveau 190 venir gratter l'amitié...

EDIT : j'allais oublié, il prend également que 2 chiffre en compte c'est à dire que si je met les valeurs 1-200 il va afficher juste les objets du level 1 à 20 et ceux du level 190 ..

Donc si vous avez une solution à mon problème, je suis preneur.
Modifié par DjaSama (15 Sep 2010 - 21:43)
Salut,

hem... c'est pas très clair ton affaire :
* puisqu'à priori categorie ne peut contenir que des lettres en minuscules pourquoi faire
preg_match("#^[a-z0-9-]+$#",$_GET['categorie'])
?

* puisque visiblement (et d'ailleurs très logiquement) le niveau est numérique pourquoi le traiter comme une string (mysql_real_escape_string et cast) ?

Perso je l'aurais mis en numérique dans la table et j'aurais fait :
if( preg_match("#^[a-z]+$#", $_GET['categorie']) && preg_match("#^[0-9]+-[0-9]+$#", $_GET['niveau']) ) {
	$niveau = explode("-", $_GET['niveau']);
	// Requête SQL 
	$reponse = mysql_query("SELECT * FROM equipements WHERE categorie='". mysql_real_escape_string($_GET['categorie'])."' AND niveau BETWEEN (".intval($niveau[0]).", ".intval($niveau[1]).") ORDER BY niveau"); 
}
*Bah parce que mes champs sont en minuscules dans la bdd.

*Pourquoi pas ta méthode mais y a un truc que je comprend pas c'est le intval, je vais me renseigner avant de test ton code à toi.

Mais après je sais pas si cela pose souçi c'est que mes chiffres sont dans un champs en VARCHAR... donc je me demande si cela pourrait poser souçi ou ça n'a rien avoir ^^.

Cordialement,

EDI : C'est bon ça marche merci beaucoup Smiley smile
Modifié par DjaSama (15 Sep 2010 - 20:01)
DjaSama a écrit :
Bah parce que mes champs sont en minuscules dans la bdd.
Oui j'ai bien compris : je te demandais pourquoi tu autorisais des chiffres et le tiret.

DjaSama a écrit :
y a un truc que je comprend pas c'est le intval
Il n'est pas vraiment utile ici puisqu'il y a déjà le preg_match avant mais c'est une bonne habitude de s'assurer que des nombres sont bien des nombres (cf. intval).

DjaSama a écrit :
mes chiffres sont dans un champs en VARCHAR
Comme je te disais j'aurais commencé par mettre ce champ en numérique dans la table (INT ou SMALLINT unsigned par exemple).
Ah d'accord ^^.

Et après en ce qui concerne mon champ je l'ai mit en int mais le problème ce que mon site est lent maintenant :s

Mon problème est résolu. Merci encore
Modifié par DjaSama (15 Sep 2010 - 22:43)