recherche multicritéres

Mammouth du PHP | 19672 Messages

30 oct. 2005, 09:41

je ne sais pas ou l'integrer ! :roll: j'ai compris le principe mais j'arrive pas à l'implementer dans mon code
Il ne faut pas l'intégrer dans ton code, il faut en appliquer le principe de fonctionnement.

Dans le tuto, il y a des explication dès le début. De quoi as-tu besoin ? Du nombre total d'articles et d'un paramètre limitant le nombre d'articles par page. À partir de là, tu peux calculer le nombre de pages et générer dynamiquement la requête de la page quel que soit son numéro.

Ton premier problème à résoudre est donc de créer les requêtes SQL. Je n'ai pas lu l'ensemble du sujet dans le détail, mais j'ai cru comprendre que cette question était résolue. Alors dans ce cas, il te reste à calculer le nombre de pages pour pouvoir générer la seconde requête assortie des paramètres de limite debut/fin.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 151 Messages

30 oct. 2005, 12:55

Voilà mon code final mais j'ai toujours des problèmes
1: $total me retourne pas le nombre d'enregistrement trouvé, il me renvoi le nombre limit à afficher parpage
2 : le problème N°1 m'empeche de visualiser les autres pages puisque dans le code il retourne juste le nombre limit à afficher par page

j'espere que j'ai bien expliqué mon problème, franchement la pagination commence à m'enerver ! :x

Merci d'avance

Voila mon code :
<HTML>
<head>
<title>Recherche Achat</title>
<body bgcolor=white text=black link=blue vlink=blue alink=blue>

<?php
include("gestion/config.php");
include ("fonctions.php");
// reccupération varibles 
 $pays_combo=$_POST['pays_combo'];
 $sub_ville=$_POST['sub_ville'];
 $sub_type_achat =$_POST['sub_type_achat'];
 $sub_type_logement =$_POST['sub_type_logement'];
 $meublier=$_POST['meublier'];
 $radionchk=$_POST['radionchk'];
 $allcriteres=isset($_POST['allcriteres']) ? $_POST['allcriteres'] : ""; 
$color =0;
 $k=0;
 $page = 1; 
$nb_affichage_par_page = 10; 
 $sql="select * from achat where location='".$radionchk."'"; 
$result = mysql_query($sql);
$limit=5; 
	$limitvalue = $page * $limit - ($limit); 
	 
//$operateur= ($allcriteres == "oui") ? " AND " : " OR "; 
$operateur= " AND "; 

if ($pays_combo != "0") 
    { 
        $sql.= $operateur." pays like '%$pays_combo%' "; 
    } 
if ($sub_ville != "0") 
    { 
        $sql.= $operateur." ville like '%$sub_ville%' "; 
    } 
if ($sub_type_achat != "0") 
{ 
    $sql.= $operateur." type_achat like '%$sub_type_achat%' "; 
} 
if ($sub_type_logement != "0") 
    { 
        $sql.= $operateur." type_logement like '%$sub_type_logement%' "; 
    } 
if ($meublier != "0") 
    { 
        $sql.= $operateur." meuble like '%$meublier%' "; 
    } 
 

$page_en_cours = (isset($_GET['page'])) ? $_GET['page'] : 0;  // récupération du numero de page, si POST['page'] existe sinon 0 
$page_affichee = ($page_en_cours + 1); 

$url = "./result1.php?page="; // ici l'url de ta page, attention de laisser " ?page= " 

$debut = $page_en_cours * $nb_affichage_par_page; //début de listage des données dans la base de données      
     
$sql.= ' ORDER BY prix LIMIT '.$debut.','.$nb_affichage_par_page; 

$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());   
$total = mysql_num_rows($res); 
echo $total;
$from=$limit*$page-$limit+1;
$to=$from + $total-1;
$nb_pages = ceil($total / $nb_affichage_par_page); // nombre de pages a afficher 

