Sessions

Petit nouveau ! | 3 Messages

11 avr. 2013, 06:41

Bonjour à tous,

Voilà, je suis en train de développé une nouvelle version d'un site web,

Auparavant j'avais mon formulaire de recherche sur une page indépendante au traitement, donc 2 pages.

J'ai voulu inclure le formulaire de recherche dans la page de traitement mais sans succès.

Donc avant, research-form.php, formulaire banal mais avec :
$_SESSION['recherche'] = array(); 
en plus.

et puis search-result, la page de traitement.

Indépendant cela fonctionne correctement.

Voilà le code de la page :
(research-form.php correspond au formulaire de recherche inclu dans la page.)

page search-result.php (traitement + formulaire).
<?php 
session_start();
$_SESSION['recherche'] = array();
?>

<!-- Top -->    
<?php 
include 'includes/top.php';
?>
<!-- Fin du Top -->  
    
<!-- Formulaire de recherche -->   
<?php 
include 'blocs/research-form.php';
?> 
<!-- Fin du formulaire de recherche -->  
	
<?
if(empty($_SESSION['recherche'])){
// gestion du where
$where = array();

$filter = function($p) use (&$where) {
if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
$where[] = "$p = '".mysql_real_escape_string($_POST[$p])."'";
$_SESSION['recherche'][$p] = $_POST[$p];
}
};
 
$filter('type');
$filter('bien');
$filter('habimm');
$filter('type2');
$filter('loc');

$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'&nbsp;<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>&nbsp;';
}
 
// 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>&nbsp;'
                    : '<font size="5"><b><a href="'.$target_page.'?page='.$i.'" style="color:#000000;text-decoration:none;">'.$i.'</font></b></a>&nbsp;';
}
 
// lien Suivant
if ($show_next) {
   $paginate[] = '&nbsp;<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>';

?>
Le problème, si je lance la recherche, par exemple 122 biens trouvé, sur la 2ème page etc... (pagination) il va me sortir 142 biens soient tout les biens (session annulé).

Merci beaucoup, je suis vraiment désespéré j'ai demandé sur pas mal de forum mais pas de solution qui marche :

On m'a proposé,

Code : Tout sélectionner

//ça c'est juste la première fois qu'on arrive sur la page if(empty($_SESSION['recherche'])){ $_SESSION['recherche']=array(); } //puis plus bas, if(sizeof($_SESSION['recherches'])==0){ //affecte ton where }
Mais ça n'a pas changé la donne...

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

11 avr. 2013, 12:29

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'&nbsp;<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>&nbsp;';
}

// 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>&nbsp;'
        : '<font size="5"><b><a href="' . $target_page . '?page=' . $i . '" style="color:#000000;text-decoration:none;">' . $i . '</font></b></a>&nbsp;';
}

// lien Suivant
if ($show_next) {
    $paginate[] = '&nbsp;<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'&nbsp;<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>&nbsp;';
}

// 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>&nbsp;'
        : '<font size="5"><b><a href="' . $target_page . '?page=' . $i . '" style="color:#000000;text-decoration:none;">' . $i . '</font></b></a>&nbsp;';
}

// lien Suivant
if ($show_next) {
    $paginate[] = '&nbsp;<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 mysqli 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.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

11 avr. 2013, 22:30

Salut,

merci de ton message, je me sentais un peu trop perdu, j'ai compris pas mal de choses grâce à toi.

le echo est en trop, effectivement c'était pour testé si la variable existait bien.

le budget mini existe forcément lors de la transmission car elle est comprise entre 0 et 2 000 000, c'est un système de slider, donc un choix est mis par défaut mais niveau sécurité effectivement je vais y faire quelque chose.

Une valeur a été assigné à l'input (valider).

Par contre en testant le code, j'ai un message d'erreur j'ai essayé de rajouté des guillemets à la ligne mais rien ne change.

unexpected '[' on line 18

Code : Tout sélectionner

if (!empty($_POST['valider'])) { $_SESSION['recherche'] = ['valider'];
<?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['valider'])) {
    $_SESSION['recherche'] = ['valider'];
    // gestion du where
    $where = array();
    $f = ['bien'];
    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['amount_select']);
    $prix_min = (isset($prix_min_convert) && ctype_digit($prix_min_convert)) ? $prix_min_convert : 0;

    $prix_max_convert = str_replace(' ', '', $_POST['amount_select_max']);
    $prix_max = (isset($prix_max_convert) && ctype_digit($prix_max_convert)) ? $prix_max_convert : 999999999;

    $_SESSION['recherche']['amount_select'] = $prix_min;
    $_SESSION['recherche']['amount_select_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'&nbsp;<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>&nbsp;';
}

// 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>&nbsp;'
        : '<font size="5"><b><a href="' . $target_page . '?page=' . $i . '" style="color:#000000;text-decoration:none;">' . $i . '</font></b></a>&nbsp;';
}

// lien Suivant
if ($show_next) {
    $paginate[] = '&nbsp;<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>';

?>
Le formulaire :
<!-- tabcontainers (moteur de recherche, choix achat ou location) --> 		
<script type="text/javascript" charset="utf-8">
jQuery(function($) {
var tabContainers = $('div.research > div');
tabContainers.hide().filter(':first').show();
$('div.research ul.tabNavigation a').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('div.research ul.tabNavigation a').removeClass('selected');
$(this).addClass('selected');
return false;
}).filter(':first').click();
});
</script>

