Test znalosti konfiguračních direktiv PHP

Školení, která pořádám

Pokud vyvíjíme aplikaci provozovanou na vlastním hostingu, můžeme si dovolit spoléhat na nastavení určitých konfiguračních direktiv – ty si totiž buď můžeme sami určit nebo se na jejich pevnou hodnotu můžeme alespoň spolehnout. Pokud ale vytváříme aplikaci, která má být provozovatelná kdekoliv, je nutné při programování nastavení těchto direktiv zohledňovat. Víte, na co si dát při psaní přenositelného kódu pozor?

  1. Ve stejném adresáři jako právě spuštěný skript je soubor connect.inc.php. Co je špatného na kódu include "connect.inc.php" a jak ho opravit?
  2. Co je špatného na kódu if (isset($_GET["search"])) echo htmlspecialchars($_GET["search"])?
  3. Za jakých okolností nebude fungovat kód fopen("http://www.example.com/favicon.ico", "r") a čím se dá nahradit?
  4. Na co může doplatit kód header("Content-Type: image/png"); echo file_get_contents("obrazek.png")?
  5. Jaké je riziko následujícího kódu?
    <?php
    if (isset($_POST["nazev"]) && isset($_GET["id"])) {
        $nazev = (get_magic_quotes_gpc() ? $_POST["nazev"] : addslashes($_POST["nazev"]));
        mysql_query("UPDATE tabulka SET nazev = '$nazev' WHERE id = " . intval($_GET["id"]));
    }
    ?>
    
  6. Jaký je nejlepší způsob uzavírání PHP kódu a proč?
    1. <% %>
    2. <? ?>
    3. <?php ?>
    4. <script language="php"> </script>
  7. Co by měl udělat skript před tím, než začne vypisovat jakýkoliv text?
  8. Co může způsobit kód echo "Vítejte"; session_start()?
  9. Na co může doplatit kód if (isset($HTTP_GET_VARS["id"])) { }?
  10. Proč kód echo $PHP_SELF nejspíš nic nevypíše?
  11. Co na URL hledat.php?jmeno=Franta vypíše kód echo $_REQUEST["jmeno"], pokud bylo na předchozí stránce zavolané setcookie("jmeno", "Pepa")?
  12. Jaký je nedostatek hlášky Maximální velikost souboru je <?php echo ini_get("upload_max_filesize"); ?> B?
  13. Na co spoléhá následující kód?
    <?php
    $row = mysql_fetch_assoc(mysql_query("SELECT jmeno FROM uvizvatele"));
    if ($row) {
        $jmeno = $row[jmeno];
    }
    ?>
    
  14. Proč nejspíš nebude fungovat, když na samém začátku skriptu provedeme $_SESSION["navsteva"] = (isset($_SESSION["navsteva"]) ? $_SESSION["navsteva"] + 1 : 1);?
  15. Jak musíme upravit kód header("Location: http://$_SERVER[SERVER_NAME]/hotovo.php"), pokud používáme session proměnné a chceme podporovat i uživatele bez cookies?
  16. Může následující kód za nějakých podmínek skončit chybou, pokud existuje tabulka tabulka?
    <?php
    $result = mysql_query("SELECT * FROM tabulka");
    while ($row = mysql_fetch_assoc($result)) {
        // zpracování
    }
    ?>
    
  17. Uživatel pomocí formuláře odešle obrázek, který testujeme kódem getimagesize($_FILES["obrazek"]["tmp_name"]). Za jakých okolností se to nemusí povést a jak to napravit?
  18. Co je špatného na heredoc syntaxi?
  19. Jak se dá z PHP poslat e-mail obsahující na prvním řádku Ahoj! a na druhém Povedlo se to?

Test považuji za poměrně složitý, nicméně pro psaní přenositelných aplikací je správné zodpovězení většiny otázek v podstatě nezbytné.

Jakub Vrána, Výuka, 13.6.2007, diskuse: 47 (nové: 0)

Diskuse

ikona finc:

