Autor Zpráva
peter_r
Profil
ahojte, viem že je to primitívna otázka, a určite si poviete že sú to základy, ale som absolútny amatér, o php a databázy sa len otieram, ale dúfam že sa niekto nájde, čo mi helfne

mám menu:

<a href="firma_1.php">Firma 1</a><br>
<a href="firma_2.php">Firma 2</a><br>
<a href="firma_3.php">Firma 3</a><br>

a po kliknutí mi má vytiahnuť z tabuľky vyrobky všetky položky, ktoré majú v stĺpci firma text napr. firma 1
Asi by som to mal urobiť nejako takto

SELECT *
FROM vyrobky WHERE firma LIKE ?

ale v menu asi musím nejako zadefinovať, čo má hľadať

čiže skúšal som dať

<a href="firma_1.php" name="firma 1" >Firma 1</a>

ale potom neviem čo dať v selecte

doteraz som to mal urobené tak, že na každú firmu mám vytvorený súbor zoznam_firma1.php a v ňom je

SELECT *
FROM vyrobky WHERE firma="firma 1"

lenže tých firiem mi pribúda a na každú firmu mať samostaný súbor je už veľa

Ďakujem
blaaablaaa
Profil
peter_r:
Řeší se to většinou nějak takto:
V odkazu budeš mít firma.php?id=1

Soubor firma.php pak bude měnit svůj obsah podle proměnné $_GET['id']

A dotaz do db pak může vypadat takto:
$query = 'SELECT * FROM vyrobky WHERE firma='.(int)$_GET['id']; //pripadne nejaka databazova vrstva, ktera vyresi ochranu proti sql injection za tebe
Keeehi
Profil
<a href="firma.php?jmeno=firma_1">Firma 1</a>
<a href="firma.php?jmeno=firma_2">Firma 2</a>

if (isset($_GET["jmeno"]) {
    $condition = ' WHERE firma="'.$mysqli->real_escape_string($_GET["jmeno"]).'"'
} else {
    $condition = "";
}

$result = $mysqli->query('SELECT * FROM vyrobky' . $condition);
peter_r
Profil
ďakujem vám, vyskúšam obidva, potom dám vedieť, aspoň sa zase niečomu podučím
blaaablaaa
Profil
peter_r:
Oba jsou obdobné - já předávám id jako číslo, Keeehi jako string (zachovává současnou podobu db).
Keeehiho verze navíc počítá s absencí parametru jmeno, v tu chvíli zobrazí výrobky všech firem.
peter_r
Profil
cez ID to robiť nemôžem, lebo pri v tabuľke v stĺpci firma už mám textové názvy firiem, musel by som to prerobiť

skúšam tú Keeehiho verziu ale nedarí sa mi tam zakomponovať tú podmienku

mám to tam takto:

$vysledok = Db::queryAll('
            SELECT *
            FROM vyrobky WHERE firma="firma1"');



podarilo sa mi to dať bez podmienky a už to funguje, ďakujem


$vysledok = Db::queryAll('
            SELECT *
            FROM vyrobky WHERE firma="'.($_GET["menof"]).'");
Serg
Profil
peter_r:
$vysledok = Db::queryAll('
            SELECT *
            FROM vyrobky WHERE firma="'.($_GET["menof"]).'");

Pozor na SQL injection. To proto blaaablaaa použil přetypování na int a Keeehi real_escape_string().

Sice mě zrovna nenapadá jaký konkrtně útok by se dal použít, protože klasické vypsání všech záznamů přidáním starého známého " OR 1 = 1 by asi žádnému útočníkovi užitečné moc nebylo. Možná by mohlo být trochu nebezpečné kdyby na tom místě použil EXISTS a subquery, nějak tam propašoval LOAD INTO OUTFILE pokud to bude povolené, nebo UNION ALL. Každopádně myslet na zabezpečení je dobré už od začátku, i když s programováním třeba jen začínáš.
Jakub J._
Profil *
Reaguji na peter_ra a Serga:
Stačí navštívit odkaz firma.php?menof=%22%3B%20DELETE%20FROM%20vyrobky%3B%20-- a rázem je celá tabulka výrobků smazaná.
Kajman
Profil
Serg:
Ano, správný union dokáže vytáhnout data i z jiných tabulek.

peter_r:
Podívejte se na bindování proměnných v databázové vrstvě, kterou používáte.
Keeehi
Profil
Serg:
Co by se v tomto případě dalo použít je určitě to UNION ALL.
firma.php?menof=" UNION ALL SELECT username, password FROM users -- -
- toto je samozřejmě jen příklad, útočník samozřejmě muí nejdříva najít jak se jmenuje tabulka a sloupečky, kolik je sloupečků v tabulce vyrobky a podobně. Ale všechny tyhle informace se dají skrz union vytáhnout.

Jakub J.:
Spíš ne. I když je možnost jak spustit více dotazů z jednoho stringu které tam jsou oddělené středníkem, tak většinou to tak nefunguje.
Serg
Profil
Ta Db třída vypadá že je z článku o databázi v php z itnetworks, jestli to tak opravdu je, tak by stačilo napsat:
$menof = $_GET["menof"];
$vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ?', $menof);

Použije se "prepared statement" a ten řetězec se databázi předá jako parametr, takže ta už bude vědět že to nemá zpracovávat jako část dotazu a nebude to tedy nebezpečné.
peter_r
Profil
ďakujem, viem že treba dbať na bezpečnosť, ale toto mám na vnútropodnikovej sieti a tu vedia ledva ovláda prácu s pc :)

ešte tam potrebujem zoradiť výsledky podľa abecedy a stále mi vyhadzuje chybu, čo tam mám zle?

$menof = $_GET["menof"];
$vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ?', $menof '
            ORDER BY nazov');
blaaablaaa
Profil
queryAll nejspíš očekává jako první parametr string s dotazem a pak n parametrů, kde n = počet neznámých v dotazu :)

$vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ? ORDER BY nazov', $menof);
Keeehi
Profil
peter_r:
toto mám na vnútropodnikovej sieti a tu vedia ledva ovláda prácu s pc :)
Jasně, a do vnitropodnikové sítě se nikdy žádný útočník dostat nemůže, že? Na tomhle ztroskotalo už spousta firem.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0