09. februar 2006 - 20:17Der er
39 kommentarer og 3 løsninger
søgefunktion som også skal sortere efter postnumre
Jeg har nedenstående søgefunktion, og den virker da også.. bare ikke med at hente efter landsdel også. Er her nogle som ved hvordan jeg får løst dette problem? Den skal kunne hente de annoncer som kommer fra en hvis landsdel og som indeholder et søgeord som man indtaser. Desuden skal det også være muligt at bare at vælge landsdel, trykke søg, og så skal den vise alle annocer fra denne landsdel. Håber jeg har udtrykt mig klart nok:)
sqlllen------------- $query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' order by id desc limit $s,$pr_side") or die(mysql_error());
Når der bliver oprettet en annonce indtaster man et postnr... Kan man ikke under de forskellige valgmuligheder indsætte noget ala "storkøbenhavn" ml 1000 og 2000
Så mit spg. går altså på. kan man ikke indsætte en værdi i <option value="3000-3670">Nordsjælland</option> og så få den indsat i sqllen, så den søger på noget ala where postnr er mellem 3000 og 3670?
du har via din form fået tildelt variablen $selectName en værdi. F.eks. :
<option value="3000-3670">Nordsjælland</option>
så er $selectName = "3000-3670". Denne værdi vil du bruge som et interval i din sql. Dette kan gøres således:
$query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT(".$selectName.",4) AND RIGHT(".$selectName.",4) order by id desc limit $s,$pr_side") or die(mysql_error());
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '4) AND RIGHT(,4) order by id desc limit 0,20' at line 1
$query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT('".$selectName."',4) AND RIGHT('".$selectName."',4) order by id desc limit $s,$pr_side") or die(mysql_error());
Ved godt at det lige umiddelbart virker af meget kode. Men det ser ud til at virke nogenlunde, dog viser den kun nogle få annoncer når siden åbnes. Det er først når man trykker på søgknappen uden at vælge noget at alle annoncer vises. Desuden lader det til at den også tager annoncer med som intet postnr har. Ved ikke om det hjælper at se det hele:)
<?php require("../members/common.php"); // Funktion, der "klipper" en tekst over på det mest hensigtsmæssige sted (".", " ", ) // str klip(str tekst, int længde, int tolerance)
function klip($tekst, $laengde = 200, $tolerance = 10) // $laengde og $tolerance kan udelades { $punktum = strpos(substr($tekst, $laengde-$tolerance, 2*$tolerance), "."); // position af punktum $mellemrum = strpos(substr($tekst, $laengde-$tolerance, 2*$tolerance), " "); // position af mellemrum $mere = "..."; // punktummer hvis mere tekst
if (strlen($tekst) <= $laengde + $tolerance) { $slut_pos = strlen($tekst); // slutposition = slut på tekst, da denne er kortere end $laengde og $tolerance $mere = ""; // ikke andet } elseif ($punktum !== false) { $slut_pos = $laengde-$tolerance+$punktum; // slutposition = punktum } elseif ($mellemrum !== false) { $slut_pos = $laengde-$tolerance+$mellemrum; // slutposition = mellemrum } else { $slut_pos = $laengde; // slutposition $laengde (ikke noget at gøre - skær ord over) }
$pr_side = "20"; //Definerer antal resultater pr. side
if (!isset($s)) { $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke sættes den }
$g_total = mysql_query("select count(id) as total from salgAfProdukt WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT('".$selectName."',4) AND RIGHT('".$selectName."',4)") or die(mysql_error()); $total = mysql_result($g_total,0); if($total>$pr_side) { if ($total > $s+5){ ## #Find ud af om derskal være et Forrige link ## if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes echo "<a href='?s=$previous_s'><font color=\"#4682B4\">Forrige</font></a> "; //Udskriver linket }
## #Find ud af hvis/hvor mange sider der er rows til ## $page = 1; //Definerer hvor sidetal skal starte for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på echo "<a href='?s=$start&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">$page</font></a> "; //...hvis ikke, udskrives link med værdien af $page } else { //Ellers, dvs. hvis linket vil pege på den side man er på.. echo "<font color=\"#000000\">$page </font>"; //...udskrives værdien af $page bare, altså ikke som link } $page++; //Lægger en til $page til næste gang løkken køres }
## #Find ud af om der skal være et næste link ## if ($total > $s+$pr_side) { //Tjekker om der er flere sider $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes echo "<a href='?s=$next_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Næste</font></a>"; //Udskriver linket "næste" } } } echo "</tr></td></table>"; echo " <table width=\"560\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"bgcolor=\"#CAD9EA\"> <tr> <td><span class=\"mini\"> </span></td> </tr> </table>"; $query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT('".$selectName."',4) AND RIGHT('".$selectName."',4) order by id desc limit $s,$pr_side") or die(mysql_error());
## #Find ud af om derskal være et Forrige link ## if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes echo "<a href='?s=$previous_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Forrige</font></a> "; //Udskriver linket }
## #Find ud af hvis/hvor mange sider der er rows til ## $page = 1; //Definerer hvor sidetal skal starte for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på echo "<a href='?s=$start&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">$page</font></a> "; //...hvis ikke, udskrives link med værdien af $page } else { //Ellers, dvs. hvis linket vil pege på den side man er på.. echo "<font color=\"#000000\">$page </font>"; //...udskrives værdien af $page bare, altså ikke som link } $page++; //Lægger en til $page til næste gang løkken køres }
## #Find ud af om der skal være et næste link ## if ($total > $s+$pr_side) { //Tjekker om der er flere sider $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes echo "<a href='?s=$next_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Næste</font></a>"; //Udskriver linket "næste" } } echo "</tr></td></table>";
$var1 = substr($_GET['selectName'],0,4); //find de 4 første tegn i strengen $var2 = substr($_GET['selectName'],5,8); //find de 4 sidste tegn i strengen
$query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN ".$var1." AND ".$var2." order by id desc limit $s,$pr_side") or die(mysql_error());
Men tror faktisk at det med at den tager postnumre med som ikke er der ikke er en fejl.. det er bare fordi at jeg har oprettet nogle annoncer som har et postnr som ikke eksistere, og det kan den jo ikke gardere sig imod her... det skal jeg jo bare have lavet i selve oprettelsen af annoncen... så tror faktisk at der kun er et problem ved selve det når man trykker på linket som henter ovenstående side.. der vises ikke for hele dk. der henter den kun de annoncer som har postnr=0
Så det lader til at det virker... men hvordan får jeg den til at hente alle annoncer når man trykker på linket som henter siden.. det er der det er lidt mystisk nu? :)
- det er som sagt ikke så let. Jeg ved det, fordi jeg har lavet adskillige af den slags løsninger - både på baggrund af søgninger i postnumre alene, på kort i forhold til postnumre og regioner, amter og kommuner i forhold til postnumre. Der er ikke den slags helt faste intervaller, som ville gøre projektet let :)
<?php require("../members/common.php"); // Funktion, der "klipper" en tekst over på det mest hensigtsmæssige sted (".", " ", ) // str klip(str tekst, int længde, int tolerance)
function klip($tekst, $laengde = 200, $tolerance = 10) // $laengde og $tolerance kan udelades { $punktum = strpos(substr($tekst, $laengde-$tolerance, 2*$tolerance), "."); // position af punktum $mellemrum = strpos(substr($tekst, $laengde-$tolerance, 2*$tolerance), " "); // position af mellemrum $mere = "..."; // punktummer hvis mere tekst
if (strlen($tekst) <= $laengde + $tolerance) { $slut_pos = strlen($tekst); // slutposition = slut på tekst, da denne er kortere end $laengde og $tolerance $mere = ""; // ikke andet } elseif ($punktum !== false) { $slut_pos = $laengde-$tolerance+$punktum; // slutposition = punktum } elseif ($mellemrum !== false) { $slut_pos = $laengde-$tolerance+$mellemrum; // slutposition = mellemrum } else { $slut_pos = $laengde; // slutposition $laengde (ikke noget at gøre - skær ord over) }
$pr_side = "20"; //Definerer antal resultater pr. side
if (!isset($s)) { $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke sættes den }
if(!isset($_GET['selectName']) || $_GET['selectName']=="") { $g_total = mysql_query("select count(id) as total from salgAfProdukt WHERE produkt LIKE '%".$_GET['search']."%'") or die(mysql_error()); } else { $g_total = mysql_query("select count(id) as total from salgAfProdukt WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT('".$selectName."',4) AND RIGHT('".$selectName."',4)") or die(mysql_error()); } $total = mysql_result($g_total,0); if($total>$pr_side) { if ($total > $s+5){ ## #Find ud af om derskal være et Forrige link ## if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes echo "<a href='?s=$previous_s'><font color=\"#4682B4\">Forrige</font></a> "; //Udskriver linket }
## #Find ud af hvis/hvor mange sider der er rows til ## $page = 1; //Definerer hvor sidetal skal starte for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på echo "<a href='?s=$start&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">$page</font></a> "; //...hvis ikke, udskrives link med værdien af $page } else { //Ellers, dvs. hvis linket vil pege på den side man er på.. echo "<font color=\"#000000\">$page </font>"; //...udskrives værdien af $page bare, altså ikke som link } $page++; //Lægger en til $page til næste gang løkken køres }
## #Find ud af om der skal være et næste link ## if ($total > $s+$pr_side) { //Tjekker om der er flere sider $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes echo "<a href='?s=$next_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Næste</font></a>"; //Udskriver linket "næste" } } } echo "</tr></td></table>"; echo " <table width=\"560\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"bgcolor=\"#CAD9EA\"> <tr> <td><span class=\"mini\"> </span></td> </tr> </table>";
if(!isset($_GET['selectName']) || $_GET['selectName']=="") { $query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' order by id desc limit $s,$pr_side") or die(mysql_error()); } else { $query = mysql_query("select * from salgAfProdukt left join postnr on salgAfProdukt.postNr = postnr.postnr WHERE produkt LIKE '%".$_GET['search']."%' AND salgAfProdukt.postNr BETWEEN LEFT('".$selectName."',4) AND RIGHT('".$selectName."',4) order by id desc limit $s,$pr_side") or die(mysql_error()); }
## #Find ud af om derskal være et Forrige link ## if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig $pr_side $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis forrige side kaldes echo "<a href='?s=$previous_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Forrige</font></a> "; //Udskriver linket }
## #Find ud af hvis/hvor mange sider der er rows til ## $page = 1; //Definerer hvor sidetal skal starte for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der kører indtil der ikke er nok rows til en side mere if ($start != $s) { //Tjekker om linket vil komme til at pege på den side man er på echo "<a href='?s=$start&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">$page</font></a> "; //...hvis ikke, udskrives link med værdien af $page } else { //Ellers, dvs. hvis linket vil pege på den side man er på.. echo "<font color=\"#000000\">$page </font>"; //...udskrives værdien af $page bare, altså ikke som link } $page++; //Lægger en til $page til næste gang løkken køres }
## #Find ud af om der skal være et næste link ## if ($total > $s+$pr_side) { //Tjekker om der er flere sider $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste side kaldes echo "<a href='?s=$next_s&search=$_GET[search]&selectName=$_GET[selectName]'><font color=\"#4682B4\">Næste</font></a>"; //Udskriver linket "næste" } } echo "</tr></td></table>";
?> </body>
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.