<!-- #slider-range -->
<script type="text/javascript">
function lisibilite_nombre(nbr)
{
var nombre = ''+nbr;
var retour = '';
var count=0;
for(var i=nombre.length-1 ; i>=0 ; i--)
{
if(count!=0 && count % 3 == 0)
retour = nombre[i]+' '+retour ;
else
retour = nombre[i]+retour ;
count++;
}
return retour;
}

$(function() {
$("#slider-range").slider({
range: true,
min: 0,
max: 2000000,
values: [0, 2000000],
slide: function(event, ui) {       
$("#amount").val(lisibilite_nombre(ui.values[0]) + ' € ' + ' - ' + lisibilite_nombre(ui.values[1]) + ' € ' );
$("#amount_select").val(ui.values[0]);
$("#amount_select_max").val(ui.values[1]);
}
});
$("#amount").val(lisibilite_nombre($("#slider-range").slider("values", 0)) + ' € ' + '- ' + lisibilite_nombre($("#slider-range").slider("values", 1)) + ' € ');
$("#amount_select").val($("#slider-range").slider("values", 0));
$("#amount_select_max").val($("#slider-range").slider("values", 1));
});
</script>

<div id="research-wrap">
<div class="bloc">
<h3><a href="#">Rechercher un bien immobilier...</a></h3>
</div> 

<div class="research">

<ul class="tabNavigation">
<li><a href="#first">ACHAT</a></li>
<li><a href="#second">LOCATION</a></li>
</ul>
	
<div id="first">

<form method="post" action="search-result.php">
<div class="column1">
<h2>Type de bien :</h2>

<label class="custom-select">
<?
$reponse = mysql_query("SELECT DISTINCT bien FROM list_biens ORDER BY bien ASC" );
echo'<select name="bien">';
echo '<option name="bien" value="">Tous les biens</option>';
while ($donnees = mysql_fetch_array($reponse) )
{
?>
<option name="bien" value="<?php echo $donnees['bien']; ?>"><?php echo $donnees['bien']; ?></option>
<?php
}
echo'</select>'; 
?>
</div>

<div class="column2">
<h2>Secteur géographique :</h2>

<label class="custom-select">
<select name="ville">
<option name="ville" value="">Tous les secteurs</option>

<?php
$reponse = mysql_query("SELECT * FROM list_villes ORDER BY ville");
while ($donnees = mysql_fetch_array($reponse) )
{
$selected = ($_SESSION['recherche']['ville']==$val)? ' selected="selected"' : '';
?>
<option name="ville" value="<?php echo $donnees['ville']; ?>"<?php echo $selected; ?>><?php echo $donnees['ville']; ?></option>
<?php
}
echo'</select>'; 
?>
</div>

<div class="column3">
<h2>Fourchette de prix :</h2>
<input type="text" id="amount" name="amount" readonly="readonly"/>

<input type="hidden" id="amount_select" name="amount_select"/>
<input type="hidden" id="amount_select_max" name="amount_select_max"/>

<div id="slider-range"></div>
</div>

<div class="column4">
<h2>Afficher les résultats :</h2>
<label class="custom-select"><select name="tri">
<option name="tri" value="">Trier par :</option>
<option name="tri" value="ASC">Prix croissants</option>
<option name="tri" value="DESC">Prix décroissants</option>
</select>

<input type="submit" value="Recherche" name="valider" />
</div>

</form>
</div>

<div id="second">

<div class="column1">
</div>

</div>
       
</div>
</div>

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

11 avr. 2013, 23:00

compare avec mon code, les [] vide ne sont pas une heure. C'est la forme courte de déclaration de tableau depuis php 5.4.

J'aurais simplement pu mettre $_SESSION['recherche'] = '';

suivant ta version il est possible que la syntaxe courte retourne une erreur (php < 5.4).

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

12 avr. 2013, 01:00

Salut,

Effectivement,

J'ai toujours la même erreur sur cette partie :
if (!empty($_POST['valider'])) {
$_SESSION['recherche'] = [];
// gestion du where
$where = array();
$f = ['bien'];
    foreach ($f as $p) {
        if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
            $where[] = "$p = '" . mysql_real_escape_string($_POST[$p]) . "'";
            $_SESSION['recherche'][$p] = $_POST[$p];
        }
    }
J'ai aussi essayé
 $_SESSION['recherche'] = '';
Mais sans succès.

EDIT : Cela vient de la variable pour le foreich $f = ['bien'];
Avec la fonction filter, cela fonctionne.
<?php
if (!empty($_POST['valider'])) {
$_SESSION['recherche'] = '';
// gestion du where
$where = array();

$filter = function($p) use (&$where) {
if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
$where[] = "$p = '".mysql_real_escape_string($_POST[$p])."'";
$_SESSION['recherche'][$p] = $_POST[$p];
}
};
  
$filter('bien');

....
Pour les variables de session :
par exemple en testant avec la ville,
/// on crée une variable $requete pour faciliter l'écriture de la requête SQL.
$ville = $_POST['ville'];
$_SESSION['recherche']['ville'] = $ville;
j'affiche la variable de session, echo $ville;
cela me l'affiche correctement mais au bout de la deuxième page elle disparait !
comment l'a stoké definitivement (du moins pendant + de 3600 sec)

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

13 avr. 2013, 10:45

qu'elle version de php ?
si inférieur à 5.4 utilise array plutôt que [] pour la déclaration d'un tableau.

au final tu n'as pas compris ce que j'ai dit avant ?
Avec le code fournit ce qu'il y a en session ne change que quand tu revalide le formulaire de recherche.

@+
Il en faut peu pour être heureux ......