Problème de filtres de recherche !

Petit nouveau ! | 7 Messages

16 sept. 2015, 16:55

Bonjour,
Je suis nouveau en PHP je me suis lancé dedans seul, après une formation sur le net, il y à environ 1 mois. Je me suis dit "rien de mieux que de faire un petit site pour prendre en main le langage" et j'ai donc décidé de faire un petit site de jeux vidéo.

Je bloque actuellement sur une page qui affiche les 50 derniers jeux vidéo, pour donner un coté fun je veux permettre a l'utilisateur de pouvoir utiliser des filtres qui changent les jeux en fonction de critères sélectionnés comme le type de jeu, le pegi, la console etc etc....

Et la ou j'ai un problème c'est que je dois sélectionner chaque critère pour afficher un jeu, si par exemple je veux afficher les FPS je dois par exemple sélectionner le PEGI pour les afficher... les champs de sélection sont du coup dépendant les un des autres et j'aimerai qu'on ne soit pas obligé de tout sélectionner (si on veut on peut mais ce n'est pas obligatoire)

Concrètement voila quelques screen

Je travail que pour l'instant avec le TYPE et PEGI, j'ai laissé console et note de coté

Quand j'arrive sur ma page et qu'aucun champs n'est sélectionné j'ai ceci:

Image

Si je selectionne les FPS (ils sont tous en PEGI 18 dans la BDD) avec le champs PEGI 18 j'ai ceci

Image

En revanche si je selectionne uniquement les FPS sans le PEGI j'ai ce message d'erreur

Notice: Undefined index: typepegi in /Applications/MAMP/SITE/gameadvise/gamelist.php on line 54

Je comprend que la variable $typepegi n'est pas défini mais c'est normal puisque je ne l'utilise pas et je ne veux pas l'utiliser... alors si vous savez comment faire pour que je puisse aussi filtrer avec une valeur unique ce serait super ! Pourriez vous m'aider ? Par avance merci

Voici mon code
<?php session_start();

// Connexion à la base de données

$bdd= new PDO('mysql:host=localhost;dbname=bd_gameadvice;charset=utf8','root','root');

include('header.php');

	// REQUETE AFFICHAGE JEUX 

	$selectgame = $bdd->query('SELECT * FROM jeux ORDER BY id DESC');

	// REQUETE PEGI

	$selectpegi = $bdd->query('SELECT * FROM pegi_jeux');

	// REQUETE TYPE

	$selecttype = $bdd->query('SELECT * FROM type_jeux');

	// REQUETE CONSOLES

	$selectconsole = $bdd->query('SELECT * FROM console');
	


?>

	<div class="container">

	<div class="row">
		<form method="post" action="">
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typegame" ><option value="" disabled selected>Choisissez un type</option><?php while ($type = $selecttype->fetch()) { echo "<option value='".$type['id']."'>".$type['type_nom']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-3"><select class="form-control" name="typenote"><option value="" disabled selected>Note Moyenne</option><option value='1'>Moyenne à partir de 1.</option><option value='2'>Moyenne à partir de 2.</option><option value='3'>Moyenne à partir de 3.</option><option value='4'>Moyenne à partir de 4.</option></select></div>
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typeconsole"><option value="" disabled selected>Console</option><?php while ($console = $selectconsole->fetch()) { echo "<option value='".$console['id']."'>".$console['nomconsole']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typepegi"><option value="" disabled selected>Classification</option><?php while ($pegi = $selectpegi->fetch()) { echo "<option value='".$pegi['id']."'>".$pegi['pegi_nom']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-2"><button type="submit" class="btn btn-primary" name="searchgamelist">RECHERCHER</button></div></div>
		</form>
	</div><br><br><br><br>

		<div class="row">
			<div class="col-md-12">

			<?php

				if (isset($_POST['searchgamelist'])) {


					// FILTRE AFFICHAGE TYPE DE JEU
					
					if (!empty($_POST['typegame']) OR !empty($_POST['typepegi'])) {
						
						$affichetype = $bdd->prepare('SELECT jeux.titre, jeux.id, jeux.jaquette FROM jeux WHERE id_typejeu = ? AND id_pegi = ? ORDER BY id DESC'); //AFFICHAGE DU TYPE DE JEUX
						$affichetype->execute(array($_POST['typegame'], $_POST['typepegi']));



							while ($searchtype = $affichetype->fetch()) {?>
								
									<div class = "col-md-2"><a href="game.php?id=<?php echo $searchtype['id']?>">

									<?php


										if (!empty($searchtype['jaquette'])) {?>

											<img width="160" height="199" title="<?php echo $searchtype['titre'] ;?>" src="img/jaquette/<?php echo $searchtype['jaquette'] ?>">


										<?php }else{?>

											<img width="160" height="199" title="<?php echo $searchtype['titre'] ;?>" src="img/jaquette/jdefaut.png">


										<?php }

									?>


									</a>
									<center><a href="game.php?id=<?php echo $searchtype['id'] ;?>"><?php echo substr($searchtype['titre'],0, 20).' ...';?></a></center>
									

									<center><?php 

									$reqnote = $bdd->prepare('SELECT AVG(note) FROM notes WHERE id_jeux_note = ?');
									$reqnote->execute(array($searchtype['id']));

									while ($note = $reqnote->fetch()) {

									if (isset($note['AVG(note)'])) {

										$notemoyenne = round($note['AVG(note)'], 1);

											if ($notemoyenne >= 1 AND $notemoyenne < 1.4 ) {?>
				
												<img src="img/notes/1.png">

											<?php }elseif($notemoyenne >=1.5 AND $notemoyenne < 2){?>

												<img width="100" height="20" src="img/notes/15.png">

											<?php }elseif($notemoyenne >=2 AND $notemoyenne < 2.4){?>

												<img width="100" height="20" src="img/notes/2.png">

											<?php }elseif($notemoyenne >=2.5 AND $notemoyenne < 3){?>

												<img width="100" height="20" src="img/notes/25.png">

											<?php }elseif($notemoyenne >= 3 AND $notemoyenne < 3.4){?>

												<img width="100" height="20" src="img/notes/3.png">

											<?php }elseif($notemoyenne >= 3.5 AND $notemoyenne < 4){?>

												<img width="100" height="20" src="img/notes/35.png">

											<?php }elseif($notemoyenne >= 4 AND $notemoyenne < 4.4){?>

												<img width="100" height="20" src="img/notes/4.png">

											<?php }elseif($notemoyenne >= 4.4 AND $notemoyenne < 5){?>

												<img width="100" height="20" src="img/notes/45.png">

											<?php }elseif($notemoyenne == 5){?>

												<img width="100" height="20" src="img/notes/5.png">

											<?php }

									}else{

										echo "<em>Pas encore de note.</em>";

									} ?></center><br></div>

									

								<?php }

									} // while ($searchtype = $affichetype->fetch())

									 // FIN FILTRE TYPE DE JEU

									}
									



									}else{ //TOUS LES JEUX SANS FILTRE


									while ($jeulist = $selectgame->fetch()) 


					{?>
						
						<div class = "col-md-2"><a href="game.php?id=<?php echo $jeulist['id']?>">


						<?php 

							if (!empty($jeulist['jaquette'])) {?>

							<img width="160" height="199" title="<?php echo $jeulist['titre'] ;?>" src="img/jaquette/<?php echo $jeulist['jaquette'] ?>"></a>


								
							<?php } else{?>

							<img width="160" height="199" title="<?php echo $jeulist['titre'] ;?>" src="img/jaquette/jdefaut.png"></a>




							<?php }


						?>							

						<center><a href="game.php?id=<?php echo $jeulist['id'] ;?>"><?php echo substr($jeulist['titre'],0, 20).' ...';?></a></center>

							<center><?php 

								$reqnote = $bdd->prepare('SELECT AVG(note) FROM notes WHERE id_jeux_note = ?');
								$reqnote->execute(array($jeulist['id']));

								while ($note = $reqnote->fetch()) {

									if (isset($note['AVG(note)'])) {

										$notemoyenne = round($note['AVG(note)'], 1);

											if ($notemoyenne >= 1 AND $notemoyenne < 1.4 ) {?>
				
												<img src="img/notes/1.png">

											<?php }elseif($notemoyenne >=1.5 AND $notemoyenne < 2){?>

												<img width="100" height="20" src="img/notes/15.png">

											<?php }elseif($notemoyenne >=2 AND $notemoyenne < 2.4){?>

												<img width="100" height="20" src="img/notes/2.png">

											<?php }elseif($notemoyenne >=2.5 AND $notemoyenne < 3){?>

												<img width="100" height="20" src="img/notes/25.png">

											<?php }elseif($notemoyenne >= 3 AND $notemoyenne < 3.4){?>

												<img width="100" height="20" src="img/notes/3.png">

											<?php }elseif($notemoyenne >= 3.5 AND $notemoyenne < 4){?>

												<img width="100" height="20" src="img/notes/35.png">

											<?php }elseif($notemoyenne >= 4 AND $notemoyenne < 4.4){?>

												<img width="100" height="20" src="img/notes/4.png">

											<?php }elseif($notemoyenne >= 4.4 AND $notemoyenne < 5){?>

												<img width="100" height="20" src="img/notes/45.png">

											<?php }elseif($notemoyenne == 5){?>

												<img width="100" height="20" src="img/notes/5.png">

											<?php }

														}else{

															echo "<em>Pas encore de note.</em>";

														}

													}



												?></center><br>	

											</div>
											

									<?php }	

									}
									?>


			</div>
		</div>	
	</div> <!-- FIN CONTAINER -->

<?php include('footer.php'); ?>
Modifié en dernier par Titan87 le 16 sept. 2015, 17:22, modifié 1 fois.

Mammouth du PHP | 2703 Messages

16 sept. 2015, 17:09

il faut un truc du genre
$sql = "select * from console where 1"
if(champ1 rempli){
$sql .= " and champ1= $val";
}
if(champ2 rempli){
$sql .= " and champ2= $val";
}
et tu as alors une requete complète dans $sql

Petit nouveau ! | 7 Messages

16 sept. 2015, 17:12

Merci pour cette réponse
En gros faut que je mette mes requetes a la suite ? sans mettre les $_POST dans la même condition ?

Petit nouveau ! | 7 Messages

16 sept. 2015, 18:43

J'ai essayé mais si je fais comme ça et que je demande un type fps avec un pegi 18 ça m'affiche tous les jeux en PEGI avec tous les fps alors que je voulais tous les fps en PEGI 18 uniquement

Petit nouveau ! | 7 Messages

17 sept. 2015, 14:58

Je me casse la tête depuis 3 jours si quelqu'un pouvait me sauver ce serait super :p

Mammouth du PHP | 2703 Messages

17 sept. 2015, 15:05

le code modifié, stp

Petit nouveau ! | 7 Messages

17 sept. 2015, 15:12

Je suis revenu en arriere voyant que ca ne marchait pas du coup j'en suis lamentablement là... :oops:
<?php session_start();

// Connexion à la base de données

$bdd= new PDO('mysql:host=localhost;dbname=bd_gameadvice;charset=utf8','root','root');

include('header.php');

	// REQUETE AFFICHAGE JEUX 

	$selectgame = $bdd->query('SELECT * FROM jeux ORDER BY id DESC');

	// REQUETE PEGI

	$selectpegi = $bdd->query('SELECT * FROM pegi_jeux');

	// REQUETE TYPE

	$selecttype = $bdd->query('SELECT * FROM type_jeux');

	// REQUETE CONSOLES

	$selectconsole = $bdd->query('SELECT * FROM console');
	


?>

	<div class="container">

	<div class="row">
		<form method="post" action="">
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typegame" ><option value="0">Choisissez un type</option><?php while ($type = $selecttype->fetch()) { echo "<option value='".$type['id']."'>".$type['type_nom']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-3"><select class="form-control" name="typenote"><option value="" disabled selected>Note Moyenne</option><option value='1'>Moyenne à partir de 1.</option><option value='2'>Moyenne à partir de 2.</option><option value='3'>Moyenne à partir de 3.</option><option value='4'>Moyenne à partir de 4.</option></select></div>
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typeconsole"><option value="" disabled selected>Console</option><?php while ($console = $selectconsole->fetch()) { echo "<option value='".$console['id']."'>".$console['nomconsole']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-2"><select class="form-control" name="typepegi"><option value="0">Classification</option><?php while ($pegi = $selectpegi->fetch()) { echo "<option value='".$pegi['id']."'>".$pegi['pegi_nom']."</option>";} ?></select></div>
			<div class="form-group"><div class="col-md-2"><button type="submit" class="btn btn-primary" name="searchgamelist">RECHERCHER</button></div></div>
		</form>
	</div><br><br><br><br>

		<div class="row">
			<div class="col-md-12">

			<?php

				if (isset($_POST['searchgamelist'])) {


					// FILTRE AFFICHAGE TYPE DE JEU
					
					if (!empty($_POST['typegame']) OR !empty($_POST['typepegi'])) {
						
						$affichetype = $bdd->prepare('SELECT jeux.titre, jeux.id, jeux.jaquette FROM jeux WHERE id_typejeu = ? AND id_pegi = ? ORDER BY id DESC'); //AFFICHAGE DU TYPE DE JEUX
						$affichetype->execute(array($_POST['typegame'], $_POST['typepegi']));



							while ($searchtype = $affichetype->fetch()) {?>
								
									<div class = "col-md-2"><a href="game.php?id=<?php echo $searchtype['id']?>">

									<?php


										if (!empty($searchtype['jaquette'])) {?>

											<img width="160" height="199" title="<?php echo $searchtype['titre'] ;?>" src="img/jaquette/<?php echo $searchtype['jaquette'] ?>">


										<?php }else{?>

											<img width="160" height="199" title="<?php echo $searchtype['titre'] ;?>" src="img/jaquette/jdefaut.png">


										<?php }

									?>


									</a>
									<center><a href="game.php?id=<?php echo $searchtype['id'] ;?>"><?php echo substr($searchtype['titre'],0, 20).' ...';?></a></center>
									

									<center><?php 

									$reqnote = $bdd->prepare('SELECT AVG(note) FROM notes WHERE id_jeux_note = ?');
									$reqnote->execute(array($searchtype['id']));

									while ($note = $reqnote->fetch()) {

									if (isset($note['AVG(note)'])) {

										$notemoyenne = round($note['AVG(note)'], 1);

											if ($notemoyenne >= 1 AND $notemoyenne < 1.4 ) {?>
				
												<img src="img/notes/1.png">

											<?php }elseif($notemoyenne >=1.5 AND $notemoyenne < 2){?>

												<img width="100" height="20" src="img/notes/15.png">

											<?php }elseif($notemoyenne >=2 AND $notemoyenne < 2.4){?>

												<img width="100" height="20" src="img/notes/2.png">

											<?php }elseif($notemoyenne >=2.5 AND $notemoyenne < 3){?>

												<img width="100" height="20" src="img/notes/25.png">

											<?php }elseif($notemoyenne >= 3 AND $notemoyenne < 3.4){?>

												<img width="100" height="20" src="img/notes/3.png">

											<?php }elseif($notemoyenne >= 3.5 AND $notemoyenne < 4){?>

												<img width="100" height="20" src="img/notes/35.png">

											<?php }elseif($notemoyenne >= 4 AND $notemoyenne < 4.4){?>

												<img width="100" height="20" src="img/notes/4.png">

											<?php }elseif($notemoyenne >= 4.4 AND $notemoyenne < 5){?>

												<img width="100" height="20" src="img/notes/45.png">

											<?php }elseif($notemoyenne == 5){?>

												<img width="100" height="20" src="img/notes/5.png">

											<?php }

									}else{

										echo "<em>Pas encore de note.</em>";

									} ?></center><br></div>

									

								<?php }

									} // while ($searchtype = $affichetype->fetch())

									 // FIN FILTRE TYPE DE JEU

									}
									



									}else{ //TOUS LES JEUX SANS FILTRE


									while ($jeulist = $selectgame->fetch()) 


					{?>
						
						<div class = "col-md-2"><a href="game.php?id=<?php echo $jeulist['id']?>">


						<?php 

							if (!empty($jeulist['jaquette'])) {?>

							<img width="160" height="199" title="<?php echo $jeulist['titre'] ;?>" src="img/jaquette/<?php echo $jeulist['jaquette'] ?>"></a>


								
							<?php } else{?>

							<img width="160" height="199" title="<?php echo $jeulist['titre'] ;?>" src="img/jaquette/jdefaut.png"></a>




							<?php }


						?>							

						<center><a href="game.php?id=<?php echo $jeulist['id'] ;?>"><?php echo substr($jeulist['titre'],0, 20).' ...';?></a></center>

							<center><?php 

								$reqnote = $bdd->prepare('SELECT AVG(note) FROM notes WHERE id_jeux_note = ?');
								$reqnote->execute(array($jeulist['id']));

								while ($note = $reqnote->fetch()) {

									if (isset($note['AVG(note)'])) {

										$notemoyenne = round($note['AVG(note)'], 1);

											if ($notemoyenne >= 1 AND $notemoyenne < 1.4 ) {?>
				
												<img src="img/notes/1.png">

											<?php }elseif($notemoyenne >=1.5 AND $notemoyenne < 2){?>

												<img width="100" height="20" src="img/notes/15.png">

											<?php }elseif($notemoyenne >=2 AND $notemoyenne < 2.4){?>

												<img width="100" height="20" src="img/notes/2.png">

											<?php }elseif($notemoyenne >=2.5 AND $notemoyenne < 3){?>

												<img width="100" height="20" src="img/notes/25.png">

											<?php }elseif($notemoyenne >= 3 AND $notemoyenne < 3.4){?>

												<img width="100" height="20" src="img/notes/3.png">

											<?php }elseif($notemoyenne >= 3.5 AND $notemoyenne < 4){?>

												<img width="100" height="20" src="img/notes/35.png">

											<?php }elseif($notemoyenne >= 4 AND $notemoyenne < 4.4){?>

												<img width="100" height="20" src="img/notes/4.png">

											<?php }elseif($notemoyenne >= 4.4 AND $notemoyenne < 5){?>

												<img width="100" height="20" src="img/notes/45.png">

											<?php }elseif($notemoyenne == 5){?>

												<img width="100" height="20" src="img/notes/5.png">

											<?php }

														}else{

															echo "<em>Pas encore de note.</em>";

														}

													}



												?></center><br>	

											</div>
											

									<?php }	

									}
									?>


			</div>
		</div>	
	</div> <!-- FIN CONTAINER -->

<?php include('footer.php'); ?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 sept. 2015, 09:54

Bonjour,

Le message "Notice: Undefined index: typepegi" signifie que tu fais appel à l'index typepegi d'un tableau sans avoir vérifié au préalable que celui-ci existait.

Tu as bien un if() pour vérifier l'existence de $_POST['typegame'] et $_POST['typepegi'], mais à cause du "OR", il suffit qu'une seule de ces deux variables soit définie pour que le reste du code soit exécuté. Du coup s'il n'y a effectivement qu'une seule variable de spécifiée, les appels à ll'autre engendreront des avertissements.

Il faudrait donc construire ta requête dynamiquement en prenant en compte chacun des éléments envoyés du formulaire de façon indépendante
if (!empty($_POST['typegame']) || !empty($_POST['typepegi'])) {            
   $condSQL = array(); // tableau des critères de recherche sql
   $paramSQL = array(); // tableau des valeurs correspondante
   if (!empty($_POST['typegame']) { // si le type de jeu est défini 
      $condSQL[] = ' id_typejeu = ? ';
      $paramSQL[] = $_POST['typegame'];
   }
   if (!empty($_POST['typepegi']) { // si l'indice pegi est défini 
      $condSQL[] = ' id_pegi = ? ';
      $paramSQL[] = $_POST['typepegi'];
   }

   $sql = 'SELECT jeux.titre, jeux.id, jeux.jaquette FROM jeux '; // début de la requête
   if (!empty($condSQL)) // s'il y a des conditions à la requête
      $sql.= ' WHERE ' . implode(' AND ', $condSQL); // ajout de la ou des conditions séparées le cas échéant par "AND"
   $sql.= ' ORDER BY id DESC'; // fin de la requête
   $affichetype = $bdd->prepare($sql); //AFFICHAGE DU TYPE DE JEUX
   $affichetype->execute($paramSQL); // exécution et passage des paramètres

   ...
}
(Nota : il est préférable d'utiliser l'opérateur "||" en php au lieu du "OR". Ces deux opérateurs ne sont pas tout à fait identiques en terme de préséance d'exécution et le "OR" en php peut parfois poser problème si on ne sait pas exactement pourquoi on l'utilise ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...