if ($nb_pages > 0) 
{ 
    $barre_nav = ""; 
    if($nb_pages > 1) 
    { 
        if($page_en_cours > 0) 
        { 
            for($i = 0; $i < $page_en_cours; $i++) 
            { 
                $p = $i + 1;                 
                $lien = $url . $i.'&pays_combo=' .$pays_combo 
                .'&sub_ville=' .$sub_ville 
                .'&sub_type_achat=' .$sub_type_achat 
                .'&sub_type_logement=' .$sub_type_logement 
                .'&meublier=' .$meublier 
                .'&radionchk=' .$radionchk; 
                 
                $barre_nav .= '<a href="'. $lien .'" title="page '. $p .'">'. $p .'</a> | '; 
            } 
        } 
        $page_affichee = "Annonce ". $page_affichee ." sur un total de ". $nb_pages; 
    } 
    else 
    { 
        /* Nous n'avons qu'une seule page, on peut se contenter d'afficher juste page 1/1 */ 
        $barre_nav .= "page 1/1"; 
    } 

     
     
?> 
<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47'> 
    <tr> 
        <td width='50%' align='left' class='txt1'> 
            <font color='#ECC600' size='2'><b><? echo $page_affichee; ?></b></font> 
        </td> 
       <td align="right" class='txt1'> 
            <font color='#ECC600' size='2'>Visualisation de:</font> 
       </td> 
    </tr> 
</table> 
<?                
    $k=0; 
    while ($row = mysql_fetch_array($res)) 
    { 
        $k++ ; 
        $prix = $row["prix"]; 
        $sub_type_achat = $row["type_achat"]; 
        $sub_type_logement = $row["type_logement"]; 
        $meuble = $row["meuble"]; 
        $ville = $row["ville"]; 
        $location = $row["location"]; 
        $pays = $row["pays"]; 
        $surface = $row["surface"]; 
        $description = $row["description"]; 
        $reference = $row["reference"]; 
        $surle = $row["surle"]; 
        $aproximite = $row["aproximite"]; 
        $description= stripslashes($description); 
        $description= nl2br($description); 
        if( $k%2 == 0 ) 
           if( $k%2 == 0 )
						$color = "#802A47";
					else
						$color = "#9C456A";	
						
					
					echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#77111C' ><tr>
<td bgcolor='$color' align='left' width='367' class='txt1'> <font color='#F4F4F4'>&nbsp;<strong><u>Annonce N° $reference</u></strong><br>
						&nbsp;<b>$type_achat à $ville  ";
						if ($surface !=0)
						{
							echo"de surface $surface m2<br>";
						}
						else
						{
							echo"<br>";
						}
						echo"&nbsp;$description </b><br>";
					$sql_select2 = "select * from client where reference = '$reference' ";
					 $result2 = mysql_query($sql_select2);
					 $row = mysql_fetch_array($result2);
		
					 	$reference = $row["reference"];
						$tel = $row["tel"];
						$gsm1 = $row["gsm1"];
						$gsm2 = $row["gsm2"];
						
						if (($tel!="Pas de téléphone"))
						{
							if (!empty($tel))
								{
									echo"<font color='#FFFFFF'><b><u>Tél.</u>$tel</b></font>";
								}	
						}
					//echo"<br>";
						if (($gsm1!="Pas de GSM"))
						{
							if (!empty($gsm1))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 1.</u>$gsm1</b></font>";
								}	
						}
					echo"<br>"; 
					
					echo"</font>
						</td>
						<td bgcolor='$color' width='106' align='center' class='txt1'><font color='#FFFFFF'>&nbsp;<b>Prix :<br>";
										
						if ($prix != 0)
							
							echo"$prix</b></font></td>";
						else
							
							echo"N.D</b></font></td>";
					  echo"</tr>
					</table>";
                 
                echo $barre_nav; // affichage de la barre de naviagtion 
                                 
    } 
} 
else echo "Recherche vide"; // a toi de mettre une belle phrase   
?> 



</body>
</head>
</html>

Mammouth du PHP | 19672 Messages

30 oct. 2005, 13:13

Dans ton code, je ne vois qu'une seule requête que tu utilises pour faire le total: or cette requête comporte déjà une clause LIMIT : c'est normal que tu ne puisses pas afficher le reste : j'ai pourtant parlé de 2 requêtes, la seconde pouvant être créée dynamiquement en ajoutant la clause LIMIT APRÈS avoir récupéré le total: tu dois donc avoir une première exécution sans la clause LIMIT pour récupérer le nombre et ensuite seulement, tu ajoutes la clause limite, tu exécutes et tu affiches.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 151 Messages

30 oct. 2005, 14:24

tu veux dire quoi par créer une requête dynamiquement ?!
NB: quand je crée une deuxieme requête, il me renvoi cette erreurSQL :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in e:\easyphp1-8\www\centraleimmo\moteurRech.php on line 267

Mammouth du PHP | 19672 Messages

30 oct. 2005, 14:49

Je vais prendre un exemple basique. Prenons une requête toute simple.
$sql = "[code]SELECT champ_1, champ_2 FROM table_1 WHERE champ_1 = 'condition 1'[/code]";
Là, j'ai une base de départ qui me permet d'avoir le nombre de lignes répondant aux critères de tri de la clause WHERE. Si tu es d'accord jusque là, continuons. Je récupère donc le résultat et le nombre de lignes:
$resultat = mysql_query($sql);
$total = mysql_num_rows($resultat);
Voilà, maintenant, je connais (virtuellement s'entend) le nombre total de ligne de la requête de base.

Note que jusqu'à maintenant, j'ai complètement zappé le coté nombre par page, je veux le total. Ceci étant obtenu, je veux maintenant n'en avoir qu'une partie. Il me faut plusieurs paramètres :
- le total, je l'ai déjà;
- le nombre que je veux afficher par page;
- le nombre de pages que ça représente;
- à partir de quelle ligne je commence à récupérer mes informations;
Ajoutons ces trois paramètres manquants jusqu'à maintenant:
$nb_par_page = 10;
$nb_de_pages = ceil($total / $nb_par_page);
$debut = isset($_GET['page']) ? ($_GET['page'] * $nb_par_page) : 0;
Passons aux explications détaillées :
- $nb_par_page : ici, je mets 10, mais tu peux choisir le nombre de ton choix.
- $nb_de_pages : j'utilise la fonction ceil() pour avoir un entier. Sinon, avec 23 lignes, j'obtiendrais 2,3 pages, ce qui est idiot. J'arrondis donc à l'entier supérieur ce qui va me donner 3;
- $debut : Là, je prépare aussi ma clause LIMIT qui doit avoir deux paramètres, la ligne de début et le nombre de ligne que nous avions déjà. Je vérifie si j'ai un numéro de page en cours dans l'url avec isset($_GET['page']) (paramètre qu'il ne faudra bien entendu pas oublier d'ajouter dans tes liens de navigations). Si j'ai une valeur, alors je l'assigne à la variable, sinon, je viens d'arriver sur cette page pour la première fois et j'établis donc le début à 0. Note aussi que mon point de départ n'étant dans la requête pas un numéro de page mais un numéro de ligne, je multiplie le numéro de la page par le nombre de ligne par page.

Nous avons maintenant les éléments pour mettre une "rallonge à notre requête (Note bien le "." de concaténation juste avant le "=") :
$sql .= " LIMIT ". $debut .", ". $nb_par_page .";"
Ce qui va nous donner en requête complète:

Code : Tout sélectionner

SELECT champ_1, champ_2 FROM table_1 WHERE champ_1 = 'condition 1' LIMIT 0, 10;
Voilà, je vois difficilement comment t'expliquer plus clairement. Un simple conseil pour l'instant quand même: n'essaye pas de penser trop d'avance à la fin de ton code: vas-y étape par étape en te concentrant sur l'étape en cours et celle que tu prépares davantage que sur les dix prochaines.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

30 oct. 2005, 15:06

Voila c'est tout a fait ça .... je tient juste a ajouter que le code servant d'exemple que j'ai donné est JUSTE car je vois que tu n'a absolument rien gardé de mon exemple (bien sur ce n'est pas un standard tu as tout a fait le droit de tout refaire :wink: )

C'est vrai que j'ai sauté une étape, calcul du nombre total d'annonces correspondantes aux critères et non sur la limte deja fixée.
Il suffit donc dans mon exemple d'exécuter la requete et de calculer avec mysql_num_rows() le nombre total avant l'ajout de la clause LIMIT, donc avant cette ligne:
$sql.= ' ORDER BY prix LIMIT '.$debut.','.$nb_affichage_par_page;
Je résume: une requete sans la clause LIMIT pour compter le total et une autre apres avec LIMIT pour la pagination (tu as donc 2 mysql_query() a faire):wink:

Mammouth du PHP | 19672 Messages

30 oct. 2005, 15:07

Tout simplement :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 151 Messages

30 oct. 2005, 15:41

ça marche mnt mais juste pour ces 2 problèmes que j'avais ! le BIG problème c'est que mon système de pagination ne marche toujours pas j'ai pas "page :1-2-3 >>" ! :?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 16:07

Il me semble qu'il y ait une erreur dans le Tuto de base (a confirmer et éventuellement a corriger par Cyrano )

la limite de la boucle n'est pas bonne:
for($i = 0; $i < $page_en_cours; $i++)
devrai etre
for($i = 0; $i < $nb_pages; $i++)
sinon on se retrouve bloqué sur la page 0 puisque $page_en_cours vaut 0 au début et donc la construction de la barre de navigation ne se fait
pas

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 151 Messages

30 oct. 2005, 17:32

j'ai mis ce code mnt en ce qui concerne la pagination ça marche sauf que j'ai encore 2 problèmes
1: la ligne de la pagination figure après chaque enregistrement affiché
2: après clique sur une page (2 ou 3 ou 4 ou ....) ça me retourne des erreurs :
Notice: Undefined index: pays_combo in e:\easyphp1-8\www\ttt\moteurRech.php on line 10

Notice: Undefined index: sub_ville in e:\easyphp1-8\www\ttt\moteurRech.php on line 11

Notice: Undefined index: sub_type_achat in e:\easyphp1-8\www\ttt\moteurRech.php on line 12

Notice: Undefined index: sub_type_logement in e:\easyphp1-8\www\ttt\moteurRech.php on line 13

Notice: Undefined index: meublier in e:\easyphp1-8\www\ttt\moteurRech.php on line 14

Notice: Undefined index: radionchk in e:\easyphp1-8\www\ttt\moteurRech.php on line 15

Notice: Undefined variable: nb_pages in e:\easyphp1-8\www\ttt\moteurRech.php on line 33
<HTML>
<head>
<title>Recherche Achat</title>
<body bgcolor=white text=black link=blue vlink=blue alink=blue>

<?php
include("gestion/config.php");
include ("fonctions.php");
// reccupération varibles 
 $pays_combo=$_POST['pays_combo'];
 $sub_ville=$_POST['sub_ville'];
 $sub_type_achat =$_POST['sub_type_achat'];
 $sub_type_logement =$_POST['sub_type_logement'];
 $meublier=$_POST['meublier'];
 $radionchk=$_POST['radionchk'];
 $allcriteres=isset($_POST['allcriteres']) ? $_POST['allcriteres'] : ""; 
 $finrequete=""; 
 $k=0;
 $nb_nouv_par_page = 1; 
 //nb_nouv_par_page = 1;             
 /* Nombre de nouvelles qui seront affichées sur chaque page */ 
//$url = "./pageparpage.php?page="; 

/* On détermine quelle est la page qui est actuellement affichée */ 

$url = "./result1.php?page=";


 $sql="select * from achat where location='".$radionchk."'"; 
$result = mysql_query($sql);
$nb_par_page = 20; 

$page_en_cours = isset($_GET['page']) ? ($_GET['page'] * $nb_pages) : 0; 
$page_affichee = ($page_en_cours + 1); 	 
//$operateur= ($allcriteres == "oui") ? " AND " : " OR "; 
$operateur= " AND "; 

if ($pays_combo != "0") 
    { 
        $sql.= $operateur." pays like '%$pays_combo%' "; 
    } 
if ($sub_ville != "0") 
    { 
        $sql.= $operateur." ville like '%$sub_ville%' "; 
    } 
if ($sub_type_achat != "0") 
{ 
    $sql.= $operateur." type_achat like '%$sub_type_achat%' "; 
} 
if ($sub_type_logement != "0") 
    { 
        $sql.= $operateur." type_logement like '%$sub_type_logement%' "; 
    } 
if ($meublier != "0") 
    { 
        $sql.= $operateur." meuble like '%$meublier%' "; 
    } 

//$debut= (isset($_GET['debut'])) ? addslashes($_GET['debut']) : 0;     
     
$sql.= ' ORDER BY prix ';
// LIMIT '.$debut.','.$nb_affichage_par_page; 

$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
$total = mysql_num_rows($res);
$nb_pages = ceil($total / $nb_par_page); 
echo $total;
//echo '.<p>'.$sql.'</p>';
//$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0; 
//$page_affichee    = ($page_en_cours + 1); 

//$nb_pages = ceil($nb_nouvelles / $nb_nouv_par_page); 

/** 
Nous disposons maintenant de suffisament d'éléments pour créer notre barre de navigation. 
Première chose à vérifier : avons-nous plusieurs pages, et au moins une ? 
*/ 
if($nb_pages > 0) 
{ 
    /* On définit une variable qui contiendra les données de navigation */ 
    $barre_nav = ""; 
    /* Nous avons au moins une page : avons nous besoin d'une barre de navigation ? */ 
    if($nb_pages > 1) 
    { 
        /** 
        Nous avons plusieurs pages: nous allons afficher successivement les liens vers 
        les pages précédentes s'il y en a, la page en cours et les liens vers les pages 
        suivantes. Nous aurons une barre sous la forme : 1 | 2 | 3 etc.. en liens clicables 
        sauf pour la page en cours dont nous mettrons le chiffre en gras 
         */ 
        if($page_en_cours > 0) 
        { 
           for($i = 0; $i < $nb_pages; $i++)  
            { 
                $p = $i + 1;                 
                $lien = $url . $i.'&pays_combo=' .$pays_combo 
                .'&sub_ville=' .$sub_ville 
                .'&sub_type_achat=' .$sub_type_achat 
                .'&sub_type_logement=' .$sub_type_logement 
                .'&meublier=' .$meublier 
                .'&radionchk=' .$radionchk; 
                 
                $barre_nav .= '<a href="'. $lien .'" title="page '. $p .'">'. $p .'</a> | ';
        } 
		}
        /** 
        On affiche la page en cours : notez le (+ 1) : pour les calculs, nous partons d'une 
        page 0 mais pour l'internaute, il est préférable de commencer à la page 1, donc on incrémente 
         */ 
        $barre_nav .= "<strong>". $page_affichee ."</strong>"; 
        /* Enfin on affiche (s'il y a lieu) les liens vers les pages suivantes */ 
        if(($page_affichee) < $nb_pages) 
        { 
            /* Il reste encore d'autres pages à afficher */ 
            $nb_suivantes = $nb_pages - ($page_affichee); 
            for($j = ($page_affichee); $j < $nb_pages; $j++) 
            { 
                $p = $j + 1; 
				$lien = $url . $j.'&pays_combo=' .$pays_combo 
                .'&sub_ville=' .$sub_ville 
                .'&sub_type_achat=' .$sub_type_achat 
                .'&sub_type_logement=' .$sub_type_logement 
                .'&meublier=' .$meublier 
                .'&radionchk=' .$radionchk; 
                $barre_nav .= " | <a href=\"". $lien . $j ."\" title=\"page ". $p ."\">". $p ."</a>"; 
            } 
        } 
         
        /* On peut définir en plus la situation dans une autre variable à afficher ailleurs */ 
        $page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages."; 
    } 
    else 
    { 
        /* Nous n'avons qu'une seule page, on peut se contenter d'afficher juste page 1/1 */ 
        $barre_nav .= "page 1/1"; 
    } 
    /** 
    On peut maintenant afficher notre page. On va commencer par récupérer les informations 
    On doit définir à partir de quelle nouvelle on doit récupérer les données dans la clause LIMIT. 
     */ 
 
    $debut = $page_en_cours * $nb_nouv_par_page; 

$sql .= " LIMIT ". $debut .", ". $nb_par_page.""; 
$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 

    

echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47'>
					  <tr>";
						echo"<td width='50%' align='left' class='txt1'>&nbsp; <font color='#ECC600' size='2'><b>$total Annonce(s)</b></font></td>";
					  echo"<td align=\"right\" class='txt1'>";
			
				echo"<font color='#ECC600' size='2'>Visualisation de: </font>";
				echo"</td>";
			
		echo"</td>";
					  echo"</tr>
					</table>";
                
    $k=0; 
    while ($row = mysql_fetch_array($res)) 
    { 
        $k++ ; 
        $prix = $row["prix"]; 
        $sub_type_achat = $row["type_achat"]; 
        $sub_type_logement = $row["type_logement"]; 
        $meuble = $row["meuble"]; 
        $ville = $row["ville"]; 
        $location = $row["location"]; 
        $pays = $row["pays"]; 
        $surface = $row["surface"]; 
        $description = $row["description"]; 
        $reference = $row["reference"]; 
        $surle = $row["surle"]; 
        $aproximite = $row["aproximite"]; 
        $description= stripslashes($description); 
        $description= nl2br($description); 
        if( $k%2 == 0 ) 
            $color = "#802A47"; 
        else 
            $color = "#9C456A";   
       if( $k%2 == 0 )
						$color = "#802A47";
					else
						$color = "#9C456A";	
						
					
					echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#77111C' ><tr>
					  	<td bgcolor='$color' align='left' width='367' class='txt1'> <font color='#F4F4F4'>&nbsp;<strong><u>Annonce N° $reference</u></strong><br>
						&nbsp;<b>$type_achat à $ville  ";
						if ($surface !=0)
						{
							echo"de surface $surface m2<br>";
						}
						else
						{
							echo"<br>";
						}
						echo"&nbsp;$description </b><br>";
					$sql_select2 = "select * from client where reference = '$reference' ";
					 $result2 = mysql_query($sql_select2);
					 $row = mysql_fetch_array($result2);
		
					 	$reference = $row["reference"];
						$tel = $row["tel"];
						$gsm1 = $row["gsm1"];
						$gsm2 = $row["gsm2"];
						
						if (($tel!="Pas de téléphone"))
						{
							if (!empty($tel))
								{
									echo"<font color='#FFFFFF'><b><u>Tél.</u>$tel</b></font>";
								}	
						}
					//echo"<br>";
						if (($gsm1!="Pas de GSM"))
						{
							if (!empty($gsm1))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 1.</u>$gsm1</b></font>";
								}	
						}
					echo"<br>"; 
					
					echo"</font>
						</td>
						<td bgcolor='$color' width='106' align='center' class='txt1'><font color='#FFFFFF'>&nbsp;<b>Prix :<br>";
										
						if ($prix != 0)
							
							echo"$prix</b></font></td>";
						else
							
							echo"N.D</b></font></td>";
					  echo"</tr>
					</table>";
								
					
echo "<table align=\"center\" width=\"479\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
	echo"<tr>";
		//echo"<td align=\"left\" class='menuc'>";
			
			
		echo"</td>";
	echo"</tr>";
echo"</table>";
                 
                echo $barre_nav; // affichage de la barre de naviagtion 
                                 
    } 
} 
else echo "Recherche vide"; // a toi de mettre une belle phrase   


?>


</body>
</head>
</html>
pour cette ligne "$url = "./result1.php?page=";" je dois mettre le lien de la page ou j'effectue le traitement ou bien la page ou j'affiche le resultat ?!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 18:24

1: la ligne de la pagination figure après chaque enregistrement affiché
Il faut sortir le:
echo $barre_nav;
de la boucle et le mettre juste apres la prochaine }
2: après clique sur une page (2 ou 3 ou 4 ou ....) ça me retourne des erreurs :
Normal puisque tu ne récupère pas les variables GET, celles qui correspondent au clic sur les liens, d'ou les grosses expression que je t'avais montré dans l'exemple :wink:
Remplace ta récupération des variables par tout ceci, j'ai mis quelque explication si tu en as besoin de plus ... demande :D
// reccupération varibles
//récupération de la variable POST (du formulaire) si elle n'existe pas on récupère la variable GET du clic sur le numéro de page
$allcriteres       = isset($_POST['allcriteres'])       ? $_POST['allcriteres']       : (isset($_GET['allcriteres'])       ? $_GET['allcriteres'] : 0);

