Autor Zpráva
nowis
Profil *
Zdravím,

jedná se asi o banalitu. Mám formulář o 12 polích. Na základě toho, které údaje uživatel zadá, se provede filtr.
Potřeboval bych, aby se mi vygeneroval textový řetězec typu"WHERE A,B,C", který bych pak vložil do dotazu.

Nevím, jak to provést elegantně. Napadlo mě řešení s mnoha if, ale nelíbí se mi.

Mohli byste mě prosím navést?

Děkuji
Tori
Profil
Udělala bych to asi takhle:
formulář: A = <input type='text' name='filtry[A]'>, B = <input type='text' name='filtry[B]'> C = ...
Na serveru máte mapu filtrů a db.sloupečků: $mapa = array('A' => '`sloupec1`', 'B' => '`sloupec2`'); a procházíte pole $_POST['filtry']. Pokud je položka neprázdná, vezmete její klíč, přeložíte si ho na jméno odpovídajícího sloupce a doplníte do SQL i se zadanou hodnotou.
Jednodušším by se zdálo pojmenovat inputy podle sloupečků v DB, ale jednak tam je větší bezpečnostní riziko, druhak je to málo flexibilní, pokud by ve WHERE mělo být cokoli jiného než sloupec = hodnota. Jediný problém je, že nevíte, jakého typu je zadávaná hodnota, a teda čím ji správně escapovat. To by mohlo vyřešit buď mapa formulářové políčko => dat.typ, nebo odhadovat podle hodnot (mám pocit, že dibi tohle umí).
nowis
Profil *
Tori:
uauu, no zkusím to nějak pojmout :-)

Díky
nowis
Profil *
ještě mně napadlo, nešlo by to udělat takhle? Nemůžu to teď vyzkoušet, ale nezdá se mi to jako nesmysl, ale jsem začátečník...

if (ISSET($_POST['A']) || ISSET($_POST['B']) || ISSET($_POST['C']))
 {$pole = Array(('$_POST['A']), ISSET($_POST['B']), ISSET($_POST['C']));
   Implode ($pole, ', ');
   $where = 'WHERE '.$pole;
}

a pak tu proměnnou $where vložím do dotazu...
nowis
Profil *
Tak jsem to vyzkoušel, a myslím, že by to mohlo fungovat, jen asi neumím použít pole, protože výsledek je "WHERE Vysledek1, 1, 1"
nowis
Profil *
hmm, nefunguje :-(

if ($_POST['zadano']=='Filtrovat') 
    {
    if ($_POST['A'] <> '' || $_POST['B'] <> '' || $_POST['C'] <> '') 
           {
           $pole = Array(        'A" = "'.$_POST['A'],
                            'B" = "'.$_POST['B'], 
                            'C" = "'.$_POST['C']); 
           
           
            $where= 'WHERE "'.Implode ($pole, '", "').'"'; 
           echo $where;
           }
    }
Když zadám jen některé z polí, pak výsledek je: WHERE "A" = "TestA", "B" = "", "C" = ""

Vím proč to tak je (implode), ale nevím jak z toho ven...
Tori
Profil
nowis:
Potřebujete každou hodnotu testovat, jestli byla zadaná a SQL si skládat postupně. Abyste nemusel použít x podmínek, je lepší to dělat v nějakém cyklu. A abyste nebyl vázaný na přesný počet / jména formulářových polí, pojmenovala bych je jako ve [#2] - pak stačí foreach($_POST['filtry'] as $nazev=>$hodnota) {...}
Klidně si to pro začátek zjednodušte a pojmenujte form.pole podle sloupečků v DB. Až to bude fungovat, tak třeba použijete i tu mapu.
nowis
Profil *
Tori:
jj, děkuju, jěště se s tím poperu, akorát - nikde jsem nikde nenašel co to znamená "mapa filtrů", mohla byste mi to prosím nějak ujasnit, nebo napsat kde hledat?

Díky moc
nowis
Profil *
nowis:
Omlouvám se za hloupý dotaz, začínám pomalu chápat ten první příspěvek. Spíše teď nechápu, co myslíte tím "na serveru". Tím myslíte někde v databázi? (doufám, že to není ještě hloupější dotaz :-))

mám to uděláno takto:

<FORM>
<INPUT TYPE=TEXT NAME=VSTUP[A]>
<INPUT TYPE=TEXT NAME=VSTUP[B]>
<INPUT TYPE=TEXT NAME=VSTUP[C]>
</FORM>

jestli to dobře chápu, tak tímto si rovnou v html formuláři definuju pole(?).

a pak řeším požadavek na filtrování:
           $first = true;
        foreach ($_POST['VSTUP'] as $nazev => $hodnota) 
            {
            if (!$first)         
                  {
                    $where = $where.', '.$nazev.' = '.$hodnota;
                  }
            if ($first)
                  {
                    $where = 'WHERE '.$nazev.' = '.$hodnota;
                    $first = false;
                  }

             }
nowis
Profil *
Tori:
tak už jsem to dal dohromady. Díky moc.

    if ($_POST['A'] <> '' || $_POST['B'] <> '' || $_POST['C'] <> '') 
           {
           

         $mapa = array(A => $_POST['A'], B => $_POST['B'], C => $_POST['C']);
           
            $first = true;
           
         foreach ($mapa as $nazev => $hodnota) 
            {
            if ($first == false && $hodnota <> '')         
                  {
                    if ($hodnota <> '') $where = $where.', "'.$nazev.'" = "'.$hodnota.'"';
                  }
            if ($first == true && $hodnota <> '')
                  {
                    $where = 'WHERE "'.$nazev.'" = "'.$hodnota.'"';
                    $first = false;
                  }

             }

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0