salut,
$_SESSION['recherche'] = array();
tu écrase systématiquement $_SESSION['recherche'] donc aucune chance que tu ai autre chose qu'un tableau vide dans $_SESSION['recherche'] = array();
ce bout code
<?php//ça c'est juste la première fois qu'on arrive sur la page
if(empty($_SESSION['recherche'])){
$_SESSION['recherche']=array();
}
Évite l'écrasement, si le tableau existe déjà ont le garde.
as tu changer autre chose ?
quand au code :
pourquoi utiliser une fonction anonyme ?
pourquoi utiliser un passage par référence ?
c'est peux compréhensible et, a mon gout foireux.
en faite tu peux très bien avoir un tableau du style ['type','bien','habimm','type2','loc'] un foreach derrière avec ton code. Cela ne change rien et simplifie le code.
<?php
$f = ['type', 'bien', 'habimm', 'type2', 'loc'];
foreach ($f as $p) {
if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
$where[] = "$p = '" . mysql_real_escape_string($_POST[$p]) . "'";
$_SESSION['recherche'][$p] = $_POST[$p];
}
}
?>
au final ça peux donner ça :
<?php
session_start();
echo '<!-- top -->';
include 'includes/top.php';
echo '
<!-- Fin du Top -->
<!-- Formulaire de recherche -->';
include 'blocs/research-form.php';
echo ' <!-- Fin du formulaire de recherche -->';
if (empty($_SESSION['recherche'])) {
// gestion du where
$where = array();
$f = ['type', 'bien', 'habimm', 'type2', 'loc'];
foreach ($f as $p) {
if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
$where[] = "$p = '" . mysql_real_escape_string($_POST[$p]) . "'";
$_SESSION['recherche'][$p] = $_POST[$p];
}
}
// juste pour le cas où
if(empty($_SESSION['recherche'])) {
$_SESSION['recherche'] = [];
}
$prix_min_convert = str_replace(' ', '', $_POST['budget_min']);
$prix_min = (isset($prix_min_convert) && ctype_digit($prix_min_convert)) ? $prix_min_convert : 0;
$prix_max_convert = str_replace(' ', '', $_POST['budget_max']);
$prix_max = (isset($prix_max_convert) && ctype_digit($prix_max_convert)) ? $prix_max_convert : 999999999;
$_SESSION['recherche']['budget_min'] = $prix_min;
$_SESSION['recherche']['budget_max'] = $prix_max;
/// on crée une variable $requete pour faciliter l'écriture de la requête SQL.
$ville = htmlspecialchars($_POST['ville']);
echo $ville;
$where[] = "(prix BETWEEN $prix_min AND $prix_max) AND `list_villes`.`ville` LIKE '%$ville%' AND `list_villes`.`id` LIKE `list_biens`.`idville`";
$sql_where = ' WHERE ' . implode(' AND ', $where);
$_SESSION['recherche']['sql_where'] = $sql_where;
// gestion du tri
if ($_POST['tri'] == true) {
$order_by = (isset($_POST['tri']) && ($_POST['tri'] === 'DESC')) ? 'DESC' : 'ASC';
$sql_order_by = "ORDER BY prix $order_by";
$_SESSION['recherche']['tri'] = $order_by;
$_SESSION['recherche']['sql_order_by'] = $sql_order_by;
} else {
$sql_order_by = "ORDER BY `list_biens`.`id` DESC";
$_SESSION['recherche']['sql_order_by'] = $sql_order_by;
}
} else {
// on récupère les morceaux de sql assemblés précédemment
$sql_where = $_SESSION['recherche']['sql_where'];
$sql_order_by = $_SESSION['recherche']['sql_order_by'];
}
$target_page = "search-result.php";
echo "SELECT * FROM `list_biens`,`list_villes` $sql_where $sql_order_by";
$result = mysql_query("SELECT * FROM `list_biens`,`list_villes` $sql_where $sql_order_by $sql_limit") or die(mysql_errno() . ' :: ' . mysql_error());
if ($anno == ' ') {
echo'<i>Aucun résultat pour cette recherche.</i>';
exit();
}
// on compte le nombre total d'enregistrements renvoyés par la requête filtrée
$sql = 'SELECT COUNT(*) AS nbOfRec FROM `list_biens`, `list_villes` ' . $sql_where;
$qry = mysql_query($sql) or die(mysql_errno() . ' :: ' . mysql_error());
$nb_records = mysql_result($qry, 0, 0);
echo' <b>' . $nb_records . ' bien(s) correspondent à vos critères.
<a href="form_recherche.php" style="color:#ff40a0;text-decoration:none;">Faire une nouvelle recherche.</a></b>';
// on vérifie si la page demandée est dans les limites fixées par la pagination
$nb_items_per_page = 5;
$nb_pages = ceil($nb_records / $nb_items_per_page);
$asked_page = (isset($_GET['page']) && ctype_digit($_GET['page']) && ($_GET['page']))
? (int)$_GET['page']
: 1;
if ($nb_records === 0) {
$asked_page = 1;
} else
if ($asked_page > $nb_pages) {
// si la page demandée est supérieure au nombre total de pages alors
// page demandée = dernière page
$asked_page = $nb_pages;
}
// on détermine la clause LIMIT du sql à partir des données de pagination
if ($asked_page < 0) {
$asked_page = 1;
}
$offset = ($asked_page - 1) * $nb_items_per_page;
if ($offset < 0) {
$offset = 0;
}
$length = $nb_items_per_page;
$sql_limit = "LIMIT $offset, $length";
// on extrait les données à afficher
$sql = "SELECT * FROM `list_biens`, `list_villes` $sql_where $sql_order_by $sql_limit";
$data = mysql_query($sql) or die(mysql_error());
// PAGINATION //
// je suppose que ton index affiche 10 pages
$index_range = 4;
// détermination des bornes à afficher
if ($nb_pages <= $index_range) {
$index_start = 1;
$index_end = $nb_pages;
} else
if ($asked_page === 1) {
$index_start = 1;
$index_end = $index_range;
} else {
$index_start = $asked_page;
$index_end = (($index_start + $index_range) > $nb_pages) ? $nb_pages : ($index_start + $index_range);
}
// affichage des liens spéciaux : Premier Précedent Suivant Dernier
$show_first = ($index_start > 1);
$show_prev = ($asked_page > 1);
$show_next = ($asked_page < $nb_pages);
$show_last = ($index_end < $nb_pages);
// génération des la pagination
$paginate = array();
$paginate[] = '<div class="paginate">';
// lien Précédent
if ($show_prev) {
$paginate[] = '<font size="5"><b><a href="' . $target_page . '?page=' . ($asked_page - 1) . '" style="color:#ff40a0;text-decoration:none;">Page précédente <<</font></b></a> ';
}
// affichage des numéros des pages
for ($i = $index_start; $i <= $index_end; ++$i) {
$paginate[] = ($i === $asked_page)
? '<span class="current"><font color="#ff40a0" size="5"><b>' . $i . '</b></font></span> '
: '<font size="5"><b><a href="' . $target_page . '?page=' . $i . '" style="color:#000000;text-decoration:none;">' . $i . '</font></b></a> ';
}
// lien Suivant
if ($show_next) {
$paginate[] = ' <font size="5" color="#ff40a0"><b><a href="' . $target_page . '?page=' . ($asked_page + 1) . '" style="color:#ff40a0;text-decoration:none;">Page suivante >></font></b></a>';
}
$paginate[] = '</div>';
?>
Ceci dit il n'y as pas le formulaire de base donc on ne peux savoir ce qui est, normalement, envoyé.
Le code de création de la requête n'est exécuté que la première fois que tu valide le formulaire de recherche vu que tu ne te base que sur l'existence de la variable de session.
Le code sql est assez léger (pas de jointure par exemple).
as tu affiché la requête pour voir la différence entre les deux et ainsi voir quelle partie du code n'est pas exécutée ?
au final le merge est foireux parce que tu ne sais a quoi peux servir la ligne $_SESSION['recherche'] = array(); sur le formulaire de recherche.
elle sert à éviter le problème que j'indique plus haut, c'est a dire pouvoir réutiliser le formulaire de recherche.
donc le paramètre a imposer sur cette ligne c'est sur la validation du formulaire et non l'existence dans la session.
du coup le code devient
<?php
session_start();
echo '<!-- top -->';
include 'includes/top.php';
echo '
<!-- Fin du Top -->
<!-- Formulaire de recherche -->';
include 'blocs/research-form.php';
echo ' <!-- Fin du formulaire de recherche -->';
if (!empty($_POST['le nom du bouton valider par exemple'])) {
$_SESSION['recherche'] = [];
// gestion du where
$where = array();
$f = ['type', 'bien', 'habimm', 'type2', 'loc'];
foreach ($f as $p) {
if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
$where[] = "$p = '" . mysql_real_escape_string($_POST[$p]) . "'";
$_SESSION['recherche'][$p] = $_POST[$p];
}
}
$prix_min_convert = str_replace(' ', '', $_POST['budget_min']);
$prix_min = (isset($prix_min_convert) && ctype_digit($prix_min_convert)) ? $prix_min_convert : 0;
$prix_max_convert = str_replace(' ', '', $_POST['budget_max']);
$prix_max = (isset($prix_max_convert) && ctype_digit($prix_max_convert)) ? $prix_max_convert : 999999999;
$_SESSION['recherche']['budget_min'] = $prix_min;
$_SESSION['recherche']['budget_max'] = $prix_max;
/// on crée une variable $requete pour faciliter l'écriture de la requête SQL.
$ville = htmlspecialchars($_POST['ville']);
echo $ville;
$where[] = "(prix BETWEEN $prix_min AND $prix_max) AND `list_villes`.`ville` LIKE '%$ville%' AND `list_villes`.`id` LIKE `list_biens`.`idville`";
$sql_where = ' WHERE ' . implode(' AND ', $where);
$_SESSION['recherche']['sql_where'] = $sql_where;
// gestion du tri
if ($_POST['tri'] == true) {
$order_by = (isset($_POST['tri']) && ($_POST['tri'] === 'DESC')) ? 'DESC' : 'ASC';
$sql_order_by = "ORDER BY prix $order_by";
$_SESSION['recherche']['tri'] = $order_by;
$_SESSION['recherche']['sql_order_by'] = $sql_order_by;
} else {
$sql_order_by = "ORDER BY `list_biens`.`id` DESC";
$_SESSION['recherche']['sql_order_by'] = $sql_order_by;
}
} else {
// on récupère les morceaux de sql assemblés précédemment
$sql_where = $_SESSION['recherche']['sql_where'];
$sql_order_by = $_SESSION['recherche']['sql_order_by'];
}
$target_page = "search-result.php";
echo "SELECT * FROM `list_biens`,`list_villes` $sql_where $sql_order_by";
$result = mysql_query("SELECT * FROM `list_biens`,`list_villes` $sql_where $sql_order_by $sql_limit") or die(mysql_errno() . ' :: ' . mysql_error());
if ($anno == ' ') {
echo'<i>Aucun résultat pour cette recherche.</i>';
exit();
}
// on compte le nombre total d'enregistrements renvoyés par la requête filtrée
$sql = 'SELECT COUNT(*) AS nbOfRec FROM `list_biens`, `list_villes` ' . $sql_where;
$qry = mysql_query($sql) or die(mysql_errno() . ' :: ' . mysql_error());
$nb_records = mysql_result($qry, 0, 0);
echo' <b>' . $nb_records . ' bien(s) correspondent à vos critères.
<a href="form_recherche.php" style="color:#ff40a0;text-decoration:none;">Faire une nouvelle recherche.</a></b>';
// on vérifie si la page demandée est dans les limites fixées par la pagination
$nb_items_per_page = 5;
$nb_pages = ceil($nb_records / $nb_items_per_page);
$asked_page = (isset($_GET['page']) && ctype_digit($_GET['page']) && ($_GET['page']))
? (int)$_GET['page']
: 1;
if ($nb_records === 0) {
$asked_page = 1;
} else
if ($asked_page > $nb_pages) {
// si la page demandée est supérieure au nombre total de pages alors
// page demandée = dernière page
$asked_page = $nb_pages;
}
// on détermine la clause LIMIT du sql à partir des données de pagination
if ($asked_page < 0) {
$asked_page = 1;
}
$offset = ($asked_page - 1) * $nb_items_per_page;
if ($offset < 0) {
$offset = 0;
}
$length = $nb_items_per_page;
$sql_limit = "LIMIT $offset, $length";
// on extrait les données à afficher
$sql = "SELECT * FROM `list_biens`, `list_villes` $sql_where $sql_order_by $sql_limit";
$data = mysql_query($sql) or die(mysql_error());
// PAGINATION //
// je suppose que ton index affiche 10 pages
$index_range = 4;
// détermination des bornes à afficher
if ($nb_pages <= $index_range) {
$index_start = 1;
$index_end = $nb_pages;
} else
if ($asked_page === 1) {
$index_start = 1;
$index_end = $index_range;
} else {
$index_start = $asked_page;
$index_end = (($index_start + $index_range) > $nb_pages) ? $nb_pages : ($index_start + $index_range);
}
// affichage des liens spéciaux : Premier Précedent Suivant Dernier
$show_first = ($index_start > 1);
$show_prev = ($asked_page > 1);
$show_next = ($asked_page < $nb_pages);
$show_last = ($index_end < $nb_pages);
// génération des la pagination
$paginate = array();
$paginate[] = '<div class="paginate">';
// lien Précédent
if ($show_prev) {
$paginate[] = '<font size="5"><b><a href="' . $target_page . '?page=' . ($asked_page - 1) . '" style="color:#ff40a0;text-decoration:none;">Page précédente <<</font></b></a> ';
}
// affichage des numéros des pages
for ($i = $index_start; $i <= $index_end; ++$i) {
$paginate[] = ($i === $asked_page)
? '<span class="current"><font color="#ff40a0" size="5"><b>' . $i . '</b></font></span> '
: '<font size="5"><b><a href="' . $target_page . '?page=' . $i . '" style="color:#000000;text-decoration:none;">' . $i . '</font></b></a> ';
}
// lien Suivant
if ($show_next) {
$paginate[] = ' <font size="5" color="#ff40a0"><b><a href="' . $target_page . '?page=' . ($asked_page + 1) . '" style="color:#ff40a0;text-decoration:none;">Page suivante >></font></b></a>';
}
$paginate[] = '</div>';
?>
Il s'agit d'une validation de formulaire il faut donc traiter les données du formulaire et non les données de session (qui ne servent qu'a la pagination).
Il te faut aussi vérifier que les index existent dans $_POST avant de les utiliser.
que ce passe t'il si $_POST['budget_mini'] n'existe pas dans ce qui est transmis à php ? (sur cette ligne : $prix_min_convert = str_replace(' ', '', $_POST['budget_min']); qui peux utiliser la fonction
number_format ainsique
filter_var ).
je suppose que le echo $ville; ligne 38 est en trop ?
htmlspecialchars n'est a utiliser que pour l'affichage, poru la requête sql utilise
mysql_real_escpape_string
tu peux avantageusement supprimer les die, et traiter correctement les erreurs afin d'afficher un message d'erreur, plutot que finir brutalement la page.
Par exemple en utilisant le retour des fonctions mysql_* et le comparer à false, pour conditionner la suite (ou afficher une erreur).
L'extension mysql est voué a disparaître dans une futur version. tu peux utiliser à la place l'extension mysql
i qui est similaire (a quelques petite chose prêt) ou PDO si tu est tenté par la poo.
plus d'info dans la doc
Dernière chose, les tags php c'est <?php ?>, la versin courte (<? ?>) n'est pas le paramètrage par défaut de php et donc non universel. Utilise la version longue, ça ne coûte rien et évite les soucis en cas de mise à jour de version de php.
@+