Diskuze: file

PHP PHP file American English version English version

Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
načtení řádků ze souboru do proměnné přes file nakládá jak s posledním prázdným řádkem? Jelikož mi ho v několika případech bral, snižoval jsem rozpětí cyklu o 1. Někde mi teď ale místo vymazání prázdného řádku došlo i na vymazání plného řádku...
Děkuji.

 
Odpovědět 7.9.2013 15:10
Avatar
Snorlax
Redaktor
Avatar
Snorlax:

pokud si pamatuju taky jsem mýval problém s posledním řádkem (čtení souboru jsem nepoužíval hoodně dlouho, všchno jedu přes databázi). nejidálnější je aby poslední řádek nebyl prázdnej. ukaž tady nějakej kus zdrojáku a toho fileu u kterýho to blbne ať máme lepší představu co s tím je....

Nahoru Odpovědět 7.9.2013 15:24
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Co kdyby sis to vyzkoušel?

Když na konec souboru přidám 5 prázdných řádek, funkce file() mi načte všech 5.

Nevím, k čemu je dobré snižovat rozpětí cyklu o 1 a ani netuším, jak se to ve foreach dělá.

Nahoru Odpovědět 7.9.2013 15:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

Ten tvůj avatar je mýval? To jsem netušil.

Nahoru Odpovědět  -1 7.9.2013 15:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

:D nevim jestli to mám brát jako urážku nebo neznalost -_- :D

Nahoru Odpovědět 7.9.2013 15:34
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Jak jsem psal, také se mi počítal i prázdný poslední řádek. Ovšem někde:

case "goTo":

        $value = "[\"".$_GET["time"]."\",\"";

        $file = file("History\\".$_GET["file"]);

        $fileLineCount = count($file) - 1;

        $noFound = true;

        $index = 0;

        while($index < $fileLineCount)
        {
                if(strpos($file[$index], $value) === 0)
                {
                        $noFound = false;
                        break;
                }

                $index++;
        }

        if($noFound)
                die("alert('Nenalezeno!');");

        echo "olderButton.disabled=false;bufferStart=$index;rows=0;room.innerHTML=defaultValue;";

        $nextIndex = $index + 200;

        $length = $nextIndex < $fileLineCount ? $nextIndex : $fileLineCount + 1;

        while($index < $length)
        {
                echo "parseMessage('".substr($file[$index], 0, -1)."');";

                $index++;
        }

break;
$length = $nextIndex < $fileLineCount ? $nextIndex : $fileLineCount + 1;

Jak vidno musím tu jednotku zase připočíst. Tak nechápu, o co GO...

Editováno 7.9.2013 15:38
 
Nahoru Odpovědět 7.9.2013 15:37
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

Asi obojí :)

Nějak mi ten tvůj obrázek nepasoval s výrokem "pokud si pamatuju taky jsem mýval".

Nahoru Odpovědět  +1 7.9.2013 15:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

No nazdar.

  • K čemu tam máš ten $fileLineCount?
  • Co tam dělají zpětná lomítka?
  • Co ta bezpečnostní díra? Aby si návštěvník mohl pročítat tvé PHP skripty?
  • K čemu je die()? To už se přece nepoužívá
  • Konstanta "200" vypadá také podivně. Zřejmě nějaký nesmysl
  • Je nějaký důvod, proč ten skript nemáš na jednom krátkém řádku?
Nahoru Odpovědět 7.9.2013 15:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

Aby to bylo úplně jasné - mám historii chatu a v ní se pochybuji dopředu a dozadu (newer, older), na začátek a konec (start, end) a od určitého času. Buffer je všude 200 řádků. Takže vždy kontroluji, aby načtené řádky pasovaly na buffer 200 a současně, aby nedošlo k přetečení krajů... (index > 0, index < $fileLineCount)

 
Nahoru Odpovědět 7.9.2013 15:46
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

:D ikdyž to byl vtip na můj účet tak i přesto se směju jak magor v blázinci :D

Nahoru Odpovědět  +1 7.9.2013 15:47
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

No nazdar - chci tě vidět... :D

