PHP - proměná z formuláře jako hodnota selectu v sql dotazu

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Ahoj,
snažím se sestrojit webovy searcher, ktery po zadani hodnoty do inputu zavola v php sql dotaz a echem vyhodi vysledek.
díky za každý srozumitelný nápad
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


tdvorak

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #1 kdy: 13. 11. 2014, 13:36:35 »
Zkus položit nějakou konkrétní otázku. Ukaž, že si se snažil a něco dal dohromady. Popiš chybu, na který si se zarazil. Prostě něco od čeho se dá odrazit. 

j0hny

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #2 kdy: 13. 11. 2014, 13:47:10 »
Hodně zjednodušený proceduální postup by mohl vypadat nějak takhle. Samozřejmě v praxi budeš nejspíš chtít použít OOP a nějaký framework. (kód jsem netestoval, je to jen z hlavy)

Kód: [Vybrat]
<?php

if(isset($_POST['search_term'])) {
   
// inicializujeme spojeni s db
   
$pdo = new PDO($dsn$username$password);
   
// nastavime promenou z formulare - neznam typ tvoji databaze, takze pro escapovani predpokladam mySql
   
$term mysql_real_escape_string($_POST['search_term']);
   
// ziskame vysledek z db
   
$result $pdo->query("SELECT * FROM tabulka WHERE sloupec LIKE '%" $term "%'")->fetchAll();
   
// vypiseme
   
print_r($result);
} else {
?>


<form action="index.php" method="post">
   <input type="text" value="hledany vyraz" name="search_term" />
   <input type="submit" value="Hledat" name="submit" />
</form>

<?php
}
?>


Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #3 kdy: 13. 11. 2014, 13:50:07 »
Lidi, zapomente uz na ten podelanej escape_string!!! Kdyz uz nekomu radite, neradte takove hovadiny.
Na tohle jsou argumenty! PDO / DB si to osetri samo...
Děkuji za možnost editace příspěvku.

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #4 kdy: 13. 11. 2014, 13:58:01 »
Lidi, zapomente uz na ten podelanej escape_string!!! Kdyz uz nekomu radite, neradte takove hovadiny.
Na tohle jsou argumenty! PDO / DB si to osetri samo...

+1

mysql_real_escape_string sa da obist - http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string

Na taketo veci existuju prepared statements - http://php.net/manual/en/pdo.prepared-statements.php


Kas

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #5 kdy: 13. 11. 2014, 14:04:13 »
A pak třebas existuje Google a vlastní hlava, co ti pomůže najít dokumentaci k PDO a na lokálu si otestuješ možnost injection. Každopádně zkus chytřejší nástroje pro fulltext search, samotný MySQL ti moc efektivně nepomůže.

omelkes

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #6 kdy: 13. 11. 2014, 14:52:30 »
Takto NE!
J0hny zhlavy napsal řešení pouze skoro dobře hlavní chyba je v těchto dvou řádcích
Kód: [Vybrat]
<?php

   
// nastavime promenou z formulare - neznam typ tvoji databaze, takze pro escapovani predpokladam mySql
   
$term mysql_real_escape_string($_POST['search_term']);
   
// ziskame vysledek z db
   
$result $pdo->query("SELECT * FROM tabulka WHERE sloupec LIKE '%" $term "%'")->fetchAll();
Špatné je používání mysql_ funkcí obecně, za a je to pouze pro mysql, a za bé občas nevracejí ideální výsledky. Navíc se míchají dvě různé databázové knihovny.

Srávně se to řeší pomocí prepared statement, takto:
Kód: [Vybrat]
<?php

   
// připraví se dotaz
   
$prepared$pdo->prepare('SELECT * FROM table WHERE column LIKE :searchTerm');->fetchAll();
   
// provede se dotaz
   
$executed $prepared->execute(array(':searchTerm' => '%'.$_POST['search_term'].'%'));
   
// zisk výsledků
   
$result $executed->fetchAll();
Takto předávané parametry PDO ošetří samo (buď posláním jako parametry pro prepared statement, nebo z důvodů zpětné kompaktibility použitím escape funkce).
Používat tento způsob je tedy stejně bezpečný, navíc bývá rychlejší, databáze si prepared statement optimalizuje.

Kolemjdoucí

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #7 kdy: 13. 11. 2014, 15:11:26 »
Lidi, zapomente uz na ten podelanej escape_string!!!

Začátečníci a amatéři by měli používat prepared statement, nasekají tak nejméně chyb.
Profesionál si napíše escapování tak, že funguje za všech okolností správně a ušetří tak roundrip na server.

Používat tento způsob je tedy stejně bezpečný, navíc bývá rychlejší, databáze si prepared statement optimalizuje.

Prepared statement použitý pouze jednou je pomalejší.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #8 kdy: 13. 11. 2014, 15:11:46 »
díky moc všem...už jsem byl hodně blízko, ale toto mi velmi pomohlo
by the way:
netušíte co způsobuje, že se PHP kod neprovede, ale browser jen zobrazí zdroják?...apache jede, jine php ze stejneho adresare se provedou v poradku....? hmmmm
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

meno

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #9 kdy: 13. 11. 2014, 15:19:44 »
díky moc všem...už jsem byl hodně blízko, ale toto mi velmi pomohlo
by the way:
netušíte co způsobuje, že se PHP kod neprovede, ale browser jen zobrazí zdroják?...apache jede, jine php ze stejneho adresare se provedou v poradku....? hmmmm
nemas nejaku blbu koncovku / prava ? (ked ti ine idu z adresara)

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #10 kdy: 13. 11. 2014, 15:29:47 »
Citace
nemas nejaku blbu koncovku / prava ? (ked ti ine idu z adresara)
*.php (uvnitr znacky <?php ...?>), prava stejna jako u jinych funkcnich
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Kit

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #11 kdy: 13. 11. 2014, 15:35:43 »
Začátečníci a amatéři by měli používat prepared statement, nasekají tak nejméně chyb.
Profesionál si napíše escapování tak, že funguje za všech okolností správně a ušetří tak roundrip na server.

Prepared statement použitý pouze jednou je pomalejší.

V knihovně PDO je defaultně nastaveno, že se escapuje obojí - prepared statements jsou pouze emulovány. Oba přístupy jsou tedy stejně rychlé, je tedy lepší používat prepared statements ve všech případech.

Pokud někdo chce mermomocí quotovat, PDO nabízí i instanční metodu quote(), která doplní i ty apostrofy kolem stringu.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #12 kdy: 13. 11. 2014, 15:41:48 »
problem byl ze se php kod neprovede z pristupu pres localhost, z venci ano
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

tommm

Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #13 kdy: 13. 11. 2014, 16:05:11 »
Pejsek a kocicka vari web? :D

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:PHP - proměná z formuláře jako hodnota selectu v sql dotazu
« Odpověď #14 kdy: 13. 11. 2014, 16:14:02 »
Pejsek a kocicka vari web? :D
Nejtrefnější komentář (zatím).

Je fakt, že ptát se na tohle furt dokola (resp. udělat z fora učebnici) je poněkud nestandardní... Lepší by bylo hodně testovat nebo hledat příklady na webu. Tyhle základy jsou na každym rohu. Teprve při problému vznést dotaz. Když nic jinýho, člověk se takhle něco naučí (hledat + používat to, co hledá).