No vsechno nevim, ale neco zkusim :)
1. Presunout connect.inc.php do adresare, kam nebudu miti primy pristup jako ke spustitelnemu souboru.
2. Pouzit urldecode, jedna se o parametr z URL
3. Pokud bych sel pres proxy? Pouzit fsockopen
4. U png jsem mel problemy s prusvitnosti, zejmena v IE, mam pocit, ze je to jeden z problemu pri posilani hlavicek PNG
5. Pro prevod do SQL pouzit mysql_real_escape_string, osobne tam nic nevidim :)
6. <?php ?>, za prve je to vychozi nastaveni, za druhe mam jistotu, ze se mi to nebude tlouct s nicim jinym. short_open_tags by mela byt vzdy off
7. Miti hlavicky, o co se vlastne jedna
8. vyhodit warning, session_start() by mel byt vzdy na zacatku, plus to, ze se da i nastavit automaticke zapinani sessions, pak by to vedlo k chybe
9. nevim, $HTTP_GET_VARS je nedoporucovany zpusob + to, ze isset mi neprijde jako dobra kontrola, radeji pouziji is_null, !empty, atd.
10. Protoze ji nemam nikde jako promennou definovanu. Pokud bych mel zapnute register_globals na on (striktne se nedoporucuje, duvody jsou znamy), tak by vypsal asi tolik co $_SERVER["PHP_SELF"]
11. Mam pocit, ze Franta, i kdyz $_REQUEST by se pouzivat nemel, protoze to vede k chybam a zmatku. Prohledava $_GET, $_POST, $_SESSION, a i to zminene cookie
12. Nevim, jak velky soubor jsem nahraval a take nevim, jak velky objem dat mohu poslat pres _POST
13. Presne nevim, ale jednalo se o nejakou starou , nepouzivanou direktivu, ktera umoznovala psat primo bez, oznaceni Stringu $pole[prvni_polozka] namisto $pole["prvni_polozka"]
14. Chybi session_start(), pokud tedy neni automaticky
15. Poslat UID Session v URL, pokud se tedy presouvam uplne do neznama :)
16. Napr, pokud nemam spojeni s DB :)
17. Pokud nemam zaplou podporu GD knihoven
18. Prijde mi to silene, nikdy me nenapada zpusob, proc to pouzit.. nevim
19. Samozrejme uvest spravne hlavicky. Nezapominat na spamassassin, kde bych mel odkontrolovat, zda mail nebude vyhodnocen jako spam a u samotneho textu poslat: Ahoj!\nPovedlo se to!

Tak, ted jsem alespon vystavil svoji blbost na obdiv :D
Spoustu veci jen tak hadam, takze bych asi nedopadl nejlepe, ze Jakube? :(

honza:

Ja sice spravne odpovedi nevim. Docela jsem koukal, ale u prvni otazky bych to sacoval, ze tam je nehezka relativni cesta. A je otazka jak je nastaveno include_path (ci nejak tak). Proto asi by bylo lepsi, aby tam bylo ./connect.inc.php

u druhe otazky, si myslim ze je problem v htmlspecialchars. Neni jasne jak je nastaveno, takze bud bude prekodovavat vsechno ve stringu nebo jenom html.

3] fopen nepojede, kdyz je zakazano otevirat vzdalene soubory.
4] to same co u jednicky. Problem s relativni cestou a nastavenim include_path
5]pokud slashuji musim i odslashovat, takze si mohu do stranek zatahnout xss kod. (doufam)

Ale ten test je docela nater a priznavam nakoukl jsem do manualu.

ikona Jakub Vrána OpenID:

4. include_path se vztahuje jenom k include a require (+ _once). S relativní cestou tedy v tomto případě problém není.
5. Ne. Dotaz "SELECT 'a\'b'" vrátí a'b, takže odslashování je nežádoucí.

Koukat do manuálu se u tohoto testu smí.

Ronnie:

1. předpokládám, že v souboru connect.inc.php jsou důležité informace, bez kterých by aplikace nemohla fungovat, proto místo include požít require? A ukrýt mimo root.

3. Na windows je třeba přidat příznak "b".

11. v php.ini je tuším direktiva, která umožňuje nastavit pořadí v jakám se budou superglobální pole zpracovávat.

13. Že existuje konstanta jmeno s hodnotou "jmeno"?:-)

Pěkný test, škoda, že jich není více...

ikona Jakub Vrána OpenID:

3. V tomto případě to zapotřebí není.

Zbytek správně.

ikona Techi:

Zběžně koukam, je to dobrý, když chceš z uchazečů o PHP vývojáře vybrat ty nejlepší :)

6. pouze "<?php" :)

16. Když je tabulka zamčená pro čtení? Nebo se přidá SQL klíčové slovo tabulka ;) a je třeba název tabulky vložit do `` uvozovek. Ano a taky může dojít k přerušení spojení k DB serveru, jak říká finc...

ikona dgx:

Myslim, že to je naprosto korektní SQL příkaz, pokud má člověk ve zvyku dělat stejný překlep dvakrát ;)

ikona Jakub Vrána OpenID:

6. Nejen.

ikona D1ce:

U 4. mě napadá, že může přetéct memory_limit. A pokud je umožněna další práce se souborem, zajistit atomicitu, abychom zajistili korektní výstup.