$fileLineCount tu je, abych pořád neusel tahat countem... Unescape je tu proto, abych mohl používat quote znaky... Díra tam není - na server nikdo nezná heslo a jméno... (Každý kdo zná heslo a jméno si může číst jakýkoliv script...) Neznám jiný příkaz, který zabije proces a přitom vypíše hlášku... Na jeden krátký řádek to opravdu nejde...

Editováno 7.9.2013 15:50
 
Nahoru Odpovědět 7.9.2013 15:49
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Tak tohle je husté, trvalo by mi hodiny vymyslet aby byl ten kód tak špatný. Přemýšlím jestli je na tom vůbec něco dobře.

Nahoru Odpovědět  +3 7.9.2013 15:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

pokud si dobře pamatuju zpětné lomítko dělá to že pokud mám nějakej znak kterej je v tom programovacím jazyku (třeba $ jako proměnná,) tak \ způsobí to že "nezareaguje" ale vypíše se malej přáklad:

$promena = "string";
echo "nyní si vypíšu proměnou \$promena"; //zobrazí se mi nyní si vypíšu proměnou $promena (ne její obsah)
Nahoru Odpovědět 7.9.2013 15:54
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

Jak už jsem psal - buď se předveďte, nebo sem nepište... Urážky mi moc nepomůžou... Vzhledem k tomu, že v této ukázce skoro nic není, tak nechápu, co na tom může být tak špatně...

 
Nahoru Odpovědět 7.9.2013 15:58
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Právě. Vůbec netušíme, co ten zmatečný kód vlastně má dělat. Pokud nám to prozradíš, tak ti možná poradíme.

A ten count() je tak k čemu?

Editováno 7.9.2013 16:03
Nahoru Odpovědět 7.9.2013 16:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ke zjištění počtu řádků? Chci vypsat buffer 200 řádků od určitého času... Pokud nebude možné buffer naplnit, tak ať... (proto count)

 
Nahoru Odpovědět 7.9.2013 16:05
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

To vím. matesax těch zpětných lomítek má na můj vkus až příliš mnoho. Zejména v cestě by vůbec neměla být.

Nahoru Odpovědět  +1 7.9.2013 16:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na matesax
Snorlax:

a nebylo by jednoduší to prostě udělat přes databázi? (pokud teda bobře chápu že děláš chat)

Nahoru Odpovědět 7.9.2013 16:07
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
matesax
Redaktor
Avatar
Odpovídá na Snorlax
matesax:

Historie je holý text - není důvod proč použít DB... (Ukládám skutečně jen text - ne autory, nic...)

 
Nahoru Odpovědět 7.9.2013 16:10
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Snorlax
Snorlax:

už vidim jak se mě Kit teptá jestli jsem i bobr :D

Nahoru Odpovědět  +1 7.9.2013 16:10
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

matesax zřejmě netuší, jak se databáze používají :)

Nahoru Odpovědět  +1 7.9.2013 16:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na matesax
Snorlax:

a proč to tak děláš? ty nechceš vedět co kdo napsal? pokud máš v plánu lidem "ukazovat" historii tak vypíšu jen ten jednen sloupec...

Nahoru Odpovědět 7.9.2013 16:12
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Historie je holý text - to je ten pravý důvod, proč použít DB.

Nahoru Odpovědět  +1 7.9.2013 16:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Snorlax
matesax:

Ten text je JSON - je v něm vše důležité... Nač budu v DB zakládat tabulku s jediným polem pro text? (bude to jedna tabulka s jedním sloupcem, s jedním řádkem - fakt k užitku...)

 
Nahoru Odpovědět 7.9.2013 16:14
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na matesax
Jiří Gracík:

i kdyby ten text byl třeba chlupatý, tak i tak se to dá uložit do databáze :D

Nahoru Odpovědět 7.9.2013 16:14
Creating websites is awesome till you see the result in another browser ...
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na matesax
Snorlax:

a co chceš ukládat do databází? obrázky? videa? :D

Nahoru Odpovědět 7.9.2013 16:15
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
matesax
Redaktor
Avatar
Odpovídá na Snorlax
matesax:

Jak jsem psal - nač ukládat jediný řádek do DB? Nejen, že budu parsovat nové řádky, ale ještě to tahat z DB - děkuji...

ukládat chci hesla, jména uživatelů, jména dd, produkty, hashe,... Ale jeden řádek s jednou hodnotou s x řádky fakt ne...

