webForumDet fria alternativet

Sökfunktion - Olika värden

5 svar · 583 visningar · startad av streetrobban

streetrobbanMedlem sedan jan. 20011 140 inlägg
#1

Hej!

Jag håller på med en sökfunktion och jag kan inte får inte riktigt till det.

Jag har fyra drop-down lister med värden i, antingen ID eller 1/2 beroende på drop-down.

Jag har t.ex. en lista där man kan välja ort där alla val har ett ID. Men man kan också välja "Alla orter" och då skickas inget ID med.

Problemet att jag inte vet hur jag ska hantera detta i SQL satsen. Det står verkligen helt still i min hjärna, vet inte om det beror på värmen :) Kan någon hjälpa mig?

streetrobbanMedlem sedan jan. 20011 140 inlägg
#2

Jag har löst detta nu med en massa IF-satser. Men det måste finnas något enklare sätt?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

streetrobban skrev:

Jag har löst detta nu med en massa IF-satser. Men det måste finnas något enklare sätt?

Hur ska vi kunna veta det eller hur ska vi kunna säga någonting när du inte visar någon kod eller överhuvudtaget berättar hur du tänkt!?

streetrobbanMedlem sedan jan. 20011 140 inlägg
#4

Jag tänkte bara att en IF-sats kanske inte är optimalt över huvud taget. Men här kommer koden:

			// Kontrollera om några resultat hittas i världens längsta IF-sats
			if (empty($Gender) && empty($District) && empty($SearchWord))
			{
				// Hämta användaren
				$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
				FROM Districts Dis
				INNER JOIN Users AS Usr ON Usr.District = Dis.ID
				ORDER BY Usr.Firstname ASC, Dis.District ASC");
				$CountedHits = mysql_num_rows($get);
			}
			else
			{
				if (empty($SearchWord))
				{
					if (empty($Gender))
					{
						// Hämta användaren
						$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
						FROM Districts Dis
						INNER JOIN Users AS Usr ON Usr.District = Dis.ID
						WHERE Usr.District = '$District'
						ORDER BY Usr.Firstname ASC, Dis.District ASC");
						$CountedHits = mysql_num_rows($get);
					}
					else
					{
						if (empty($District))
						{
							// Hämta användaren
							$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
							FROM Districts Dis
							INNER JOIN Users AS Usr ON Usr.District = Dis.ID
							WHERE Usr.Gender = '$Gender'
							ORDER BY Usr.Firstname ASC, Dis.District ASC");
							$CountedHits = mysql_num_rows($get);
						}
						else
						{
							// Hämta användaren
							$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
							FROM Districts Dis
							INNER JOIN Users AS Usr ON Usr.District = Dis.ID
							WHERE Usr.Gender = '$Gender' AND Usr.District = '$District'
							ORDER BY Usr.Firstname ASC, Dis.District ASC");
							$CountedHits = mysql_num_rows($get);
						}
					}
				}
				else if (empty($Gender) && empty($District))
				{
						// Hämta användaren
						$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
						FROM Districts Dis
						INNER JOIN Users AS Usr ON Usr.District = Dis.ID
						WHERE Usr.Firstname LIKE '%$SearchWord%' OR Usr.Lastname LIKE '%$SearchWord%'
						ORDER BY Usr.Firstname ASC, Dis.District ASC");
						$CountedHits = mysql_num_rows($get);
				}
				else
				{
					if (empty($Gender))
					{
						// Hämta användaren
						$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
						FROM Districts Dis
						INNER JOIN Users AS Usr ON Usr.District = Dis.ID
						WHERE Usr.District = '$District' AND Usr.Firstname LIKE '%$SearchWord%' OR Usr.Lastname LIKE '%$SearchWord%'
						ORDER BY Usr.Firstname ASC, Dis.District ASC");
						$CountedHits = mysql_num_rows($get);
					}
					else
					{
						if (empty($District))
						{
							// Hämta användaren
							$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
							FROM Districts Dis
							INNER JOIN Users AS Usr ON Usr.District = Dis.ID
							WHERE Usr.Gender = '$Gender' AND Usr.Firstname LIKE '%$SearchWord%' OR Usr.Lastname LIKE '%$SearchWord%'
							ORDER BY Usr.Firstname ASC, Dis.District ASC");
							$CountedHits = mysql_num_rows($get);
						}
						else
						{
							// Hämta användaren
							$get = mysql_query("SELECT Usr.ID, Usr.Firstname, Usr.Lastname, Usr.Gender, Usr.City, Usr.District, Usr.Image, Dis.District AS DistrictName
							FROM Districts Dis
							INNER JOIN Users AS Usr ON Usr.District = Dis.ID
							WHERE Usr.Gender = '$Gender' AND Usr.District = '$District' AND Usr.Firstname LIKE '%$SearchWord%' OR Usr.Lastname LIKE '%$SearchWord%'
							ORDER BY Usr.Firstname ASC, Dis.District ASC");
							$CountedHits = mysql_num_rows($get);
						}
					}
				}
			}
GildebrandMedlem sedan juni 2009920 inlägg
#5

Nu vet ju jag inte hur ditt formulär ser ut, eller vad $Gender och de andra variablerna är för något, men jag utgår från att det är postad information.

Är lite trött så är inte världens snyggaste kod direkt, men borde funka.

<form action="test.php" method="post">
<input type="text" name="search[value1]"></input>
<input type="text" name="search[value2]"></input>
<button type="submit"></button>
</form>

<?php
$p = array();

if (isset($_POST['search'])){
	foreach($_POST['search'] as $item => $value){
		if ($value != NULL){
			$p[] = "$item = '$value'";
		}
	}
}

if ($p != NULL){
	$sqlwhere = " " . implode(' AND ', $p) . " ";
}
else $sqlwhere = "";

$get = mysql_query("SELECT *
FROM Districts Dis
INNER JOIN Users AS Usr ON Usr.District = Dis.ID
$sqlwhere
ORDER BY Usr.Firstname ASC, Dis.District ASC");

$CountedHits = mysql_num_rows($get);
?>
DufferMedlem sedan mars 2003429 inlägg
#6

Glöm bara inte bort säkerheten, värdena i båda fallen verkar onekligen komma från inputfält, när du stoppar in dem direkt i en query på det där sättet är det lätt att börja sabba med injections. Så på med lite escaping på din värden så kan du köra med Glidebrands version.

Om dina värden är av olika input varianter t.ex. checkboxar, inputfält och radiobuttons kan du göra en liten mini-state-machine implementation (du loopar alltså igenom dina $_POST-värden över en switch-sats) eftersom vi php-utvecklare får switcha på strängar och inte bara siffror så finns det väldigt många möjligheter för detta :)

Mvh
Tobias

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