podmienene vyhladavanie v databaze
- attika8
- Člen | 23
Dobrý den,
snažím sa dostat z databaze pomocou formulára určité záznamy ale jednotlivé argumenty závisia na zvolení užívatela.
Takto vyzera moj dotaz.
public function hladajKnihu($searchword,$language,$mediatype)
{
$searchword = "%".$searchword."%";
$sql = 'SELECT * FROM book WHERE name LIKE '.$searchword.' AND';
if ($language == "all") {
} else {
$sql.= 'language='.$language.' AND ';
}
if ($mediatype == "all"){
}else {
$sql.= 'mediatype='.$mediatype;
}
return $this->database->query($sql);
}
--/
Viete mi prosim poradiť ako dostat tie jednotlivé argumenty z databáze?
Napriklad ak zvolí nazov knihy "sql" a language "čeština" a mediatype "all" tak to potrebujem ošetrit.
Existuje na to nejaký jednoduchý spôsob? Takto mi to nereaguje vobec na $sql .= a vsetko od AND ignoruje
Dakujem za odpovede.
Editoval attika8 (16. 3. 2013 22:04)
- attika8
- Člen | 23
jo, takto som si to už zostavil, problém je v tom, že ak to mám takto, tak ked zvolím napr. language = „all“ tak tam chcem proste vynechat klauzulu where.
takto mi to vyhodi „sql“, „čeština“, „tlačená forma“ ale ak chcem „sql“, „all“, „all“ tak to musím ošetrit tak že do language a mediatype sa neodosle nic…
este aby bolo jasne, tak moj form v presenteri vyzera takto :
<?php
function createComponentSearchBookForm()
{
$form = new Form;
$form->addText('searchword','Zadajte hladane slovo');
$form->setMethod('GET');
$jazyk = $this->homepageFacade->getLanguage();
$jazyk[] = "all";
$form->addSelect('language','Jazyk:',$jazyk);
$mediatype = $this->homepageFacade->getmediatype();
$mediatype[] = "all";
$form->addSelect('mediatype','Druh publikacie:',$mediatype);
$form->addSubmit('send','Hladaj');
$form->onSubmit[] = $this->searchBookFormSubmitted;
return $form;
}
?>
- cesilek
- Člen | 3
A co ti brání podmínit where?
$query = $this->database->table($table)->select('*')->where('name LIKE ?', $searchword);
if($language != "all")
$query->where('language', $language)
if($mediatype != "all")
$query->where('mediatype', $mediatype);
return $query;
Mimochodem, místo onSubmit je vhodnější použít onSuccess.
- Jan Mikeš
- Člen | 771
Zde mas upravenou funkci z prvniho prispevku
public function hladajKnihu($searchword,$language,$mediatype)
{
$selection = $this->database->table($table)->select('*')->where("name LIKE ?", "%$searchword%");
if ($language != "all")
$selection->where("language", $language);
if ($mediatype != "all")
$selection->where("mediatype", $mediatype);
return $selection;
}
Lepsi, prehlednejsi, bezpecnejsi.
E: Sakra, predbehl jsi me mezi tim co jsem to mel rozepsano :)
Editoval Lexi (16. 3. 2013 23:21)
- attika8
- Člen | 23
ešte som sa chcel spýtať , ako vytvorím formulár kde budem mať na
výstupe
keyword[0] = ""
keyword[1] = ""
keyword[2] = ""
?
momentálne to mám ako
<?php
$form->addGroup('Klúčové slová');
$form->addText('keyword','Klucove slovo');
$form->addText('keyword1','Klucove slovo 2:'); // $form->addText('keyword','Klucove slovo 2:'); - takto to nefunguje
?>
Na výstupe chcem spracovať klucove slova spracovat cez foreach a kontrolovat oproti databaze, len neviem ako vytvorit pole z formulara.
Dakujem za odpovede.
Editoval attika8 (17. 3. 2013 13:41)
- David Matějka
- Moderator | 6445
bud https://componette.org/search/?…
a nebo jednoduse vytvor container a nahaz to do nej https://doc.nette.org/cs/forms#…
- attika8
- Člen | 23
Dakujem , pouzil som $form->addDynamic, ale problem je v tom ze mi to
nevykresli do template-u. Vie mi niekto poradit?
Po odoslani formulara tam tu komponentu mam, ale neni vykreslena.
form
<?php
function createComponentBookForm($handler){
$form= new Form;
$form->addDynamic('Keywords', function (Container $container) {
$container->addText('keyword', 'Slovo:');
});
$form->onSuccess[]= $handler;
return $form;
}
?>
a dump po odoslani
<?php
Keywords => Nette\ArrayHash (0)
?>
Problem je ze addText sa mi nevykresli, takze tam nemozem nic ani
doplnit.
<?php use Nette\Application\UI\Form\Container; ?> na zaciatku
pouzivam.Predtym som mal use Nette\Forms\Container; ale ani tak to neslo.
Dakujem.
Editoval attika8 (17. 3. 2013 15:18)
- David Matějka
- Moderator | 6445
replicator totiz defaultne nevytvori zadnej dynamickej container, bud muzes
pridat dalsi parametr do ty metody ->addDynamic
– za ten
callback na vytvoreni containeru napis cislo, ktery urcuje kolik containeru se
defaultne vytvori.
nebo si tam dej tlacitka na pridavani a odebirani kontejneru rucne – https://componette.org/search/?…
- attika8
- Člen | 23
dakujem, takto som to uz rozbehal, problem je ze ked stlacim button ‚Pridat dalsie slovo‘ tak sa mi cely form odosiela a validuje a tym padom ak stlacim pridat slovo a vlozim dalsie slovo , tak tu knihu tam budem mat 2× , co zrovna nie je nic super. Da sa to nejako obist?
<?php
$presenter = $this;
$invalidateCallback = function () use ($presenter) {
/** @var \Nette\Application\UI\Presenter $presenter */
$presenter->invalidateControl('addForm');
};
$slova = $form->addDynamic('keywords', function (Container $slova) {
$slova->addText('word', 'Kľúčové slovo:')
->setRequired('Zadaj slovo');
$slova->addSubmit('remove', 'Smazat')
->addRemoveOnClick();
}, 1);
$slova->addSubmit('add', 'Pridat dalsie slovo')
->addCreateOnClick($invalidateCallback);
?>
Dakujem.