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