Ad. 3. Jinak bych rád věděl cože tedy bude pracovat všude, jestli vůbec. Páč fsockopen(), url wrappery(teď si nejsem jist jestli je využívá i fsockopen()) a CURL nemusí být všude přístupné.

ikona LLook:

Funkce, která si podle ini_get (allow_url_fopen a disable_functions) a podle function_exists zjistí, co může použít a to pak použije.

Fsockopen URL wrappery nepoužívá, vyžaduje IP adresu (případně doménové jméno) a číslo TCP portu.

ikona D1ce:

Je mi celkem jasné jak alternovat tyhle metody, ale jestli tomu dobře rozumím, tak v tomhle ohledu může konfigurace php přístup zcela odepřít.

ikona Jakub Vrána OpenID:

4. Vynikající postřehy.

Prog.:

toto by som na odpovedi pozmenil/upravil:

2)  chyba mi tam test get_magic_quotes_gpc()

11) $_REQUEST - nepouzivat, predsa viem, ci si posielam data cez G,P, alebo C, ...tak načo? -- hrozí to, že priorita jednotlivých premmenných sa dá zmeniť. (spolieham sa že dostanem post a niekto prepíše niečo v adresa za otáznik a je prúser)

12) Otázka bola myslená inak, ale odpoveď neviem. Možno hrozí že je hodnota v ini nastavená na 0 (nelimitované) a asi by to blbo vyzeralo, keby som to tak vypísal na stránku, ...ale to je len taký výstrel do tmy

13) skôr si myslím, že autor otázky sa s tými uvodzovkami sekol (alebo nie, bez uvodzoviek???), hroziť by mohlo, že požadovaný field tam nebude, ak by sa použilo "select * ..." ale, myslím, že k chybe by nemalo dôjsť, teda ak existujú: pripojenie k mysql, tabuľka aj stĺpec v nej. a samozrejme, tie uvodzovky by som tam jednoznačne dal.
Čo sa týka tých uvodzoviek, teraz ma napadlo, nemusia tam byť keby bolo niekde pred tým define('jmeno','jmeno'); ;-))

16) napadla ma ta ista odpoved -- ked chyba spojenie na db :-)

17) getimagesize GD nepouziva, takze tam problem nevidim, skor ide o overenie ci sa obrazok naozaj uploadol...

ikona Jakub Vrána OpenID:


2. Bravo.
11. Bravo.
12. Dobrý postřeh, ale otázka skutečně mířila jinam.
13. Bravo.
17. Správně. Ale ještě tam může být jeden problém.

ikona Jakub Vrána OpenID:


1. To by bylo vhodné z hlediska bezpečnosti, ne kvůli přenositelnosti.
2. Ne, PHP se o urldecodování stará samo.
3. S proxy to je dobrý postřeh, ale je tam ještě jeden problém.
4. Je to něco jiného, stejný problém by mohl mít i jakýkoliv jiný typ souboru.
5. U běžně používaných kódování pracuje addslashes s MySQL dobře, ale je pravda, že přenositelná aplikace by měla fungovat i s obskurními. Odpověď je v zásadě dobře, jenom jí chybí popis toho, v čem spočívá riziko.
6. Správná, byť neúplná odpověď.
7. Bingo! Ještě by se slušelo doplnit, jaké hlavičky by to měly být a co by mělo být jejich obsahem.
8. Správně, chybí jen popis toho, proč by měl být session_start() na začátku a za jakých okolností tam být nemusí. Při zapnutém auto_start by to k chybě nevedlo.
9. "nedoporučovaný" - ale může být někdy zdrojem problémů?
10. Bravo.
11. Obě části odpovědi jsou bohužel špatně.
12. To je ano, byť tam zase vstupuje do hry více věcí.
13. Správně, až na to, že to není direktiva a funguje to i v nejnovější verzi :-).
14. To bylo jednoduché...
15. Ano.
16. Jistě, to ale nesouvisí s přenositelností.
17. getimagesize GD nepotřebuje, pro zadání otázky by se dala použít i jiná funkce manipulující se soubory.
18. Podívej se na to z pohledu přenositelnosti.
19. To bohužel nestačí.

ikona dgx:

Parádní testík, z fleku by se dal používat jako příjímací filtr do zaměstnání. Kdo odpoví na všechno správně, určitě nedělá s PHP teprve prvním rokem.

honza:

to urcite ne a nez jde spat cte si manual phpka. Nektere veci je zbytecne si pamatovat, obzvlast kdyz ten clovek takove konstrukce nepouziva. Viz co se stane, pri pouziti REQUEST. Mlhave tusim, ale v zivote jsem ho nepouzil takze bych musel sahnout po manualu.

