Page 1 sur 2
Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:00
par Tenebross
Bonsoir,
je viens de commencer une formation pour devenir développeur fullstack. et le soir je tente de m’entraîner sur ce que nous voyons et également de tenter de prendre des initiatives d'apprentissage.
Et comme exercice je me lance dans la création d'un site de ventes de jeux vidéo d'occasion en utilisant les langages html css et php. Pour ce qui est de html et css seul j'arrive a comprendre comment ils fonctionnent mais pour ce qui est d'utiliser php avec le reste c'est pas la même limonade ^^.
Voila qui es fait pour la présentation
et maintenant je passe au vif du sujet. je suis parvenu a afficher ma table "jeux_video" de la BDD assez simplement mais pour ce qui est de la suite je galère énormément, je souhaite trier l'affichage en fonction d'un select sans changer de page comme on le voit dans beaucoup de site web.
Pour faire ça j'ai tenter de recréer l'affichage dans une fonction a part pour en faire appel lorsque l'on sélectionne la valeur du <select> sauf que dés que j'inclus le .php j'ai des erreurs.
Voici mon code:
<?php
require_once 'functions/connectDB.php';
require_once 'functions/tri.php';
$connect = connectDB();
$tri = triListe();
?>
<!DOCTYPE html>
<html lang="en">
<head>
[...]
</head>
<body>
<header>
<?php include_once 'menu.php'; ?>
</header>
<div class="body">
<form action="" method="post">
<select type="submit" name="tri" id="tri" onChange="this.form.submit();">
<option value="">Choisir tri</option>
<option value="prix">Prix</option>
<option value="proprietaire">Propriétaire</option>
</select>
</form>
<div class="listJeux">
<?php
$triPrix = $_POST['prix'];
$sql_tri_prix = "SELECT * FROM jeux_video ORDER BY '$triPrix'";
$result = mysqli_query($connect, $sql_tri);
echo $tri;
?>
</div>
</div>
</body>
</html>
J'espère avoir réussi à être clair et que ma question n'ai pas déjà été posé ^^'
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:08
par or 1
il est possible de trier sans recharger la page complètement en ajax, mais c'est probablement inutile vu que le tri peut se faire sans redemander les données à php avec
https://datatables.net/
pour le code présenté, sans savoir ce qu'il y a dans require_once 'functions/tri.php'; impossible de savoir si des choses posent problème.
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:10
par Tenebross
pour le code présenté, sans savoir ce qu'il y a dans require_once 'functions/tri.php'; impossible de savoir si des choses posent problème.
c'est exact désolé ^^'
<?php
function triListe(){?>
<?php
while ($assoc = mysqli_fetch_assoc($result)) {?>
<div class="cadre">
<div class="titre">
<img src="src/SuperMarioBros1.png" alt="Super mario Bros" class="imgjeux">
<p> <?= $assoc['nom']?></p>
</div>
<div class="info">
<div class="info1">
<div class="vendeur"><p><?= "Vendeur : ".$assoc['possesseur'];?></p> </div>
<div class="console"><p><?= "Console : ".$assoc['console'];?></p></div>
<div class="nombre"><p><?= "Nombre de joueurs maximum : ".$assoc['nbre_joueurs_max'];?></p></div>
<div class="prix"><p><?= "Prix : ".$assoc['prix']." €";?></p></div>
</div>
<div class="info2">
<div class="com">
<p>Commentaires:</p>
</div>
<div class="commentaires"><p><?= "<br>".$assoc['commentaires'];?></p></div>
</div>
</div>
</div>
<?php
}
?>
<?php
}?>
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:16
par or 1
cela génère plein d'erreurs à mon avis. il faut donc afficher les erreurs, les comprendre et corriger; et repartir du code qui affiche le contenu de la table.
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:23
par Tenebross
d'accord je remet le tout a la dernière version qui fonctionne et je vous l'affiche après merci
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:26
par Tenebross
voici mon code qui affiche ma base de donnée
<?php
require_once 'functions/connectDB.php';
$connect = connectDB();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
[...]
<title>OccasGames</title>
</head>
<body>
<header>
<?php include_once 'menu.php'; ?>
</header>
<div class="body">
<form action="" method="post">
<select type="submit" name="tri" id="tri" onChange="this.form.submit();">
<option value="">Choisir tri</option>
<option value="prix">Prix</option>
<option value="proprietaire">Propriétaire</option>
</select>
</form>
<div class="listJeux">
<?php $sql_liste_jeuxvideo = "SELECT * FROM jeux_video";
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
while ($assoc = mysqli_fetch_assoc($result)) {?>
<div class="cadre">
<div class="titre">
<img src="src/SuperMarioBros1.png" alt="Super mario Bros" class="imgjeux">
<p> <?= $assoc['nom']?></p>
</div>
<div class="info">
<div class="info1">
<div class="vendeur"><p><?= "Vendeur : ".$assoc['possesseur'];?></p> </div>
<div class="console"><p><?= "Console : ".$assoc['console'];?></p></div>
<div class="nombre"><p><?= "Nombre de joueurs maximum : ".$assoc['nbre_joueurs_max'];?></p></div>
<div class="prix"><p><?= "Prix : ".$assoc['prix']." €";?></p></div>
</div>
<div class="info2">
<div class="com">
<p>Commentaires:</p>
</div>
<div class="commentaires"><p><?= "<br>".$assoc['commentaires'];?></p></div>
</div>
</div>
</div>
<?php
}
?>
</div>
</div>
</body>
</html>
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 19:29
par or 1
en oubliant le formulaire pour l'instant (donc en codant en dur), que faut-il changer dans ce code pour trier par prix, par propriétaire ?
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 20:49
par Tenebross
Ah trop cool ta façon de procéder j'adore merci beaucoup !!!
et bien en codant en dur juste pour pouvoir trier a partir de ma requête sql actuel "SELECT * FROM jeux_video" je rajoute "ORDER BY prix" pour trier par le prix ou en rajoutant "ORDER BY proprietaire" pour trier par rapport au propriétaire
c'est ça ?
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 20:57
par or 1
oui, reste maintenant à exécuter la bonne requête selon le choix du formulaire.
et se rendre compte que l'exigence "souhaite trier l'affichage en fonction d'un select sans changer de page comme on le voit dans beaucoup de site web" n'est pas atteinte car la page est rechargée suite à la soumission du formulaire.
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 21:15
par Tenebross
donc en terme d'optimisation effectivement ce n'est pas rentable. Le mieux serait donc (comme tu l'as dit initialement) de passer par du js pour changer la disposition de mon affichage afin d'obtenir le résultat voulu or j'ai loupé la semaine sur le js ... mais il faut bien que j’apprenne ^^ mais ça m’intéresse quand même de voir comment faire même si je dois recharger la page
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 21:16
par or 1
reste maintenant à exécuter la bonne requête selon le choix du formulaire.
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 22:06
par Tenebross
Alors du coup avec mon formulaire je tente de les trier avec des if
if ($_POST['tri'] == NULL) {
$sql_liste_jeuxvideo = "SELECT * FROM jeux_video";
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
while ($assoc = mysqli_fetch_assoc($result)) {?>
<div class="cadre">
<div class="titre">
<img src="src/SuperMarioBros1.png" alt="Super mario Bros" class="imgjeux">
<p> <?= $assoc['nom']?></p>
</div>
<div class="info">
<div class="info1">
<div class="vendeur"><p><?= "Vendeur : ".$assoc['possesseur'];?></p> </div>
<div class="console"><p><?= "Console : ".$assoc['console'];?></p></div>
<div class="nombre"><p><?= "Nombre de joueurs maximum : ".$assoc['nbre_joueurs_max'];?></p></div>
<div class="prix"><p><?= "Prix : ".$assoc['prix']." €";?></p></div>
</div>
<div class="info2">
<div class="com">
<p>Commentaires:</p>
</div>
<div class="commentaires"><p><?= "<br>".$assoc['commentaires'];?></p></div>
</div>
</div>
</div>
<?php
}
}
if ($_POST['tri'] === "prix") {
$sql_liste_jeuxvideo = "SELECT * FROM jeux_video ORDER BY prix";
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
while ($assoc = mysqli_fetch_assoc($result)) {?>
<div class="cadre">
<div class="titre">
<img src="src/SuperMarioBros1.png" alt="Super mario Bros" class="imgjeux">
<p> <?= $assoc['nom']?></p>
</div>
<div class="info">
<div class="info1">
<div class="vendeur"><p><?= "Vendeur : ".$assoc['possesseur'];?></p> </div>
<div class="console"><p><?= "Console : ".$assoc['console'];?></p></div>
<div class="nombre"><p><?= "Nombre de joueurs maximum : ".$assoc['nbre_joueurs_max'];?></p></div>
<div class="prix"><p><?= "Prix : ".$assoc['prix']." €";?></p></div>
</div>
<div class="info2">
<div class="com">
<p>Commentaires:</p>
</div>
<div class="commentaires"><p><?= "<br>".$assoc['commentaires'];?></p></div>
</div>
</div>
</div>
<?php
}
}
if ($_POST['tri'] === "proprietaire") {
$sql_liste_jeuxvideo = "SELECT * FROM jeux_video ORDER BY proprietaire";
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
while ($assoc = mysqli_fetch_assoc($result)) {?>
<div class="cadre">
<div class="titre">
<img src="src/SuperMarioBros1.png" alt="Super mario Bros" class="imgjeux">
<p> <?= $assoc['nom']?></p>
</div>
<div class="info">
<div class="info1">
<div class="vendeur"><p><?= "Vendeur : ".$assoc['possesseur'];?></p> </div>
<div class="console"><p><?= "Console : ".$assoc['console'];?></p></div>
<div class="nombre"><p><?= "Nombre de joueurs maximum : ".$assoc['nbre_joueurs_max'];?></p></div>
<div class="prix"><p><?= "Prix : ".$assoc['prix']." €";?></p></div>
</div>
<div class="info2">
<div class="com">
<p>Commentaires:</p>
</div>
<div class="commentaires"><p><?= "<br>".$assoc['commentaires'];?></p></div>
</div>
</div>
</div>
<?php
}
}?>
Mais j'ai un message d’erreur lorsque je sélectionne "proprietaire" que voici:
( ! ) Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in E:\Téléchargement\Documents\Git\Projet_PHP\page_acceuil.php on line 92
Call Stack
# Time Memory Function Location
1 0.0001 404824 {main}( ) ...\index.php:0
2 0.0001 405152 include_once( 'E:\Téléchargement\Documents\Git\Projet_PHP\page_acceuil.php' ) ...\index.php:3
3 0.0012 420376 mysqli_fetch_assoc ( )
et évidemment je ne comprend pas le message d'erreur alors que je sais que l'erreur et sans nul doute évidente
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 22:14
par or 1
mysqli_fetch_assoc($result)
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean
le message t'indique que $result est un boléan.
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
$result provient donc de la fonction mysqli_query
la doc
https://www.php.net/manual/fr/mysqli.query.php indique ce que retourne cette fonction.
un programmeur est fainéant, s'il doit modifier quelque chose, il n'a pas envie de le faire à 3 endroits quand un seul suffirait.
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 22:24
par Tenebross
mysqli_fetch_assoc($result)
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean
le message t'indique que $result est un boléan.
$result = mysqli_query($connect, $sql_liste_jeuxvideo);
$result provient donc de la fonction mysqli_query
la doc
https://www.php.net/manual/fr/mysqli.query.php indique ce que retourne cette fonction.
un programmeur est fainéant, s'il doit modifier quelque chose, il n'a pas envie de le faire à 3 endroits quand un seul suffirait.
malheureusement j'arrive pas a tout comprendre de ta réponse
j'ai compris que mon $result est un bouléen mais c'est tout
tu me dit que le $result viens mysqli_query et me donne la doc sur cette fonction mais je ne la comprend pas désolé ^^"
pour moi cette fonction sert a se connecter a la BDD, interpréter la requête et nous la retourner.
je comprend la dernière phrase mais je sais pas ou et comment l'appliquer : 3
Re: Créer un <select> pour trier le contenu afficher d'une base de donnée
Posté : 02 oct. 2019, 22:35
par or 1
cette fonction sert a se connecter a la BDD, interpréter la requête et nous la retourner.
relis la doc, surtout la partie qui indique ce que retourne cette fonction.