$pays_combo        = isset($_POST['pays_combo'])        ? $_POST['pays_combo']        : (isset($_GET['pays_combo'])        ? $_GET['pays_combo'] : 0);

$sub_ville         = isset($_POST['sub_ville'])         ? $_POST['sub_ville']         : (isset($_GET['sub_ville'])         ? $_GET['sub_ville'] : 0);

$sub_type_achat    = isset($_POST['sub_type_achat'])    ? $_POST['sub_type_achat']    : (isset($_GET['sub_type_achat'])    ? $_GET['sub_type_achat'] : 0);

$sub_type_logement = isset($_POST['sub_type_logement']) ? $_POST['sub_type_logement'] : (isset($_GET['sub_type_logement']) ? $_GET['sub_type_logement'] : 0);

$meublier          = isset($_POST['meublier'])          ? $_POST['meublier']          : (isset($_GET['meublier'])          ? $_GET['meublier'] : 0);

$radionchk         = isset($_POST['radionchk'])         ? $_POST['radionchk']         : (isset($_GET['radionchk'])         ? $_GET['radionchk'] : 0);
pour cette ligne "$url = "./result1.php?page=";" je dois mettre le lien de la page ou j'effectue le traitement ou bien la page ou j'affiche le resultat ?!

euh.. le traitement se fait sur la meme page que l'affichage la ... :-s
tu dois mettre le meme lien que tu as mis dans l'attribut action de ton formulaire.