Ondrej Ivanic:

1. Ak je nastavena include_path tak sa moze includnut inu subor
oprava: include "./connect.inc.php"

2. Nevidim tu ziaden problem...

3. Moze to byt zakazane pomocou allow_url_fopen, ale tyka sa to len HTTP a FTP.
Dalo by sa to nahradit pomocou komunikacie cez sockety

4. neexistenciu suboru onbrazek.png

5. na miesto addslashes() je lepsie pouzit mysql_real_escape_string(), ale potom
treba odstranic slashes ak su pouzite magic_quotes

6. odpoved 3. Neda sa zakazat a je to maximalne portabilne

7. jedine co ma napada, je ze poslat vsetky potrebne headers. ale je mozne pouzit output buffering

8. Ak sa pouzivaju cookies je potrebne zavolat session_start pred vypisom textu.
Takto sa odoslu uz hlavicky a nebude mozne nastavit cookie pre session

9. Naplnenie $HTTP_GET_VARS sa da zakazat

10. od 4.3 je register_globals = Off

11. Pepa. $_REQUEST sa sklada z GET, POST a COOKIES a posledne vyhrava.

12. v php.ini je mozne uvdzat aj jednotky a teda sa da nastavit:
upload_max_filesize = "100M"

13. SQL standar nedefinuje poradie riadkov vo vysledku SELECT pokial
sa nepouzije ORDER BY a teda
$jmeno moze obsahovat vzdy nieco ine. Dalsi nedostatok je, ze ak nastane chyba
pri mysql_query $jmeno nebude vobec inicializovane

14. session data sa zapisuju na konci skriptu. moze vzniknut race. Posledny zapis zvitazi, ak sa predpoklada ze sa sessions zapisuju do suboru.

15. pridat SID

16. prekrocenie casoveho limitu pre beh skriptu, alebo memory limitu.

17. pouzil by som este: is_uploaded_file(). potom moze este zle skoncit upload: $_FILES['obrazek']['error']

18. hredoc syntax je zavisla na OS. ukoncenie musi byt na samostatnom riadku a musi tam byt ';' a musi nasledovat znak pre ukoncenie riadku podla daneho OS

19. osobne by som pouzil daku triedu na to urcenu, ale v mailoch sa dava len \n. takze body mailu by vyzeralo: "Ahoj! \rPovedlo se to?"

No, kto ma teda zamestna?

qwe:

17. může skončit i na open_basedir, které nemusí umožňovat přístup do upload_tmp_dir. Je potřeba si nejdříve obrázek někam přesunout (move_uploaded_file), pokud tedy vůbec byl uploadován (is_uploaded) a až pak použít getimagesize()

ikona tiso:

k bodu 11: poradie superglobálnych premenných sa dá nastaviť pomocou variables_order v php.ini

ikona Jakub Vrána OpenID:


1. Bravo.
2. A přesto tam je.
3. Bravo.
4. Nejen.
5. Správně. Proč je to potřeba?
6. Nejen.
7. Které jsou potřebné headers?
8. Bravo.
9. Bravo.
10. Bravo.
11. Ne nutně.
12. Dobrý postřeh, ale problém je ještě v něčem jiném, než v nehezkém zobrazení.
13. S různým pořadím to je dobrý postřeh, neinicializované $jmeno by nám dejme tomu nevadilo, ale je tam ještě jiný problém a přímo bije do očí.
14. PHP session soubory zamyká, takže by k tomuto problému dojít nemělo.
15. Bravo.
16. Nejen.
17. is_uploaded_file() je nadbytečné, v poli $_FILES jiné soubory být nemohou. 'error' je dobrý postřeh, ale může dojít ještě k jinému problému.
18. Bravo.
19. To by bohužel nestačilo.

Gratuluji, většina odpovědí byla skvělých. Zaměstnal bych tě hned (pokud nějakou práci skutečně sháníš, mohu tě doporučovat lidem, kteří po mě chtějí něco udělat - v tom případě mi pošli mail).

Ondrej Ivanic:

Tak skusim este raz:

> 2. A přesto tam je.
Yo, bordel okolo magic_quotes...

> 4. Nejen.
Tak,subor bud neexistuje, alebo nie su k nemu prava - na ine  uz asi nepridem

> 5. Správně. Proč je to potřeba?
mysql_real_eascape_string() escapuje vsetko co je potrebne escapovat v ranci danej connection. addslashes() riesi len ', ", \ a \x00.

> 6. Nejen.
v podstate, 3 (<?php ?>) a 4 (<script ...) moznost je vzdy k dispozicii.

