webForumDet fria alternativet

Tips till sökfunktion

9 svar · 377 visningar · startad av Melea

MeleaMedlem sedan juli 20033 147 inlägg
#1

Hejsan

Håller på att bygga en lite mer "avancerad" sökfunktion där man kan söka igenom nyheter på rubrik/skribent/innehåll/datum/nyhetstyp.
Problemet är dock hur jag ska lösa det med SQL frågan. Det blir ju en jedrans många if satser och variablar.
Såhär har jag byggt upp det

<table cellpadding="3" cellspacing="0" border="0" width="100%">
<form action="search.php" method="get" name="searchform">
<input type="hidden" name="do" value="advanced">
<input type="hidden" name="search" value="news">
<tr>
<td width="200"><b>Topic:</b></td>
<td><input type="text" name="topic" style="width: 240px;"></td>
</tr>
<tr>
<td><b>Writer:</b></td>
<td><input type="text" name="scribler" style="width: 240px;"></td>
</tr>
<tr>
<td><b>Content:</b></td>
<td><input type="text" name="content" style="width:240px;"></td>
</tr>
<tr>
<td><b>Month and year:</b></td>
<td><select name="month" style="width: 240px;"><option>All</option><option>January</option><option>February</option>
<option>Mars</option><option>April</option><option>May</option><option>Juny</option>
<option>July</option><option>August</option><option>September</option><option>October</option>
<option>November</option><option>December</option></select>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><select name="year" style="width: 240px;"><option>All</option><option>2003</option><option>2004</option></select></td>
</tr>
<tr>
<td><b>Content:</b></td>
<td><input type="text" name="content" style="width:240px;"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="radio" name="type" value="0" style="border-width: 0px; background: transparant;" checked> Community news only</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="radio" name="type" value="0" style="border-width: 0px; background: transparant;"> Site news only</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" value="Search"></td>
</form>
</table>

Problemet är nu hur jag ska lösa det med SQL frågan. Menar, det blir ju en himla massa variablar när jag skriver

if($_GET['search'] == 'news' && isset($_GET['topic']) {
     $data = "WHERE topic LIKE '%".$_GET[topic]."%'";
} elseif($_GET['search'] == 'news' && isset($_GET['topic']) && isset($_GET['writer']) {
     $data = "WHERE topic LINE '%".$_GET[topic]."%' && writer = '%".$_GET[writer]."%'";
}

Osv...

Någon som har tips på hur det enklare går att lösa?

Tack på förhand

tydalMedlem sedan juni 20034 013 inlägg
#2

Ge alla dina sökvariabler ett gemensamt prefix, exempelvis S:
Stopic, Swriter

Sedan gör du bara en foreach-loop på hela $_GET och plockar ut dem som börjar med S och lägger till dem på SQL-satsen, så här:

$sql = "";
foreach ($_GET as $key => $value)
{
  if (substr($key, 0, 1) != "S")
    continue;
  $key = substr($key, 1); // Tar bort S.
  $sql .= "AND $key LIKE '%$value%' ";
}
$sql = substr($sql, 4); // Tar bort det första AND om du inte ska ha något annat villkor först.
mysql_query("SELECT * FROM tabell WHERE $sql");
MeleaMedlem sedan juli 20033 147 inlägg
#3

Lysande :)
Får kolla igenom och pröva den imorgon, sovgott!

MeleaMedlem sedan juli 20033 147 inlägg
#4

Såja! Fått det att funka nu, allt förutom datumet.

Jag vill ju köra en substr($datum,0,4) för att plocka ut år(year) och substr($datum,5,2) för att plocka ut månaden(month).

Kolumnen i databasen heter "datum" och är typen "date" och i formuläret har jag döpt dem till Syear och Smonth.

Tips på hur jag ska lösa det? :)

lunne82Medlem sedan dec. 2003153 inlägg
#5

Ett alternativ. Du kan ju även kalla dem month och year i formuläret och sedan ta hand om dem utanför foreach().