Editováno 7.9.2013 16:18
 
Nahoru Odpovědět 7.9.2013 16:17
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Takových DB tabulek mám hromadu. A fakt: Jsou mi k užitku.

Jen se raději vyhýbám 0NF. Nebyla by to zrovna nejlepší vizitka.

Nahoru Odpovědět 7.9.2013 16:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Pavel Mareš
Redaktor
Avatar
Pavel Mareš:

Nic proti, ale ve škole jsem používal kratší zdroj a lépe napsaný a to jsem vypisoval více věcí než jen jeden sloupec z txt. Ale opravdu je lepší použít db, je to přehlednější a vypsat co kdo napsal je hned a ne na týden. Ale ok.

Nahoru Odpovědět 7.9.2013 16:19
Nechci být workoholik. Bohužel někdy musíme být tím, čím nechceme.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na matesax
Snorlax:

tak pořád lepší jednosloupcová tabulka, než takovejhle zdroj (a k tomu nefunkční...)

Nahoru Odpovědět 7.9.2013 16:20
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Tahání dat z DB je rychlejší než otevírání souboru.

A to parsování tam děláš kvůli čemu?

Editováno 7.9.2013 16:21
Nahoru Odpovědět 7.9.2013 16:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Snorlax
matesax:

Funguje mi to dokonale, rychle atd. Jen jsem chtěl vědět, proč tam hapruje poslední prázdný řádek. Načež jste mi sdělili, jak je ten kód špatný. Nikdo ho ale neudělal lépe... A jsem zvědavý jak, když jen čte řádky souboru...

Editováno 7.9.2013 16:22
 
Nahoru Odpovědět 7.9.2013 16:22
Avatar
matesax
Redaktor
Avatar
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Nebylo by jednodušší načíst jen posledních 200 řádek?

Nahoru Odpovědět 7.9.2013 16:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

JSON se na příkazový zásobník moc nehodí.

Nahoru Odpovědět 7.9.2013 16:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

To je end. Například pro akci join. (to chat) Ale pro procházení historie to fakt nestačí. A protože je ve formátu JSON + escape, těžko mohu lidi jen odkázat na onen soubor. Navíc buffer má svůj důvod - aby se na to nečekalo x let a aby to ta stránka vůbec zvládla...

 
Nahoru Odpovědět 7.9.2013 16:28
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

JSON není na žádný zásobník - JSON je pro uchování pole JS... (V poli je jméno, datum,...) Příkazy jsou prováděné ihned...

 
Nahoru Odpovědět 7.9.2013 16:28
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Kde tam máš v aplikaci použité pole?

Nahoru Odpovědět 7.9.2013 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:

Protože si ten JSON posílám přes sockety... (Takže nehodlám parsovat string do ddd formátů - v JS vznikne JS source, přepošlu jeho část, na serveru vznikne JSON a pošle se všem + se přidá do zásobníku - v Timeru se pak uloží...)

 
Nahoru Odpovědět  -1 7.9.2013 16:32
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:
$value = "[\"".$_GET["time"]."\",\"";

["00:00",

Je začátek pole - za ním je barva, nick a zpráva... (["00:00", "black", "Sam", "escape"])

 
Nahoru Odpovědět 7.9.2013 16:33
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na matesax
Jiří Gracík:

Po velice dlouhém zamyšlení mi to stále nepřijde na řádek databáze s jedním sloupcem.

Nahoru Odpovědět  +1 7.9.2013 16:35
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Také vidím minimálně 4 sloupce.

Nahoru Odpovědět 7.9.2013 16:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Řekl mu někdo, že v databázi může být více sloupců?

Nahoru Odpovědět 7.9.2013 16:39
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Pochybuji. Myslíš si, že tuší o tom, že tabulka může mít i víc řádek?

Nahoru Odpovědět 7.9.2013 16:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Já bych z toho nedělal velkou revoluci, na tohle ještě svět není připraven.

Nahoru Odpovědět 7.9.2013 16:44
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Také marně přemýšlím, k čemu je tam ta barva. Dávat styly pro zobrazování do datového modelu - to chce vážně pořádný kus odvahy.

Nahoru Odpovědět  +1 7.9.2013 16:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Té je tu dost, to problém nebude :)