> 7. Které jsou potřebné headers?
minimalne by tam mala byt informacia o znakovej sade - ine ma nenapada

> 11. Ne nutně.
Ano, bral som vychodzie nastavenie PHP t.j. variables_order = GPC

> 12. Dobrý postřeh, ale problém je ještě v něčem jiném,
> než v nehezkém zobrazení.
No, zase jedine co ma napada, je to ze moze byt nastavena nedostatocna hodnota na direktovach: max_post_size, memory_limit (obe min rovne upload_max_filesize), max_input_time (za tento cas sa musi subor preniest) a potom moze byt este zakazany upload suborov (file_uploads)

> 13. S různým pořadím to je dobrý postřeh, neinicializované
> $jmeno by nám dejme tomu nevadilo, ale je tam ještě jiný
> problém a přímo bije do očí.
Uz ho vidim, hladal som vacsie zaludnosti ako jmeno v $row[jmeno] :)

> 14. PHP session soubory zamyká, takže by k tomuto
> problému dojít nemělo.
Ano, ale to nepomoze, napr tento sled behu skriptov (Sx - start, Ex end):
S1 S2 E1 E2, ak bola pred S1 navsteva 10, potom po E2 bude 11 (spravne by malo byt 12)

> 16. Nejen.
Nuz, nic ine ako prekrocenie casoveho limitu pre beh skriptu, alebo memory limitu ma nenapada

> 17. is_uploaded_file() je nadbytečné, v poli $_FILES
> jiné soubory být nemohou. 'error' je dobrý postřeh,
> ale může dojít ještě k jinému problému.
Hm... Ked obrazok nebude rozpoznany GD kniznicou, tak ta funcia (getimagesize()) vrati false.

> 19. To by bohužel nestačilo.
Posielanie e-mailov bola vzdy moja slabost :) Nikdy som to neriesil a radsej som pouzilnieco hotove...

PS. na tento druhy pokus to bolo s obcastnou pomocou manualu a zbehnutia kusov kodu. Asi tak pri 1/3..1/4 z tychto odpovedy

ikona Jakub Vrána OpenID:

> S1 S2 E1 E2

Díky zamykání k tomuto sledu nikdy nedojde. S2 čeká na odemčení souboru, tedy na E1.

Ondrej Ivanic:

pravda, skutocne je tam exclusive lock. Neviem kde som zobral take presvedcenie... (ale asi to bolo z jedneho projektu kde sa pouzivalo vlastne session riesenie...)

RATMex B:

"Test považuji za poměrně složitý, ..."

Ale kdeže, priam naopak! Nakoľko u takmer každej otázky nie sú uvedené vstupné podmienky, požadované správanie, či výstup, alebo výsledok, je riešenie testu náramne jednoduché.

1.) (Zmysel otázky sa nezmení, ani ak by som ju napísal napr. takto: "V Austrálii žijú koaly. Co je špatného na kódu include "connect.inc.php" a jak ho opravit?") Odpoveď: Kód neprotirečí žiadnej požiadavke, takže nie je na ňom nič nesprávne a teda netreba ani nič opravovať.
2.) Odpoveď je podobná ako u 1.), aspoň už v otázke nie sú rozprávky.
3.) Kód bude fungovať vždy a zachová sa tak ako má. Dá sa nahradiť čímkoľvek, napr. kódom "echo 'a'", alebo  kódom "z9 yrf3h dncq" (vôbec nevadí, že je syntakticky nesprávny).
... atď

Ak by test vyzeral napr. takto:

Všetky otázky predpokladajú prostredie servera s bežiacimi službami, resp. deamon-mi Apache neurčenej verzie, PHP aspoň major verzie 4, MySQL aspoň major verzie 4, ktoré sú funkčné  a vzájomné prístupné. Pre žiadny z horeuvedených programov nie sú určené konkrétne nastavenia, pokiaľ nie je v zadaní uvedené inak. Predmetom otázky je implicitne prostredie PHP, resp. PHP skript.
1.) Práve bežiaci skript sa nachádza v adresári, pre ktorý je include súborov, sa v ňom nachádzajúcich, povolený a funkčný. Úlohou skriptu je zavolať include, ktorý sa aplikuje na súbor connect.inc.php z tohto adresára. Prečo výraz include "connect.inc.php" nespĺňa úlohu a ako sa musí opraviť, aby docielil požadované správanie?
... atď.,

to by už bola iná úroveň náročnosti.

ikona tiso:

Čo takto prečítať si nadpis a zamerať sa na to o čom test je pri odpovediach? Že funkčnosť kódu môže byť ovplyvnená nastavením? Takže všetko čo si napísal sa z toho dá domyslieť, nemusí sa to implicitne písať...

