webForumDet fria alternativet

Sökfunktion - Olika värden

PHP

5 svar · 583 visningar · startad av streetrobban

Medlem sedan jan. 20011 140 inlägg
Frågan#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?

Medlem 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?

Medlem 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!?

Medlem 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);
						}
					}
				}
			}
Medlem 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);
?>
Medlem 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

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)