$sql = "";
foreach ($_GET as $key => $value)
{
  if (substr($key, 0, 1) != "S")
    continue;
  $key = substr($key, 1); // Tar bort S.
  if ($key == "month")
    $sql .= "AND $key = MONTH(datum) ";
  elseif ($key == "year")
    $sql .= "AND $key = YEAR(datum) ";
  else
    $sql .= "AND $key LIKE '%$value%' ";
}
$sql = substr($sql, 4); // Tar bort det första AND om du inte ska ha något annat villkor först.
mysql_query("SELECT * FROM tabell WHERE $sql");
MeleaMedlem sedan juli 20033 147 inlägg
#6

Kanon!

Om vi nu säger att jag har ett värde i Selecten som heter "Any" där datumet inte spelar någon roll. Hur skriver jag då ifsatsen?

elseif ($value == "Any")

Funkar ju inte eftersom $value måste vara samman med $key? Eller? :)

MeleaMedlem sedan juli 20033 147 inlägg
#7

Nu strular datumfunktionen lite ändå.

Såhär ser det ut just nu

<tr>
<td><b>Month and year:</b></td>
<td><select name="Smonth" style="width: 240px;">
<option value="all">Any</option><option value="1">January</option><option value="2">February</option>
<option value="3">Mars</option><option value="4">April</option><option value="5">May</option>
<option value="6">Juny</option><option value="7">July</option><option value="8">August</option>
<option value="9">September</option><option value="10">October</option><option value="11">November</option>
<option value="12">December</option></select>
</td>
<tr>
<td>&nbsp;</td>
<td><select name="Syear" style="width: 240px;"><option value="all">Any</option><option value="2003">2003</option><option value="2004">2004</option></select></td>
</tr>

Sen har döpt om lite i koden, hur som helst så ser den ut såhär:

$data = "";
foreach ($_GET as $key => $value)
{
  if (substr($key, 0, 1) != "S")
    continue;
  $key = substr($key, 1); // Tar bort S.

  if ($key == "month")
  	$data .= "AND $key = MONTH(datum) ";
  elseif ($key == "year")
  	$data .= "AND $key = YEAR(datum) ";
  else
  	$data .= "AND $key LIKE '%$value%' ";

}
$data = substr($data, 4); // Tar bort det första AND om du inte ska ha något annat villkor först.
$SQL = mysql_query("SELECT * FROM nyheter WHERE $data AND sitenews = '$in' AND hidden = '0' ORDER BY id DESC") or die (mysql_error());

Men eftersom kolumnerna month och year inte finns i databasen vill det inte funka.

lunne82Medlem sedan dec. 2003153 inlägg
#8

Det du skrev funkar också, men då måste du skriva in det i alla villkor. Genom att lägga till " || $value == "Any")" i den första if-satsen så blir det lite 'optat'.

$sql = "";
foreach ($_GET as $key => $value)
{
  if (substr($key, 0, 1) != "S" || $value == "Any")
    continue;
  $key = substr($key, 1); // Tar bort S.
  if ($key == "month")
    $sql .= "AND $key = MONTH(datum) ";
  elseif ($key == "year")
    $sql .= "AND $key = YEAR(datum) ";
  else
    $sql .= "AND $key LIKE '%$value%' ";
}
$sql = substr($sql, 4); // Tar bort det första AND om du inte ska ha något annat villkor först.
mysql_query("SELECT * FROM tabell WHERE $sql");
MeleaMedlem sedan juli 20033 147 inlägg
#9

Okej, hur som helst så funkar det inte med $key = "month" eftersom
month inte finns som kolumn i databasen, samma med "year".

lunne82Medlem sedan dec. 2003153 inlägg
#10

Ja men då ändrar du ju bara till

if ($key == "month")
  $data .= "AND din_månads_kolumn = MONTH(datum) ";
elseif ($key == "year")
  $data .= "AND din_års_kolumn = YEAR(datum) ";

Hm, det ska vara ny rad i koden, men det verkar inte funka.

128 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)