anti päewik

Sisaldab Palju Erinewaid Imesid ja Öppetusi Tarkadele.

~ PHP-le ei meeldi trellid, karskele ei meeldi viin ~


PHP-s on funktsioon parse_ini_file, mis teeb standardsete INI failide parsimise hästi mugavaks. Reeglina käivad ühe INI faili juurde ka kommentaarid, kus siis seletatakse lahti mõne seadistuse mõte või tähendus. Ja kommentaare tähistab konfifailides ja skriptides tavaliselt # rea alguses. Näiteks nii


[general]
# selle aadressile saadetakse koik teated.
email = keegi@kusagil.ee
server = localhost

Kena kõik. Nüüd võtad kätte ja muudad ühte seadistust, aga jätad vana alles. Lihtsalt igaks juhuks, et ehk läheb kunagi tarvis.


[general]
# selle aadressile saadetakse koik teated.
#email = keegi@kusagil.ee
email = keegi@mujal.ee
server = localhost

Kui nüüd see fail parse_ini_file-st läbi lasta, siis on tulemus tegelikult selline:

Array
(
    [general] => Array
        (
            [#email] => keegi@kusagil.ee
            [email] => keegi@mujal.ee
            [server] => localhost
        )

)

Mõneti ootamatu tegelikult. Selgub, et # rea alguses EI TÄHISTAGI kommentaari. See on täiesti lubatud märk ja PHP parsib seda rida nagu iga teist. Muidugi mõista ei ole mitte kusagil kirjas, et # üldse peaks PHP ini faili kontekstis kommentaari tähistama, see on lihtsalt “Assumption is the mother of all screw-ups” kõige ehedamal kujul. Omades mõningast kogemust konfifailidega, sa lihtsalt eeldad, et # rea alguses on kommentaar. Üldjuhul sellest ei muutugi mitte midagi, sest seadistus nimega #email ei huvita üldiselt mitte kedagi ja ei sega mitte midagi. Aga nüüd järgmine näide:


[general]
# selle aadressile saadetakse koik teated (jäta see tühjaks, kui sa ei soovi teateid saada)
email = keegi@kusagil.ee
server = localhost

Kui nüüd see konfifail parse_ini_file funktsioonist läbi lasta, siis on tulemus:

Array
(
    [general] => Array
        (
        )

)

Miks? Sest selle funktsiooni manuaalis on kirjas järgmine märkus: Note: There are reserved words which must not be used as keys for ini files. These include: null, yes, no, true, and false. Values null, no and false results in “”, yes and true results in “1″. Characters {}|&~![()" must not be used anywhere in the key and have a special meaning in the value.

PHP ei saa selle faili parsimisega hakkama, sest see on vigane! Kui enne sulge sisaldavat ja trelliga algavat rida on veel seadistusi, siis need saad sa kätte, aga pärast seda rida olevaid seadistusi lihtsalt ei ole. Kui sul on error_reporting(E_ALL) ja display_errors On, siis sa muidugi näed ka hoiatust parsimisvea kohta. Aga mõnikord tuleb ette, et veateated on faili suunatud või üldse ära peidetud ja siis jääb selline asi kahe silma vahele.

Ülaltoodust tuleneb ka see, et kui su konfifail on

[general]
esimene
teine=test

siis parse_ini_file saab aru, et “esimene” rida on vigane rida ja jätab selle lihtsalt vahele. Ilma hoiatuseta.

Minul õnnestus igatahes päris tubli tükk aega ära kulutada, et aru saada, miks ühe faili parsimine pooleli jääb. error_reporting oli maha keeratud, sest vahepeal oli vaja ühte mitte väga kvaliteetset koodijuppi jooksutada ja pärast seda oli taha maha jäänudki. Ja paistab, et ma ei ole sugugi mitte ainus, kes sellest teadlik ei ole, sest veeb on põhimõtteliselt täis näiteid, kus seadistusi kommenteeritakse välja just # abil. Korrektne on aga hoopis ; (semikoolon) rea alguses.







Write a Comment

Note: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>