ikona Jakub Vrána OpenID:

Byl by z tebe myslím dobrý právník, práce se slovíčky ti jde dobře, jedné věci sis ale nevšiml :-). Smysl otázek je jasně daný úvodem, kde je napsáno, že nám jde o psaní přenositelných aplikací. Ty se chovají na všech konfiguracích stejně. Kód, který se na různých konfiguracích chová jinak, je špatný.

Když se kód chová různě, je špatný už jenom tím a co vlastně má nebo nemá dělat, je irelevantní.

RATMex B:

OK, takže keď napíšem kód, ktorý bude napr. syntakticky chybný, bude zároveň platiť, že sa na každom stroji sa zachovná rovnako (interpretátor vráti chybu) a čo robí, je irelevantné. Navyše nijako neprotirečí zadaniu, takže je správny.

Teraz ide iba o jednoznačnosť a úplnosť zadania a slovíčkárenie je iba prostriedok, bez ktorého sa to dosiahnuť nedá. To je vlastnosť programovania a nie právnictva. Moje riešenia zadanie spĺňajú (dôkaz sporom) a kým to tak je, je toto veľmi nenáročný test.
Pokiaľ má niekto opačný názor na jeho náročnosť, môžem iba skonštatovať, že rozmýšľa zbytočne príliš komplikovane. :-)

ikona Jakub Vrána OpenID:

Ano, z pohledu tohoto testu je syntakticky špatný kód v pořádku, pokud je přenositelný, tzn. za všech okolností způsobí syntaktickou chybu. Jak jsi podotknul, jiné požadavky kromě přenositelnosti nejsou na kód kladeny.

Tvé odpovědi jsou špatně, protože otázky 1 a 2 protiřečí požadavku na přenositelnost. Kód v otázce 3 bohužel nebude fungovat vždy (funkce nemusí ani existovat, což už se dá považovat za znak nefunčnosti kódu).

Zkus si otázky představit takto: „Čeho nejspíš chtěl dosáhnout autor kódu a k čemu ve skutečnosti může dojít?“

RATMex B:

Požiadavka prenositeľnosti nie je nikde v zadaní uvedená ani vyšpecifikovaná, čo by ju spĺňalo. Kompletné zadania sú jedine  texty pri číselnom označení. A to veru ani u otázky 3 nie je v zadaní napísané, čo má kód dosiahnuť (má dosiahnuť napr. zlyhanie?). Kód sa zachová tak ako má a nakoľko nie sú kladené na neho žiadne požiadavky, je funkčný vždy.
Určite sa dá vymyslieť aj kopu ďalších vecí, ktorým odpovede protirečia, ale podstatné je sú iba tie, ktoré v zadaní naozaj sú a veru, nevidí ani jednu, ktorej by dané odpovede odporovali.

Ten test si môžem predstavovať ako chcem, ale žiadne moje nesplnené telepatické predpoklady nevyvaracajú to, čo píšem už tretíkrát (a dúfam naposledy), že v taktomto znení je test úplne triviálny.

ivan_d:

Kdo chtěl pochopit význam testu, pochopil. Polopatě:

interpret lze konfigurovat. Některé části kódu v testu nejsou univerzální, ale předpokládají cosi o konfiguraci. 1) Odhalíte co chtěl autor interpretu říci? 2) Co autor o interpretu předpokládal? 3) V jakém případě interpretova interpretace se liší od autorova zamýšleného příběhu?

ikona Jakub Vrána OpenID:

Text uvozující celý test končí slovy: „Na co si dát při psaní přenositelného kódu pozor?“ To se dá tedy vztáhnout na každou otázku.

No nic, celá tato debata je jen slovíčkaření bez valného významu. Přistoupím na tvou hru a uznám, že test je triviální. Stejně, jako by bylo triviální vyhodnocení tvých odpovědí :-).

RATMex B:

Ja viem. V úvodnom texte je tých viet aj viacej, ktoré tiež nemajú na zadanie otázok vplyv, nie len tá posledná. Čítal som ho. Našťastie to celú vec iba zjednodušuje, pretože takto môžu byť riešiteľmi aj hodnotiacimi ľudia, ktorí PHP vôbec neovládajú. Stačí zdravá štipka logiky. Len ten vyvodený záver na konci článku je nejaký mätúci.

Andrew:

Skvělé, někdo se asi u počítače nudí. Takže nejprve, konkrétně. Když už slovíčkaříš, nauč se logiku. Jakub položil krásnou implikaci: je-li kód nepřenositelný, pak je špatný. Z toho vyplývá, že je-li kód přenositelný, je dobrý, ale nejen to. Může být i špatný. U implikace je to jedno a tudíž je tam otevřen prostor i pro Tvé syntaktické chyby.