Voila voila cette fois ci ça dois etre bon :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 151 Messages

30 oct. 2005, 19:15

je te remercie infiniment Truc, un seul problème me reste puis je me tais lol !

quand je choisi le numéro de la page à selectionné, ce dernier s'ecrit une deuxieme fois dans la ligne de pagination
je te donne un exemple :

ma requete a renvoyée 312 reponses, donc j'ai 32 pages à visualiser , voila ma ligne de page jusqu'à présent :
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32

après je choisi la 2ième page voila ma nouvelle ligne de pages :
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

que dois-je faire ?!
<HTML>
<head>
<title>Recherche Achat</title>
<body bgcolor=white text=black link=blue vlink=blue alink=blue>

<?php
include("gestion/config.php");
include ("fonctions.php");
$pays_combo        = isset($_POST['pays_combo'])        ? $_POST['pays_combo']        : (isset($_GET['pays_combo'])        ? $_GET['pays_combo'] : 0); 

$sub_ville         = isset($_POST['sub_ville'])         ? $_POST['sub_ville']         : (isset($_GET['sub_ville'])         ? $_GET['sub_ville'] : 0); 

$sub_type_achat    = isset($_POST['sub_type_achat'])    ? $_POST['sub_type_achat']    : (isset($_GET['sub_type_achat'])    ? $_GET['sub_type_achat'] : 0); 

