Filtry z URL jako parametry zapytania MySQL

0

Witam z adresu URL pobieram filtry wyszukiwania np URL?size[]=30&color[]=czerwony&color[]=czarny
w PHP pobieram te wartosci jako tablice (działa)
następnie przesyłam je do funkcji która używa ich jako parametry w zapytaniu, krótki kod (xd) :

function search_multi($nameFilters, $colorFilters, $sizeFilters){
	$where = "";
	if(count($nameFilters) > 0 || count($colorFilters) > 0 || count($sizeFilters) > 0)
		$where = "WHERE";
	if(count($nameFilters) > 0){
	$nameParameters = "Nazwa IN (";
	for($i=0; $i<count($nameFilters); $i++){
		$nameParameters .= "name" . $i;
		if($i < count($nameFilters)-1)
			$nameParameters .= ",";
	}
	$nameParameters .= ") ";
	}
	if(count($colorFilters) > 0){
	$colorParameters = "Kolor IN (";
	for($i=0; $i<count($colorFilters); $i++){
		$colorParameters .= "color" . $i;
		if($i < count($colorFilters)-1)
			$colorParameters .= ",";
	}
	$colorParameters .= ") ";
	}
	if(count($sizeFilters) > 0){
	$sizeParameters = "Rozmiar IN (";
	for($i=0; $i<count($sizeFilters); $i++){
		$sizeParameters .= "size" . $i;
		if($i < count($sizeFilters)-1)
			$sizeParameters .= ",";
	}
	$sizeParameters .= ") ";
	}
    $query = "SELECT id, Nazwa, Rozmiar, Kolor FROM " . $this->nazwa_tabeli . " " . $where . " ";
	
	if(count($nameFilters) > 0)
		$query.= $nameParameters;
	
	if(count($colorFilters) > 0){
		if(count($nameFilters) > 0)
			$query.= "AND ";
		$query.= $colorParameters;
	}
	
	if(count($sizeFilters) > 0){
		if(count($nameFilters) > 0 || count($colorFilters) > 0)
			$query.= "AND ";
		$query.= $sizeParameters;
	}
 
    $stmt = $this->polaczenie->prepare($query);
 
	if(count($nameFilters) > 0){
	for($i = 0;$i<count($nameFilters);$i++){
		$tmp_string = $nameFilters[$i];
		$tmp_string=htmlspecialchars(strip_tags($tmp_string));
		$tmp_string = "%{$tmp_string}%";
		$stmt->bindParam("name" . $i, $tmp_string);
	}
	}
	
	if(count($colorFilters) > 0){
	for($i = 0;$i<count($colorFilters);$i++){
		$tmp_string = $colorFilters[$i];
		$tmp_string=htmlspecialchars(strip_tags($tmp_string));
		$tmp_string = "%{$tmp_string}%";
		$stmt->bindParam("color" . $i, $tmp_string);
	}
	}
	
	if(count($sizeFilters) > 0){
	for($i = 0;$i<count($sizeFilters);$i++){
		$tmp_string = $sizeFilters[$i];
		$tmp_string=htmlspecialchars(strip_tags($tmp_string));
		$tmp_string = "%{$tmp_string}%";
		$stmt->bindParam("size" . $i, $tmp_string);
	}
	}
	
    $stmt->execute();
	
    return $stmt;
}
0

// nie mam możliwości edycji a nie dopisałem dalszej części :c
Otóż :
dla URL?color[]=czerwony&color[]=czarny

zapytanie sql wyglada : SELECT id, Nazwa, Rozmiar, Kolor FROM buty WHERE Kolor IN (color0,color1)

a wiazania : color0 %czerwony% color1 %czarny%

Nie otrzymuje zadnych danych z bazy (a powinny byc) i co gorsze zadnych bledow :c

0

Poradziłem już sobie z problemem, wystarczyło dopisać ":" w odpowiednie miejsca -_-

2

Przy skomplikowanych tablicach to raczej użyłbym POST niż GET.
Generalnie to coś takiego nie zadziała = "color0 %czerwony% color1 %czarny%"
Jeśli tworzysz ten link jakoś dynamicznie z formularza etc to użyj:

http-build-query();

http://php.net/manual/en/function.http-build-query.php
Jeśli chcesz robić ręcznie ten link to musisz eskejpować znaki zgodnie z zasadami budowania URLa, czyli znaki [] zamieniamy na kod ASCII i dodajemy %. Czyli dla pierwszej wartości tablicy masz %5B0%5D co odpowiada zapisowi [0].

for($i=0; $i<count($nameFilters); $i++){
        $nameParameters .= "name" . $i;
        if($i < count($nameFilters)-1)
            $nameParameters .= ",";
    }

A to można zastąpić:

implode(",", $nameFilters);

1 użytkowników online, w tym zalogowanych: 0, gości: 1