Starší komentáře ke článku: Listování v tabulce pomocí skriptu PHP

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Roman Sofr

Datum vložení: 12.3.2002 18:06:55

<I>$vysledek_celk = Mysql_query("SELECT id FROM jmeno_tabulky");</I>
Pokud ma dotaz co nejmene zatizit databazi pak je dobre pouzit misto tohoto zpusobu dotaz "SELECT Count(*) FROM jmeno_tabulky", s kodem jaky je v clanku by se s rostouci databazi zbytecne prenaseli/ukladali data a zatezovalo by to vice server.

Dale pouziti promenne $zaznam, kterou predavame jako parametr v SQL dotazu aniz bysme ji predtim otestovali na pritomnost alespon mezery je prinejmensim riskantni. Mozna by stalo za to dat pred to nejakej ERegI s vyctem znaku jako mezery a uvozovky kterej by v pripade vyskytu SQL dotaz neprovadel.

Jinak toto tema bych spise ocekaval jako soucast jineho clanku ...

Avatar

Autor komentáře: Ondra Marek

Datum vložení: 12.3.2002 23:06:07

Dobry den,
s tim SELECT COUNT(*) ... mate pravdu, takhle se to da vyresit lepe.
Pokud se tyka osetreni promenne $zaznam, predpokladam, ze ji skript ziska z elementu formulare SELECT (jak je v clanku i uvedeno), kde si samozrejme navolim pevne hodnoty jednotlivych OPTION, ktere potom predavam v dotazu SQL databazi. Od uzivatele potom zadani nebezpecnych znaku nehrozi.
Tematika listovani tabulkou pomoci PHP je spise takova tresnicka (ne vsak neuzitecna), bohuzel pomerne narocna a obsahla na vysvetlovani, proto o ni pojednavam v samostatnem clanku.
S pozdravem
Ondra Marek

Avatar

Autor komentáře: Pepa Kokes

Datum vložení: 13.3.2002 6:55:21

"Pokud se tyka osetreni promenne $zaznam, predpokladam, ze ji skript ziska z elementu formulare SELECT (jak je v clanku i uvedeno), kde si samozrejme navolim pevne hodnoty jednotlivych OPTION, ktere potom predavam v dotazu SQL databazi. Od uzivatele potom zadani nebezpecnych znaku nehrozi."

Ale no tak, takhle se pristupuje k bezpecnosti? Uzivatel prece uplne klidne muze zadat tu promennou jako GET parametr, kdyz uz nebude chtit spustit Telnet a pozadat si o to rucne. Pritom by stacilo doplnit neco ve stylu:

$zaznam = (int) $zaznam;

Avatar

Autor komentáře: Ondra Marek

Datum vložení: 13.3.2002 8:27:41

Nebo je mozne pouzit funkci addslashes...
Pokud uzivatel bude umyslne jako parametr pro promennou $zaznam zadavat vlastni znaky, samozrejme tim riskuje, ze mu skript fungovat nebude. Neresil jsem ani odstineni uzivatele od poruch v komunikaci s databazi. Aby clanek nenabyl obludnych rozmeru, soustredil jsem se vylucne na popis principu listovani v tabulce.
Tematice bezpecnosti skriptu PHP v komunikaci s databazi se snad venuji nejake konkretne zamerene clanky na Intervalu, pokud ne, zkuste treba nejaky napsat Vy.
S pozdravem
Ondra Marek


Avatar

Autor komentáře: JSuchy

Datum vložení: 17.3.2002 22:18:15

toto je typicky argument autoru clanku na intervalu. to ale prece neni pravda. tyto skripty z 99% procent vyuzivaji uzivatele, kteri o bezpecnosti nemaji ani zdani a nikdy je nenapadne (ani to neumeji) osetrit si takove chyby. osetreni dulezitych chyb je stabni kultura a melo by to tak byt.