$sub_type_logement = isset($_POST['sub_type_logement']) ? $_POST['sub_type_logement'] : (isset($_GET['sub_type_logement']) ? $_GET['sub_type_logement'] : 0); 

$meublier          = isset($_POST['meublier'])          ? $_POST['meublier']          : (isset($_GET['meublier'])          ? $_GET['meublier'] : 0); 

$radionchk         = isset($_POST['radionchk'])         ? $_POST['radionchk']         : (isset($_GET['radionchk'])         ? $_GET['radionchk'] : 0); 
// reccupération varibles 
 /*$pays_combo=$_POST['pays_combo'];
 $sub_ville=$_POST['sub_ville'];
 $sub_type_achat =$_POST['sub_type_achat'];
 $sub_type_logement =$_POST['sub_type_logement'];
 $meublier=$_POST['meublier'];
 $radionchk=$_POST['radionchk'];
 $allcriteres=isset($_POST['allcriteres']) ? $_POST['allcriteres'] : ""; */
 $finrequete=""; 
 $k=0;
 $nb_nouv_par_page = 1; 
 //nb_nouv_par_page = 1;             
 /* Nombre de nouvelles qui seront affichées sur chaque page */ 
//$url = "./pageparpage.php?page="; 

/* On détermine quelle est la page qui est actuellement affichée */ 

$url = "./result1.php?page=";


 $sql="select * from achat where location='".$radionchk."'"; 
$result = mysql_query($sql);
$nb_par_page = 10; 