Nahoru Odpovědět  +1 7.9.2013 16:50
Creating websites is awesome till you see the result in another browser ...
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Však ty určitě jednou socket zprávou pošleš zvlášť barvu nicku a nick - já ne...

Mimochodem useři již v DB jsou a mají hned několik tabulek - natož sloupců...

Editováno 7.9.2013 16:57
 
Nahoru Odpovědět 7.9.2013 16:56
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A mají ti tví useři v DB i barvu?

Nahoru Odpovědět 7.9.2013 17:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ne - není to má DB. Je to DB týmu - já pro tým udělal jen chat a pár dalších věcí. A z JSON socket z právy to je do DB, ve které se ani omylem neorientuji sakra daleko... (Takhle jsou data pěkně konzistentí, v požadovaném tvaru atd. Abych je separoval do sloupců atd., a pak zse vyzobával - ne děkuji...)

 
Nahoru Odpovědět 7.9.2013 17:02
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na matesax
Snorlax:

stejně si myslím že bys to měl dělat přes DB. vždyť je to i bezpečnější. pokud by někdo zjistil kde ten soubor je mohl by si to číst i někdo neoprávněnej.... to u db těžko....

Nahoru Odpovědět 7.9.2013 18:17
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Rád ti vysvětlím co je špatně.

case "goTo":

GoTo je velmi špatně zvolený název návěstí, pokud se v návěstí parsuje, mělo by se jmenovat asi jinak, ne? Vkládat tak dlouhý kód do větve switche je blbost, měla by se tam volat metoda. Pomocí reflexe můžeš dát ten switch tam, kam patří - pryč.

$value = "[\"".$_GET["time"]."\",\"";

Co jsou ta lomítka? Co třeba otevřít jednoduché uvozovky místo dvojitých?

$file = file("History\\".$_GET["file"]);

To jako vážně? Necháš si zpracovat libovolný soubor co uživatel zadá? Asi chceš, aby ti to někdo hacknul.

$noFound = true;

To je názvosloví a navíc k ošetření chyb jsou výjimky.

$index = 0;

while($index < $fileLineCount)
{
        if(strpos($file[$index], $value) === 0)
        {
                $noFound = false;
                break;
        }

        $index++;
}

Tohle bych nahradil jednou řádkou:

$array = explode("\n", file_get_contents('file.txt'));

a potom hledal hodnotu v tom poli.

if($noFound)
        die("alert('Nenalezeno!');");

Tady jsem málem spadl pod stůl, smrtící kombinace :D die alert je opravda skvělý způsob pro zpracování chyby s kombinací s proměnnou noFound (ano, je to ironie).

Ten zbylý bordel jsem ani nepochopil.

Editováno 7.9.2013 18:40
Nahoru Odpovědět  +1 7.9.2013 18:22
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
matesax:

Tu URL nikdo nikdy neuvidí. To souvisí s tím pojmenováním - nebude takto lidské, ale takové, aby si tu URL nikdo nemohl ani tipnout... Navíc je uvnitř AJAXu obfuscovaného JS... Dále explode("\n", file_get_conten­ts('file.txt')) - a co asi udělá file??? (s mnohem kratším kódem) Jaká výjimka mi vznikne? Musel bych ji udělat, jenže nemám pod kontrolou interpreter - takže stejně bych to nechytal tam, kde mám. Stejně se nezbavím větvení - výjimku bych musel vytvářet - to věc moc nezachraňuje... Prostě hledáš jen kraviny...

Ale nejvtipnější na tvém komentu je, že jsi nahradil část kódu jen jeho částí - a napsal jsi, že ať se zbytek udělá... :) :)

explode("\n", file_get_contents('file.txt')) == file("file.txt")

A pod tím bude zbytek mého kódu... :D

Editováno 7.9.2013 19:09
 
Nahoru Odpovědět 7.9.2013 19:07
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

A máme zde oblíbené téma Security through obscurity. To jsem zvědav, kdy z toho vyrosteš.

Ty tvé další obskurity jsem dál už nezkoumal. Obvykle mi stačí, když někdo použije boolean tam, kde není potřeba vůbec nic...

Nahoru Odpovědět  +1 7.9.2013 19:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 54 zpráv z 54.