nemate pravdu, ze staci pouzit jen addslashes. v nekterych pripadech se da udelat neco jako $HTTP_GET_VARS["id"] = "1 OR ...". to plati v pripade int promennych, ktere nekteri lide zapominaji dat do '', stringy v nich uz byt musi.
mela by se pouzit nejaka funkce jako:
function sanitize($input)
{
$output = (int) $input;
if ($input != $output) {
return false;
}
return true;
}
zkracene tusim return ($input != (int) $output ? true : false);

Avatar

Autor komentáře: Ondra Marek

Datum vložení: 18.3.2002 8:57:02

Zdravim Vas,
ale to se opravdu jedna o pomerne slozitou a komplexni problematiku - pokud chcete jit jeste za pouziti funkce addslashes(). Odkazal bych Vas napr. na <a href='http://www.php.net/manual/en/security.registerglobals.php' target='_blank'>http://www.php.net/manual/en/security.registerglobals.php</a>, kde je popsana prace s php pri vypnuti direktivy register globals. Mimochodem, od Php verze 4.1.0 se misto $HTTP_Get_Vars doporucuje pouzivat $_Get, ktera ma tu samou funkci, avsak je autoglobalni.
Znovu opakuji, myslim si, ze tato problematika by vystacila na samostatny clanek, ktery bych osobne na Intervalu velice uvital.

Avatar

Autor komentáře: JSuchy

Datum vložení: 18.3.2002 14:34:27

nechapu Vase odkazovani na praci s globals vars. ja ji chapu, vy pravdepodobne take. $HTTP_GET_VARS["id"] jsem chtel naznacit, ze jde o promennou ziskanou z url

pokud by mel interval.cz o temto clanek zajem, myslim, ze se muzeme domluvit na nejake spolupraci / vytvoreni skupiny, ktera by sepsala nejdulezitejsi problemy a pote je popsala

Avatar

Autor komentáře: Michal R

Datum vložení: 24.3.2002 9:44:12

No, je sice hezké, jak tady debatujete o bezpečnosti avšak já, jako zelenáč, tedy skoro zelenáč, jsem to ani nerozchodil, natož abych uvažoval o bezbečnostních problémech. Možná kdyby mi někdo mohl poslat ten kód, slepený dohromady, byl bych mu VELICE VDĚČEN.
Děkuji, Michal R

P.S. Omlouvám se za případné gramatické chyby.

Avatar

Autor komentáře: Luccas Dulka

Datum vložení: 16.7.2002 12:56:49

no tak celej ten script sem nejak pochopil listovat v tabulce bych teda zvladnul ale asi mi nebo nekomu co psal tenhle clanek jedna vec trsku usla a listovat muzu ale nic se mi nezobrazi zkousel sem tam dat while($print = mysql_fetch_array($vysledek)): ale nefunguje to nechapu proc takze ten script je pak k nicemu gdyz listuju v nicem please help

Avatar

Autor komentáře: Ondra Marek

Datum vložení: 17.7.2002 17:51:11

nekde jste musel udelat chybu, skript je overeny a funguje - poslete mi prip. Vas skript i s dumpingem dtb, zkusim Vam poradit

Avatar

Autor komentáře: Tonic

Datum vložení: 24.9.2006 13:01:52

Dobry den, ten skript se mi libi, po nejake dobe maturovani sem rozchodil aspon vypisovani radku bez chyb. Muj problem spociva v tom , ze skript spocita kolik bude stranek a pod nej mi vypise cely Mysql dotaz, v mem pripade tedy cca 730 zaznamu, bez toho aniz by je limitoval po 30ks. Nasledne odkazy na dalsi stranky jsou nefunkcni , dokazete mi prosim poradit? Mnohokrate diky.

Avatar

Autor komentáře: Mira Javora

Datum vložení: 10.5.2003 18:54:34