//$page_en_cours = isset($_GET['page']) ? ($_GET['page'] * $nb_pages) : 0; 
//$page_affichee = ($page_en_cours + 1); 	
$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0; 
$page_affichee    = ($page_en_cours + 1); 
//$operateur= ($allcriteres == "oui") ? " AND " : " OR "; 
$operateur= " AND "; 

if ($pays_combo != "0") 
    { 
        $sql.= $operateur." pays like '%$pays_combo%' "; 
    } 
if ($sub_ville != "0") 
    { 
        $sql.= $operateur." ville like '%$sub_ville%' "; 
    } 
if ($sub_type_achat != "0") 
{ 
    $sql.= $operateur." type_achat like '%$sub_type_achat%' "; 
} 
if ($sub_type_logement != "0") 
    { 
        $sql.= $operateur." type_logement like '%$sub_type_logement%' "; 
    } 
if ($meublier != "0") 
    { 
        $sql.= $operateur." meuble like '%$meublier%' "; 
    } 

//$debut= (isset($_GET['debut'])) ? addslashes($_GET['debut']) : 0;     
     
$sql.= ' ORDER BY prix ';
// LIMIT '.$debut.','.$nb_affichage_par_page; 

$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
$total = mysql_num_rows($res);
$nb_pages = ceil($total / $nb_par_page); 
echo $total;
//echo '.<p>'.$sql.'</p>';
//$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0; 
//$page_affichee    = ($page_en_cours + 1); 

//$nb_pages = ceil($nb_nouvelles / $nb_nouv_par_page); 

/** 
Nous disposons maintenant de suffisament d'éléments pour créer notre barre de navigation. 
Première chose à vérifier : avons-nous plusieurs pages, et au moins une ? 
*/ 
if($nb_pages > 0) 
{ 
    /* On définit une variable qui contiendra les données de navigation */ 
    $barre_nav = ""; 
    /* Nous avons au moins une page : avons nous besoin d'une barre de navigation ? */ 
    if($nb_pages > 1) 
    { 
        /** 
        Nous avons plusieurs pages: nous allons afficher successivement les liens vers 
        les pages précédentes s'il y en a, la page en cours et les liens vers les pages 
        suivantes. Nous aurons une barre sous la forme : 1 | 2 | 3 etc.. en liens clicables 
        sauf pour la page en cours dont nous mettrons le chiffre en gras 
         */ 
        if($page_en_cours > 0) 
        { 
           for($i = 0; $i < $nb_pages; $i++)  
            { 
                $p = $i + 1;                 
                $lien = $url . $i.'&pays_combo=' .$pays_combo 
                .'&sub_ville=' .$sub_ville 
                .'&sub_type_achat=' .$sub_type_achat 
                .'&sub_type_logement=' .$sub_type_logement 
                .'&meublier=' .$meublier 
                .'&radionchk=' .$radionchk; 
                 
                $barre_nav .= '<a href="'. $lien .'" title="page '. $p .'">'. $p .'</a> | ';
        } 
		}
        /** 
        On affiche la page en cours : notez le (+ 1) : pour les calculs, nous partons d'une 
        page 0 mais pour l'internaute, il est préférable de commencer à la page 1, donc on incrémente 
         */ 
        $barre_nav .= "<strong>". $page_affichee ."</strong>"; 
        /* Enfin on affiche (s'il y a lieu) les liens vers les pages suivantes */ 
        if(($page_affichee) < $nb_pages) 
        { 
            /* Il reste encore d'autres pages à afficher */ 
            $nb_suivantes = $nb_pages - ($page_affichee); 
            for($j = ($page_affichee); $j < $nb_pages; $j++) 
            { 
                $p = $j + 1; 
				$lien = $url . $j.'&pays_combo=' .$pays_combo 
                .'&sub_ville=' .$sub_ville 
                .'&sub_type_achat=' .$sub_type_achat 
                .'&sub_type_logement=' .$sub_type_logement 
                .'&meublier=' .$meublier 
                .'&radionchk=' .$radionchk; 
                $barre_nav .= " | <a href=\"". $lien . $j ."\" title=\"page ". $p ."\">". $p ."</a>"; 
            } 
        } 
         
        /* On peut définir en plus la situation dans une autre variable à afficher ailleurs */ 
        $page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages."; 
    } 
    else 
    { 
        /* Nous n'avons qu'une seule page, on peut se contenter d'afficher juste page 1/1 */ 
        $barre_nav .= "page 1/1"; 
    } 
    /** 
    On peut maintenant afficher notre page. On va commencer par récupérer les informations 
    On doit définir à partir de quelle nouvelle on doit récupérer les données dans la clause LIMIT. 
     */ 
 
    $debut = $page_en_cours * $nb_nouv_par_page; 

$sql .= " LIMIT ". $debut .", ". $nb_par_page.""; 
$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 

    

echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47'>
					  <tr>";
						echo"<td width='50%' align='left' class='txt1'>&nbsp; <font color='#ECC600' size='2'><b>$total Annonce(s)</b></font></td>";
					  echo"<td align=\"right\" class='txt1'>";
			
				echo"<font color='#ECC600' size='2'>Visualisation de: </font>";
				echo"</td>";
			
		echo"</td>";
					  echo"</tr>
					</table>";
                
    $k=0; 
    while ($row = mysql_fetch_array($res)) 
    { 
        $k++ ; 
        $prix = $row["prix"]; 
        $sub_type_achat = $row["type_achat"]; 
        $sub_type_logement = $row["type_logement"]; 
        $meuble = $row["meuble"]; 
        $ville = $row["ville"]; 
        $location = $row["location"]; 
        $pays = $row["pays"]; 
        $surface = $row["surface"]; 
        $description = $row["description"]; 
        $reference = $row["reference"]; 
        $surle = $row["surle"]; 
        $aproximite = $row["aproximite"]; 
        $description= stripslashes($description); 
        $description= nl2br($description); 
        if( $k%2 == 0 ) 
            $color = "#802A47"; 
        else 
            $color = "#9C456A";   
       if( $k%2 == 0 )
						$color = "#802A47";
					else
						$color = "#9C456A";	
						
					
					echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#77111C' ><tr>
					  	<td bgcolor='$color' align='left' width='367' class='txt1'> <font color='#F4F4F4'>&nbsp;<strong><u>Annonce N° $reference</u></strong><br>
						&nbsp;<b>$type_achat à $ville  ";
						if ($surface !=0)
						{
							echo"de surface $surface m2<br>";
						}
						else
						{
							echo"<br>";
						}
						echo"&nbsp;$description </b><br>";
					$sql_select2 = "select * from client where reference = '$reference' ";
					 $result2 = mysql_query($sql_select2);
					 $row = mysql_fetch_array($result2);
		
					 	$reference = $row["reference"];
						$tel = $row["teldomicile"];
						$gsm1 = $row["gsm1"];
						$gsm2 = $row["gsm2"];
						
						if (($tel!="Pas de téléphone"))
						{
							if (!empty($tel))
								{
									echo"<font color='#FFFFFF'><b><u>Tél.</u>$tel</b></font>";
								}	
						}
					//echo"<br>";
						if (($gsm1!="Pas de GSM"))
						{
							if (!empty($gsm1))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 1.</u>$gsm1</b></font>";
								}	
						}
					echo"<br>"; 
					
					echo"</font>
						</td>
						<td bgcolor='$color' width='106' align='center' class='txt1'><font color='#FFFFFF'>&nbsp;<b>Prix :<br>";
										
						if ($prix != 0)
							
							echo"$prix</b></font></td>";
						else
							
							echo"N.D</b></font></td>";
					  echo"</tr>
					</table>";
								
					
echo "<table align=\"center\" width=\"479\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
	echo"<tr>";
		//echo"<td align=\"left\" class='menuc'>";
			
			
		echo"</td>";
	echo"</tr>";
echo"</table>";
                 
                 // affichage de la barre de naviagtion 
                                 
    } 
	echo $barre_nav;
} 
else echo "Recherche vide"; // a toi de mettre une belle phrase   
?>


