MeleaMedlem sedan juli 20033 147 inlägg 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> </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> </td>
<td><input type="radio" name="type" value="0" style="border-width: 0px; background: transparant;" checked> Community news only</td>
</tr>
<tr>
<td> </td>
<td><input type="radio" name="type" value="0" style="border-width: 0px; background: transparant;"> Site news only</td>
</tr>
<tr>
<td> </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 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 Lysande :)
Får kolla igenom och pröva den imorgon, sovgott!
MeleaMedlem sedan juli 20033 147 inlägg 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 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 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 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> </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 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 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 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.