Filtry z URL jako parametry zapytania MySQL

Odpowiedz Nowy wątek
2018-01-27 12:58
Złoty Wąż
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;
}

Pozostało 580 znaków

2018-01-27 13:04
Złoty Wąż
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

Pozostało 580 znaków

2018-01-27 13:22
Złoty Wąż
0

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

Pozostało 580 znaków

2018-01-27 13:49
0

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);
edytowany 1x, ostatnio: jurek1980, 2018-01-27 13:50

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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