A nyní obecně. Tenhle testík by se mi hodil jako vstupní do zaměstnání. Rozhodně bych si nemyslel, že programátor by to mohl všechno znát, ale pokud by odpověděl jako Ty, nepřijal bych ho. A proč? Zde jsou důvody:
1) Více než perfektní znalost oboru (kterou se tu snažíš předvést) bych uvítal flexibilitu. Schopnost přizpůsobit se firemnímu prostředí a kultuře je neocenitelná pro práci v týmu.
2) Když člověku zadám úkol chci, aby ho vyřešil co nejlépe. A za nejlepší řešení považuju funkční aplikaci co nejvíce podle představ zákazníka a ne seznam připomínek, na co se mám zákazníka ještě zeptat a hotová aplikace v nedohlednu.
3) Vnímání souvislostí je velmi cenná vlastnost. Nepřečtení nadpisu článku nebo ignorování jeho významů o této vlastnosti moc nevypovídá.
4) Když budu s kolegou řešit problém, k výsledku dospějeme jen tehdy, když se budeme snažit druhému porozumnět a ne najít mezery v jeho argumentaci.
5) U zaměstnance chci, aby chápal svůj úkol. Jakub si vzal za úkol napsat test týkající se konfiguračních direktiv a čtenářům to tam napsal. Pokud by si vzalza úkol napsat test týkající se programování v PHP, pak by Tvoje odpovědi správné.
6) Zaměstnanec by měl mít konstruktivní přístup. Z toho důvodu by mi Tvoje odpovědi nevyhovovaly, protože by mohly být třeba správné, ale k ničemu by mi (potažmo firmě) nebyly a přijal bych raději člověka, který se snažil nalézt rozumnou a ne hloupou (byť třeba správnou odpověď).
K těmto bodům jen dopíšu, že to jsou čistě mé požadavky a priority, nestavím je jako absolutně správné a normotvorné a tudíž prosím nepsat, že v něčem nemám pravdu. Byly napsány s úmyslem vydvihnout pár věcí k zamyšlení.

RATMex B:

Nepopieram, že Tvoj výrok ¬(kód je neprenositeľný) => (kód je správny) je nepravdivý v postavení nad Jakubovou implikáciou, ale v nijakom smere to neovplyvňuje pravdivosť môjho výroku ¬(kód je neprenositeľný) ∧ (kód je v súlade so zadaním) => (kód je správny). Nebudú náhodou medzery v logike niekde u Teba?

Ad off-topic: Tento test beriem tak, ako je, t.j. nezávislý kus textu, ktorý nič a nikoho nepodmieňuje. Pokiaľ by však mal predstavovať seriózny spôsob overenia mojich schopností pre prácu v budúcej firme, už by bola situácia iná. Vtedy by totiž jeho náročnosť poukazovala aj na úroveň kvality práce (alebo prinajmenej úroveň požadovanej kvality práce) vo firme a v tom momente by som o miesto stratil záujem. Takže  by na Tvoje dôvody ani len neprišlo.

Misooo:

ty si fakt drbo!

klevo:

1) <?php include(dirname(__FILE__) . '/connect.inc.php'); ?>
Súbor, ktorý túto funkciu volá môze byť tiež includnuty z ineho súboru, ktorý sa nachádza v inom adresári. V takom prípade by originálny kód hladal súbor v nespravnom adresari.

Prog.:

Hľadal by ho "aj" v nespravonm adresari! Ide o to, že kde by ho našiel skôr (keby existoval aj v adresári, odkiaľ je script includovany, aj v aktuálnom adresári) Neviem, čo je pre php prioritnejšie. Ale myslím že ak tvorím vlastnú aplikáciu, tak poznám jej adresarovú štruktúru a keď použijem './connect.inc.php', tak by to malo byt v poho.

Samozrejme, tým nepodrývam tvoje riešenie, ktoré sa mi javí ako "na konfigurácii nejnezávislejšie"

SendiMyrkr:

Situace:
1. Nastaveno je include_path a include('./connect.inc.php'); => include_path je ignorováno a je nahrán soubor v adresaři kde je umístěn aktuálně používaný soubor.
2. Je nastaveno include_path a include('connect.inc.php'); => je nahrán soubor connect.inc.php umístěný ve složce include_path, pokud tam není nenaincluduje se nic
3. include_path není nastavena => include('./connect.inc.php') i include('connect.inc.php') nahraje tentyž soubor

já osobně považuji za konfiguračně nejnezávislejší include('./connect.inc.php');

Prog.:

njn, tak trocha máš pravdu.
pozrel som http://www.php.net/include a hneď som múdrejší (kiež by som sa pozrel skôr :-)

bez nastavenia include_path som to ešte neskúšal // píšu: "Be sure to have an appropriate include_path" -- takže bodom 3) si niesom istý

Dalej sa píše, že ak include začína "./" alebo "../" tak sa to odvíja od aktualneho adresara spracovavaného scriptu (takže z hľadiska prenositeľnosti je to to pravé riešenie, potvrdzuje to tvoj bod 1)

inak sa postupne prehľadávajú jednotlivé include path-y z konfigurácie, oddelené bodkočiarkov. ak v include path nieje definované "." = tak bod 2) neplatí

Moja include path vyzera asi takto:

include_path = ".;www:/_includes-php"

znamená to, že sa hľadá najprv v aktuálnom adresári (.) a potom vo www:/_includes-php. Z toho vyplýva, že ak by niekto v include_path nemal ".", tak sa includy definované priamo menom súboru (bez ./ alebo alebo bez ../) nenájdu, resp. ak by ju nemal na prvom mieste, tak by sa ich priorita zmenila a mohol by sa naincludovat iný súbor.

--> Zaver: jednoznačne používať "./subor.php"

Jedna nejasnosť:

ak volám include('subor.php') z už naincludovaného súboru, hľadá sa v adresári prvotne volaného súboru, ale aj v adresári súboru, ktorý je naincludovaný. ak však v naincludovanom súbore použijem './subor.php' hľadá sa iba v adresári volaného súboru, nie includovaného.

vie niekto prečo ?

ikona mj41:

Je samozřejmě vhodné znát základy přenositelnosti, ale snažit se za každou cenu psát aplikaci, která je "provozovatelná kdekolik"? Vždyť ono to ani nejde.

Preferuji vyvíjet na tom kde to má běžet a u věcí u kterých tuším, že může být problém napsat jednoduché unit testy ( http://en.wikipedia.org/wiki/Unit_test ). V ideálním případě tyto testy při přechodu jinam zachytí většinu problémů a zbytek se odladí dalším "ručním" testováním.

ikona Jakub Vrána OpenID:

U aplikací, které si lidi stahují a instalují kdekoliv (typicky open-source) bohužel nejde tento model použít. Maximum rozdílů se musí aplikace pokusit skrýt a pokud na něčem opravdu závisí, musí to uvést alespoň v dokumentaci.

ikona mj41:

No jde i nejde. Typicky se aplikace nainstaluje jen pokud uspeji vsechny testy. Znamena to, ze situaci budeme resit az opravdu nastane tedy tak trochu http://en.wikipedia.org/wiki/KISS_principle . Samozrejme vetsinu toho co jste popsal je dobre znat a vyhnout se pozdejsim opravam.

U open source zalezi na uhlu pohledu. Vetsinou staci rozsirit povedomi o projektu a az pote resit (nejlepe za penize :-) specialni upravy, nebo to nechat na nekom, kdo na dane platforme muze testovat.

ikona D1ce:

No zrovna u toho OSS bych to viděl spíše na metodu JIT. "Někde se vyskytl problém(typicky u koncového uživatele)? Je třeba ho řešit? Jasně Inforormujeme TODO!" ;)

barguzin:

6. je spravny terti sposob <?php ?>, v prvom sposobe moze zapis <? ?> sposobit koliziu v pripade pouzitia xml a php v spolocnom zdrojovom kode.

14. Napadlo ma este, ci nie je potrebna typova konverzia, pretoze superglobalnu premennu chceme inkrementovat a zda sa mi, ze vychodzi datovy typ je string.

16. Moze sa to skoncit chybou, ak v prislusnej tabulke nie je ziaden zaznam.

Inak velmi zaujimavy test a myslim, ze celkom  smerodajny pri posudzovani znalosti php.

Co je to heredoc?

ikona Jakub Vrána OpenID:

Zklamu tě, tvé odpovědi jsou zcela mimo.

6. O jaký druh kolize podle tebe jde?

14. A kde se ten "výchozí datový typ" použije?

16. O jakou chybu se podle tebe jedná?

Test vůbec není zamýšlen pro posuzování znalostí PHP, ale právě pouze znalosti konfiguračních direktiv.

Heredoc: http://www.php.net/manual/en/language.types.….syntax.heredoc

Václav Kozelka:

pozde, ale snad dobre a prece:

17. tmp_name bych nepouzival, dal byhc primou cestu uz k uploadovanemu obrazku, ktery se ulozi na server a osetril jmeno souboru, popr. by mohl byt problem s diakritikou :)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.