IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Filtrování SQL dotazu pomocí několika checkboxů

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
JaKr
Člen
Avatar
JaKr:27.12.2019 12:03

Ahoj, snažím se v php vytvořit filtr produktů za pomocí checkboxů, které by filtrovaly SQL select. Aktuálně se mi podařilo dostat do stavu, kdy dokážu vyfiltrovat produkty podle checkboxů s názvem pohlavi[], ale nedaří se mi na toto řešení napasovat další typy checkboxů jako například velikost[], typ[], apod.

Zkusil jsem:

$pohlaviSTMT = implode(',', array_fill(0, count($pohlavi), '?'));
            $stmt = $this->conn->prepare("SELECT * FROM `produkty` WHERE pohlavi IN(" . $pohlaviSTMT . ")  ORDER BY `datum` DESC LIMIT $start, $cil;");
            foreach ($pohlavi as $key => $value)
                $stmt->bindValue(($key + 1), $value);

V tomto stavu mi funguje filtrování podle pohlaví, jak už jsem psal.

Chci docílit: Potřeboval bych poradit, jak bych například mohl bindovat (zřejmě by to nešlo pomocí bindValue), pokud bych do dotazu přidal:

AND velikost IN(" . $velikostSTMT . ")

Moc díky za každý podnět,

JaKr

 
Odpovědět
27.12.2019 12:03
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.12.2019 17:00
$filtry = array(
'pohlavi' => array(),
'velikost' => array()
);
$where = array();
foreach ($filtry as $key=>$values)
{if (is_array($values) && count($values)) {

$values = array()
foreach($values as $index=>$value)
$values[$index] = escapeValue($value);
$where[] = escapeKey($name).' IN ('.implode(',', $values).')'

}}

$where = implode(' AND ', $where);

Dobre je, ze si tam muzes dat podminku na filter name a udelat mu slesl obsah pro where.

Editováno 27.12.2019 17:01
 
Nahoru Odpovědět
27.12.2019 17:00
Avatar
JaKr
Člen
Avatar
Odpovídá na Peter Mlich
JaKr:28.12.2019 10:40

Můžu se zeptat, co dělá ta funkce escapeValue a escapeKey? Kódu totiž do tohoto bodu rozumím, použil jsem var_dump a vždy do té chvíle něco vypsal, ale když následně vypíšu var_dump($values), tak je prázdný. Posílám ještě pro jistotu kód, jak jsem ho aplikoval...

if (isset($_GET["pohlavi"]))
            $pohlavi = $_GET["pohlavi"];
            else
                $pohlavi = ["muz", "zena"];

            if (isset($_GET["velikost"]))
                $velikost = $_GET["velikost"];
            else
                $velikost = ["maly", "stredni","velky"];


            $filtry = array(
                'pohlavi' => $pohlavi,
                'velikost' => $velikost );
            //var_dump($filtry);
            $where = array();
            foreach ($filtry as $key=>$values) {
                if (is_array($values) && count($values)) {
                $values = array();
foreach ($values as $index=>$value) {
    $values[$index] = escapeValue($value);
    var_dump($values);
}
$where[] = 'IN ('.implode(',', $values).')';
}
            }

Předem díky ;-)

 
Nahoru Odpovědět
28.12.2019 10:40
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.12.2019 13:47

No, ty escape, to si doplnis podle sveho sql. Aby to nenarusilo sql dotaz. Treba pro mysql je

escapekey = "`". $key . "`" // a jeste z key odstranit znaky, ktere pro nazev sloupce/tabulky nelze pouzit
escapeValue = . "'". mysql_real_es­cape_string($va­lue). "'"

https://dev.mysql.com/…iterals.html
https://www.php.net/…e-string.php

Ps. A ten kod mas uplne spatne. Zkus nad tim premyslet, co jsem se pokusil napsat.
>> $values = array();

Editováno 28.12.2019 13:49
 
Nahoru Odpovědět
28.12.2019 13:47
Avatar
JaKr
Člen
Avatar
Odpovídá na Peter Mlich
JaKr:28.12.2019 14:55

Paráda, moc díky za popostrčení! ;-) Podařilo se mi to zprovoznit, kód vypadá následovně:

$filtry = array(
                'pohlavi' => $pohlavi,
                'velikost' => $velikost );
            $where = array();
            foreach ($filtry as $key=>$values) {
                if (is_array($values) && count($values)) {
foreach ($values as $index=>$value) {
    $values[$index] = $value;
}
$where[] = $key." IN ('".implode('\',\'', $values)."')";
}
            }
            $where = implode(' AND ', $where);
 
Nahoru Odpovědět
28.12.2019 14:55
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.12.2019 17:13

No, ale bez sql escapovani ti to nepojede spravne a sql dotaz muze skoncit chybou.

 
Nahoru Odpovědět
29.12.2019 17:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.