Query opbouwen uit $_POST

Status
Niet open voor verdere reacties.

Lexie2408

Gebruiker
Lid geworden
7 jan 2008
Berichten
42
Vraagje:

Ik ben gevraagd een soort zoekfunctie te maken voor 85 rapporten. De bedoeling is dat er door middel van drop-down menu's gezocht kan worden op bepaalde metadata van de rapport (bijv. land, regio, stad, jaar, etc.).

Ik heb inmiddels een 6-tal drop-down menu's aangemaakt en deze versturen keurig de waarden verder. Wat ik wil is het volgende:

  • Bepaal het aantal waarden wat is verstuurd (verwarrend hierbij is dat de Submit ook verstuurd wordt, dus is er altijd een extra waarde)
  • Wanneer er slechts één waarde is verstuurd: creer een Query, zoek in MySQL en toon aantal hits
  • Wanneer er meerdere waarden zijn verstuurd: creer de Query en voeg AND toe waar nodig, zoek in MySQL en toen aantal hits

Tot op heden heb ik dit gefabriceerd:

PHP:
$i = 0;



foreach($_POST as $a => $b)
	{
		
		echo $a . $b;
		$i++;
	}

echo $i;

if ($i == 2)
	{
		$option = $a . ".id = " . $b;
		echo $option;
	}

show_content($options);

Hoop dat iemand me kan helpen...Thanks!!
 
Voor je door de $_POST waardes gaat, doe je unset($_POST['Submit'])
Zo verwijder je die uit de $_POST array.

$aantalZoekWaardes = count($_POST);
if($aantalZoekWaardes >= 1) {
// maak query met AND
} elseif($aantalZoekWaardes == 1) {
// maak query zonder AND i
} else {
// error geen zoek waardes gevonden
}
 
Laatst bewerkt:
Dank je voor je antwoord! Dit zocht ik! Maar...

Nu worden ook de lege waardes geteld. Wat ik zou willen is dat alleen de ingevulde waardes gegeven.
 
zou zo iets daar niet voor kunnen werken

PHP:
IF ($b != "") {
         //Code die wordt uitgevoerd als het niet leeg is
}
 
Was daar ook al mee aan het experimenteren:

PHP:
unset($_GET['button']);

$i = 0;

if($_GET['year'] != "")
	{
		$i++;
	}

if($_GET['country'] != "")
	{
		$i++;
	}

echo $i;

Maar uitkomst blijft "1". Moet een lus gebruiken, maar de vraag is nu dan, welke...
 
Denk dat ik 'm heb:

PHP:
unset($_GET['button']);

foreach($_GET as $a => $b)
	{
		
		if($b !="")
		{
			$i++;
		}
	}

echo $i;

Hierna ga ik verder met de input van phobia!
 
misschien zo iets

PHP:
unset($_GET['button']);

$i = 0;

foreach ($_GET as $key => $value ) {
   if ($value != "") {
      $i +=1;
}
echo $i

Je had het zelf al gevonden :D
 
Laatst bewerkt:
foreach($_POST as $key => $value) {
$value = trim($value);//Zodat er niet alleen een spatie ingevoerd word
if(empty($value))
unset($_POST[$key]; // verwijderd de lege variabele uit de array
}
 
@phobia, er kunnen geen spaties in voorkomen want alle zoek waardes zijn drop-down lists, de waardes staan daar al in vast.

@Lexie2408, hier een stuk code om de SQL statement op te bouwen, kan mooier en compacter door de twee foreach samen te voegen
PHP:
$i =0;

foreach ($_GET as $k => $v) {
	if ($v != "") {
		$i +=1;
	} else {
		unset($_GET[$k]);
	}
}

print $i;

$sql = "SELECT * FROM tabel "; 

$where = true;
foreach ($_GET as $k => $v) {
	if ($where) {
		$where = false;
		$sql .=" WHERE $k='$v' ";
	} else {
		$sql .= "AND $k='$v' ";
	}
}

print $sql;
 
@maikel123
Als jij met een $_GET werkt, dat kan een gebruiker alles veranderen. dus ook een spatie invoegen.
en al de waardes die je in een database gaat gebruiker moet je eerst filteren!!! !!!SQL-Injection!!!
Als ik jou was zou ik een array maken met de database columnsnamen er in.
En de $_GET daarmee filteren.
 
@phobia
ik weet nog niet zoveel in het voorkomen van een SQL-Injection, maar wat is nu het nut om de spaties weg te halen?
En tweede is punt is wel handig, maar ik had het ook snel gemaakt om een SQL statement op te bouwen en nog niet naar gedacht over de veiligheid ervan.
 
Als jouw url www.website.nl?dit=5&dat=dog&wat=droog moet zijn,
dan is dit heel iets anders www.website.nl?dit= 5&dat= &wat=droog
In de 2de URl gaat de query zoeken naar dit = spatie 5 en niet naar dit=5
en dat = spatie en ik neem aan dat dat niet voorkomt ik je database.

Zelfs als je weet dat altijd je zoekwaardes lower string zijn, dan moet je de string die je in de query gebruikt een ff door strtolower($srt) halen
 
Heb even verder gekeken voor het voorkomen van SQL Injection, is dit niet een betere oplossing "mysql_real_escape_string" of gebruik maken van Prepared Statements.
Tuurlijk is het altijd hanig om whitespace of alles lowercase te doen als dat alleen in de database voorkomt, maar dat helpt niet egt tegen een SQL Injection.
 
Gooi je input in een expresion dat het alleen bv upper/lower en numeric mag bevatten en je kunt het door de htmlenteties doen en dan de strip_tags heb je nog.
Je kunt nog zoveel doen om de string te filteren voor je het de query in stopt.
En dat zou ik als ik jou was zeker doen, aan gezien je de waardes uit de url plukt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan