podmienene vyhladavanie v databaze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
attika8
Člen | 23
+
0
-

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)

h4kuna
Backer | 740
+
0
-

Tímhle porušuješ v veškerou bezpečnost a otevíráš dveře pro sql-injection.

Koukni na to jak sestavit slqka

$this->database->table($table)->select('*')->where('name LIKE ?', $searchword)->where('language', $language)->where('mediatype', $mediatype);
attika8
Člen | 23
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Dakujem , toto som potreboval.

attika8
Člen | 23
+
0
-

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
+
0
-

bud https://componette.org/search/?…
a nebo jednoduse vytvor container a nahaz to do nej https://doc.nette.org/cs/forms#…

attika8
Člen | 23
+
0
-

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
+
0
-

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
+
0
-

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.