</body>
</head>
</html>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 20:14

j'avais survolé le tuto :x
donc il n'y avait pas d'erreur ... l'affichage est coupé en 2 pour ne pas mettre de lien sur la page en cours.. il faut donc remettre la boucle d'origine
for($i = 0; $i < $nb_pages; $i++)
a remplacer par:
for($i = 0; $i < $page_en_cours; $i++)
sinon on iste 2 fois les pages :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

30 oct. 2005, 22:37

Il me semble qu'il y ait une erreur dans le Tuto de base (a confirmer et éventuellement a corriger par Cyrano )

la limite de la boucle n'est pas bonne:
for($i = 0; $i < $page_en_cours; $i++)
devrai etre
for($i = 0; $i < $nb_pages; $i++)
sinon on se retrouve bloqué sur la page 0 puisque $page_en_cours vaut 0 au début et donc la construction de la barre de navigation ne se fait
pas
Il n'y a pas d'erreur : si tu avais lu attentivement le commentaire précédant cette boucle, tu aurais noté qu'on s'occupe des liens AVANT la page en cours s'il y en as. Ensuite, on s'occupe des liens SUIVANT cette même page s'il y en a également.

Je l'ai di été répété : Je ne commente pas mon code pour faire joli, les commentaires expliquent des détails importants. Lisez-les TOUS

J'ajouterais une règle absolument impérative en développement : soyez logiques
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2005, 23:45

Il n'y a pas d'erreur : si tu avais lu attentivement le commentaire précédant cette boucle (...)

Je l'ai di été répété : (...) Lisez-les TOUS

(...) soyez logiques
OUI CHEF :pouce:

ne le prend pas mal a ce point ... :roll:
du moment qu'elle a compris le principe et c'est par les erreurs qu'on apprend :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute