![]() |
|
||||||
|
|
| 07.02.12 / 23:25 |
|
Kilukarp
Antud kood eeldab, et php.ini failis on register_globals sisselülitatudTuli mõte kirjutada tekstipõhine külalisteraamat. Järgnevalt lahkakski mida ja kuidas ma tegin. Kogu kood on jagatud mitme erineva faili vahel: config.inc - algväärtused kaunter.inc - loenduri funktsioonid index.php - põhifail admin.php - administreerimine st. muutmise/ kustutamise frontend lisa.php - lisamine muuda.php - muutmine kustuta.php - kustutamine Alustaks millestki lihtsast - näiteks kirje lisamine Väike päringu lähtekoha kontroll - see on vajalik, sest osad proxy-d korhavad õige HTTP_REFERER-i ära asendades selle näiteks päritava aadressiga. Tulemuseks on skript, mis püüab paaniliselt iseendaga suhelda. Sõltuvalt serveri kiirusest liigutatakse enne skripti timeout-i tohutu kogus infot - mul näiteks paari sellise päringu tulemusel mõned Mb-d ;-) Kontrollin esitaks, kas HTTP_REFERER ikka täidetud ja ega skripti enda nime HTTP_REFERER-is ei ole. Et hilisem veakontroll mingeid kahtlaseid tulemusi ei saaks, annan vea loendurile algväärtuse. Andmete struktuur (kirje) on kr-is lihtne: 5 elementi, loendamine algab 0-st. Sellise lihtsa ja tühja kirje ka siin kirjeldan Need andmed tuleks millegiga täita. Selleks sobivad teisel lehel asunud formi elemendid. Kuna ma ei viitsi neid kõiki ükshaaval kontrollida, siis mõtlesin välja kontrolli läbi massiivi (kirjeldus asub config.inc) Sissetulnud andmete kontroll Tsüklis massiivi (array) elementide läbijalutamiseks on PHP4-s välja mõeldud funktsioon foreach PHP3-e kasutajad saavad samasuguse tulemuse reaga; Sissetuleva muutuja nimi Kontrollin, kas vastava nimega muutuja on olemas ja kas see sisaldab ka mingitki infot. $$ on selline kaval konstruktsioon, et muutuja sisu saab käsitleda nagu see oleks muutuja nimi: $kala = 5 => echo $kala => tulemuseks '5' $kilu = 'kala' => echo $kilu => tulemuseks 'kala' echo $$kilu => tulemuseks '5' Kui muutuja on olemas, siis panen muutuja massiivi Kui muutujat ei ole olemas, samas on mul märgitud, et peab olema ('ok' => 1) Võtan kirjeldusest veateate ja lisan selle teadete vektorisse. Ühtlasi liidan, vealoendurile ühe juurde. Kui muutujat ei ole olemas ja selle kohta on ka märge, et pole ka vaja ('ok' => 0). lisan kirjele tühja välja. Alguses mõtlesin, et miks seda üldse vaja on - kustutaks järgmise rea ära, sest kirje sai juba oma algväärtuse kätte. Siis mõtlesin, et olen piisavalt laisk ja ei viitsi hiljem kogu koodi läbi nämmutada. Kirje kriitiline pool on kirjeldatud aga kui ma lisan uusi elemente kirje lõppu. Piisab ainult config.inc-is kirjelduste muutmisest. Lisatud elementide algväärtus pannakse siin paika. Vigane kirje Kui kirje on üle vaadatud, kontrollin vigade olemasolu Näib, et leidus vigu, muidu siia ei satuks Registreerin kõik formi elemendid sessiooni muutujateks. See on vajalik, sest ma sellel lehel ei kavatse midagi välja trükkida, vaid anna töö eelmisele lehele tagasi. Samas ei pea sisestaja mingeid andmeid uuesti sisestama. See on nüüd koht, mis zones kindlasti tööle ei hakka. Kogu selle asja asemel tuleks kasutada mingit veateadet sellel lehel ja siis javaskriptiga history(-1) . Registreerin ka veateate(d) Ja lähen tagasi lehele, mis mulle selle vigase formi kaela määris - $next_leht näitab teed ;-) Vigase kirje korral siin ka töö lõppeb Korras kirje Kuna vigu ei leitud jätkan siit. Kõigepealt mõned puuduvad kirje elemendid Tänane kuupäev ja kell kujul YYYYmmddHHiiss Järgmiseks võtan kirje postitaja aadressi NB! See võib olla ka postitaja cache aadress, mitte masina oma. Minul ei puhu selline täpsus pilli, samas kui kedagi segab kasutagu järgmist rida: HTTP_X_FORWARDED_FOR võib koosneda mitmest aadressist, mis on komaga eraldatud HTTP_X_FORWARDED_FOR-i võib iga kasutaja ka ise defineerida, seega ei ole selle vastus 100% kindel! Kindlasti ära kasuta seda mingi audentimise juures! Väike töötlus sisestatud tekstile. See on vajalik, sest kirje peab asuma ühel real ja ei tohi sisaldada "|" märki, sest see on kirje elementide eraldamiseks trim() - korjab ära alguses ja lõpus olevad tühikud ning muud märgid, mis ei jäta printimisel jälgi. htmlentities() - teisendab kõik vähegi sobiva htmlentites-iks (ei leidnud eesti keelset vastet) ereg_replace() - sellisel kujul, nagu ta mul on korjab ära kõik reavahetused ja asendab need <br> tagiga str_replace - asendab "|" html-i märgiga "¦" Liidan saadud tulemuse kokku üheks pikaks stringiks, kasutades eraldajaks "|" märki ja lõppu panen reavahetuse. Faili lisamine Avan faili a - võti viib kirjutamise pointeri kohe lõppu b - võti kirjutab binaarselt sobiva koodi Kontrollin, kas avamine õnnestus, ühtlasi lukustan faili kirjutamiseks NB! Kui ei lukustaks, ootaks peagi ees isetühjenenud külalisteraamat ;-) Kirjutan rea faili Sulgen faili Lisan loendurisse uue numbri - sellest põgusalt hiljem. Põhiidee on toodud ära "Kaunteri lahkamine" nimelises teoses Ja lähen tagasi lehele, mis mulle selle portsu kaela määris - $next_leht näitab teed ;-) # Konfiguratsioon - config.inc Külalisteraamatu faili nimi Ridade arv ekraanil ehk lehekülje suurus Kirjeldan konstandid, et oleks mugav andmeid käsitleda - ei pea mõtlema väljade paiknemisele Formi töötluse jaoks vajalik massiiv. Massiiv on siis kahemõõtmeline esimene mõõde jookseb siis piki eelpool mainitud konstante (nimi, epost jne) Teistpidi jooksevad elemendi kirjeldused: vali - kirjeldab formilt saadud muutuja nimetust viga - kirjeldab vea ilmnemisel veateadet. ok - kirjaldab, kas väli on kohustuslik(1) või ei ole(0) Sama kirjeldus administratiiv-mooduli jaoks, kus saab olemasolevaid andmeid muuta Juhul kui lehitsemise muutuja on kirjeldamata annan sellele algväärtuse # Loenduri fail - kaunter.inc Kuna sellel teemal on olemas eraldi artikkel "Tekstikaunterit lahkamas" siis siinkohal mainin ainult, et tegin asjast kaks käepärast funktsiooni Esimene lisab loenduri ja tagastab selle uue väärtuse Teine küsib kindlalt loendurilt selle väärtust # Kirje kustutamine – kustuta.php Vaataks kuidas kustutada kirjet Kõigepealt kontrollin, kas midagi üldse sooviti kustutada. Kui ei soovitud saadan järje tagasi admin.php nimelisele lehele Järgmiseks avan külalisteraamatu faili ja kontrollin, kas avamine ja lukustamine õnnestus. Lukustamine on vajalik, et vältida faili tühjenemist kui mitu protsessi korraga tahavad faili muuta. Kui avamine ja lukustamine õnnestus, küsin süsteemilt ilusa ja unikaalse failinime. Avan ajutise faili ning lukustan selle. Ajutist faili on vaja, sest failist rea kustutamine on tegelikult reale eelnevate ja järgnevate ridade uude faili kopeerimine. Kui ikka kirjeid on väga palju ja selline majandamine saab pidurdavaks, tasub mõelda kustutatava kirje algusesse mingi kindla märgi panekust tähendusega, et see kirje on kustutatud ja hiljem mingil süsteemi jaoks vabamal hetkel tuleks need kirjed failist eemaldada. Järgmiseks käin reakaupa kogu külalisteraamatu läbi. Juhul kui rida ei ole tühi või rea number ei võrdu kustutamisele määratud reaga, kirjutan rea ajutisse faili. Sulgen külalisteraamatu ja ajutise faili. Kustutan külalisteraamatu ja nimetan ajutise faili ümber külalisteraamatuks. Tagasi adminni lehele # Kirje muutmine – muuda.php Kirje muutmine on tegelikult kombinatsioon uue lisamisest ja kustutamisest. Seega mujal pikemalt ei peatu kui ainult muutmise tsüklil. Käin reakaupa kogu külalisteraamatu läbi. Juhul kui rida ei ole tühi või rea number ei võrdu muutmisele määratud reaga, kirjutan rea ajutisse faili. Kui rea number on sama muutmisele mineva reaga, kirjutan selle rea asemele uue rea. # Külalisteraamat – index.php Külalisteraamat saab aru järgmistest GET parameetritest: alates= lehekülg – mitmendat lehekülge näidatakse. tsitaat=kirje – mitmendat kirjet tsiteeritakse Et saada tegelik alguskirje number korrutan lehekülje numbri kirjete arvuga leheküljel Külalisteraamatu form saada andmed lehele lisa.php – selline loksutamine on hea, sest pärast leheküljel refreshi vajutades ei küsita rumalaid küsimusi uuesti postituse kohta. Et sattuda pärast tagasi samale leheküljele, annan edasi ka lehekülje numbri. Initsialiseerin 2 loendurit ja avan faili. Ühte loendurit läheb vaja, et pidada arvet failist loetud ridade kohta, teist kasutan väljatrüki loendamiseks Loen failist reakaupa, kuni sealt midagi saab lugeda, samas suurendan loendurit Kui rida on tühi, siis seda ei näita. Kui rida mahub vajaliku lehekülje raamidesse, siis läheb kirje töötlusesse Kõigepealt eraldan rea kirjeteks. Siin kasutan kirjete eraldamiseks märki “|” Külalisteraamatus olev kuupäev on samal kujul, nagi timestamp mysql-is. Neli kohta aastale + 2 kohta kuule + 2 kohta päevale + 2 kohta tunnile + 2 kohta minutile + 2 kohta sekundile ehk siis yyyymmddhhmmss Et saada sellest kõigile mõistetavat kuupäeva, pean teostama väikese stringitöötluse Kui epost on antud, lisan selle lingi nimele, vastasel juhul ainult nimi Sisu muutujale $sisu. Kui sisu oleks vaja mingil põhjusel töödelda, siis siin oleks õige koht seda teha. Näiteks emotikoni piltide lisamine vms. Kui $tsitaat on määratud ja rea number vastab tsitaadi numbrile, tõstan selle formi jaoks kõrvale IP aadressile nimekuju andmine. Kui ei leita jääb lihtsalt IP aadress Siin väljastan saadud kirje. Formaadi valik on maitseasi, mina valisin iga kirje jaoks oma tabeli. Ühtlasi panen alla tsiteerimist võimaldava lingi. Liidan väljatrüki loendurile ühe juurde Sulgen faili Sellesse punkti jõudes tean ma, palju on ridu failis. Siin võrdlen, kas neid on rohkem, kui väljatrüki aknasse mahub Kui selgub, et on, hakkan genereerima lehekülgede jaoks linke Lisamise formil kontrollin veateate olemasolu ja vajadusel trükin teated välja . Veateade ja ka formi elemendid vea korral tulevad sisse läbi sessiooni muutujate. Peale nende kasutamist vabastan sessiooni nendest muutujatest. Formi moodustamine, kui element on määratud, panen selle formi Et teada kaua skript lehte genereeris, võtan skripti alguses aja Skripti lõppemisel võtan uue aja ja kirjutan vahe välja # Külalisteraamatu administreerimine – admin.php See moodul on sisuliselt täiustatud variant külalisteraamatust, seega peatun ainult olulisematel erinevustel. Administreerimise moodul saab aru järgmistest GET parameetritest: alates= lehekülg – mitmendat lehekülge näidatakse. muuda=suva – muutmise loogika aktiveerimine f_id=kirjenumber – millist kirjet muudetakse Kontrollin, kas muutmise kask on olemas ja kas kirje on määratud. Kui on annan formi kaudu kirje numbri edasi ja määran formi action-iks muuda.php Siin vaatan, kui muutmisele mineva kirje id on sama käsitlemisel oleva id-ga teen valmis formi elemendid Kui formi element f_ip on määratud, saadan selle ka formiga edasi # Tekstipõhise külalisteraamatu kood Artikli kommentaarid |
|