---
title: "Tips till sökfunktion"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/102746-tips-till-sökfunktion"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Melea"
published: "2004-05-01T20:46:03.000Z"
updated: "2004-05-05T11:22:25.000Z"
replies: 9
views: 377
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/102746-tips-till-sökfunktion"
---

# Tips till sökfunktion

## #1 — Melea, 2004-05-01T20:46Z

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

```php
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

Permalänk: https://www.webforum.nu/p/102746

## #2 — tydal, 2004-05-01T21:10Z

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");
```

Permalänk: https://www.webforum.nu/p/1336509

## #3 — Melea, 2004-05-01T21:13Z

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

Permalänk: https://www.webforum.nu/p/1336511

## #4 — Melea, 2004-05-02T10:56Z

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? :)

Permalänk: https://www.webforum.nu/p/1336680

## #5 — lunne82, 2004-05-02T11:31Z

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

```php
$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");
```

Permalänk: https://www.webforum.nu/p/1336704

## #6 — Melea, 2004-05-02T11:39Z

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?

```php
elseif ($value == "Any")
```

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

Permalänk: https://www.webforum.nu/p/1336710

## #7 — Melea, 2004-05-02T12:51Z

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:

```php
$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.

Permalänk: https://www.webforum.nu/p/1336742

## #8 — lunne82, 2004-05-02T21:05Z

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'.

```php
$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");
```

Permalänk: https://www.webforum.nu/p/1337040

## #9 — Melea, 2004-05-03T06:59Z

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

Permalänk: https://www.webforum.nu/p/1337155

## #10 — lunne82, 2004-05-05T11:22Z

Ja men då ändrar du ju bara till

```php
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.

Permalänk: https://www.webforum.nu/p/1338549

---

Tråden på webben: https://www.webforum.nu/amne/php/102746-tips-till-sökfunktion