Stránkování funguje bez problémů, ale nezobrazuje se mi nic, krom odkazů na jednotlivé stránky. Nemůžu přijít na způsob, aby se mi zobrazovala data z jiných sloupců tabulky společně se stránkováním. Předem děkuji za pomoc

Avatar

Autor komentáře: Crocodiler

Datum vložení: 10.7.2005 11:27:51

Prosim nemohli by ste zprovoznit odkaz pro stažení skriptu? předem děkuju :-)

Avatar

Autor komentáře: Vilém Málek

Datum vložení: 10.7.2005 22:14:40

Děkuji za upozornění, došlo k malé chybičce ve skriptech. Vše je již napraveno ;-)

Avatar

Autor komentáře: KTP

Datum vložení: 25.9.2007 14:43:51

Funguje ako tak len ze zobrati císla a akože refreshne stranku ale vsetky zaznami v tabulke su na kazdej stranke ci ich dam ikazovat po 10 alebo po 5 stale ich tam mam vsetky t.j. u mna 20

Avatar

Autor komentáře: KTP

Datum vložení: 25.9.2007 14:48:46

To znamena ze pre normalneho pouzivatela ktory nema skusenosti s programovanim scriptov je tento vas clanok sice pekny a chudakom zaberie kopec casu kym pridu na to ze to jednoducho asi nepojde a este ich aj navnadi ze budu mat na svoju stranku mozno nieco super. A tu sa mozno niekto raduje ako niekomu ubral zbytocne cas, ze? Autor by sa mal zamysliet nad sebou, ze ked uz nieco chcem uverejnit a akoze je to funkcne tak by to aj v takom stave malo byt. V kazdom pripade je tam vela bla, bla, bla a nic z toho.

Avatar

Autor komentáře: kuba

Datum vložení: 22.10.2007 11:46:15

po uprave s class.mysql.php /* připojím se k databázi */ $zaznam= $_GET[zaznam]; $c_listu= $_GET[c_listu]; $pocet=5;//po kolika stranach posunovat if (!IsSet($zaznam)) $zaznam = 0; if (!IsSet($c_listu)) $c_listu = 1; /* inicializace proměnných $zaznam a $c_listu */ ////////$vysledek_celk = mysql_query("SELECT id FROM clanky"); $povel = 'SELECT COUNT(id) FROM clanky'; $sql -> query("rowws", $povel); IF ($rowws = $sql->fetch_assoc("rowws")) { $vysledek_celk = $rowws["COUNT(name)"]; } $sql-> free_result('rowws'); /* do proměnné $vysledek_celk uloľím daný dotaz na databázi mySQL neobsahující omezující příkaz LIMIT. Za jméno pole dosadím pokud moľno pole tabulky obsahující index, aby dotaz co nejméně zatíľil databázi. Dotaz mohu obohatit i daląími kritérii, např. WHERE $podminka nebo ORDER BY $seskupit, potřebné proměnné mohu získat opět z formuláře definice dotazu */ //$vysledek = mysql_query("SELECT * FROM clanky LIMIT $zaznam, $pocet"); $povel ='SELECT id,nadpis,hlava FROM clanky WHERE view="1" LIMIT '.$zaznam.', '.$pocet; $sql -> query("rowws", $povel); WHILE ($rowws = $sql->fetch_assoc("rowws")) { echo '<h2><a href=index.php?k=1&zaznam='.$zaznam.'&c_listu='.$c_list.'&detail='.$rowws[id].'>'.$rowws[nadpis].'</h2>
'.$rowws[hlava].'</a>

'; } $sql-> free_result('rowws'); /* do proměnné $vysledek uloľím daný dotaz na databázi mySQL obsahující navíc omezující příkaz LIMIT. */ //query_result('SELECT COUNT(id) FROM kniha') ///$pocet_listu = mysql_num_rows($vysledek_celk)/$pocet; $pocet_listu =$vysledek_celk/$pocet; $pocet_vysl=Ceil($pocet_listu);

Zpět na článek | Úvodní stránka Interval.cz