9. peatükk.
CGI programmeerimine
CGI-teemalise jaotise lisamine andmebaasiraamatusse võib tunduda sama veider, nagu sisaldaks see kokaraamatusse autoremondi peatükki. Muidugi on toidupoodi minekuks vaja töökorras autot, aga kas sellest on kohane rääkida? Täielik sissejuhatus CGI-sse ja veebiprogrammeerimisse üldiselt ei kuulu selle raamatu raamesse, kuid nende teemade lühikesest sissejuhatusest piisab, et laiendada MySQL-i ja mSQL-i esitlusvõimalusi veebis.
See peatükk on mõeldud eelkõige neile, kes õpivad andmebaase, kuid soovivad omandada teadmisi ka veebiprogrammeerimisest. Kui teie perekonnanimi on Berners-Lee või Andreessen, ei leia te tõenäoliselt siit midagi, mida te juba ei tea. Kuid isegi kui te pole CGI-s uustulnuk, võib MySQL-i ja mSQL-i saladustesse sukeldumisel käepärast kiirviite olemasolu olla üsna kasulik.
Mis on CGI?
Nagu enamik akronüüme, ütleb ka Common Gateway Interface (CGI) sisuliselt vähe. Millega liides? Kus see värav asub? Millisest kogukonnast me räägime? Nendele küsimustele vastamiseks läheme veidi tagasi ja heidame pilgu WWW-le üldiselt.
CERNi füüsik Tim Berners-Lee leiutas veebi 1990. aastal, kuigi plaan pärineb aastast 1988. Idee oli võimaldada osakestefüüsika teadlastel hõlpsalt ja kiiresti jagada multimeediumiandmeid – teksti, pilte ja heli – läbi Interneti. WWW koosnes kolmest põhiosast: HTML, URL ja HTTP. HTML - vorminduskeel, mida kasutatakse sisu esitamiseks veebis. URL - see on aadress, mida kasutatakse HTML-i (või muu) sisu toomiseks veebiserverist. Ja lõpuks HTTP – see on keel, millest veebiserver aru saab ja mis võimaldab klientidel nõuda serverist dokumente.
Võimalus saata igat tüüpi teavet Interneti kaudu oli revolutsioon, kuid peagi avastati veel üks võimalus. Kui saate veebi kaudu saata mis tahes teksti, siis miks ei võiks te saata teksti, mis on loodud programmiga ja mitte võetud valmisfailist? Samal ajal avaneb võimaluste meri. Lihtne näide: saab kasutada programmi, mis kuvab praegust kellaaega, et lugeja näeks iga lehe vaatamise korral õiget aega. Mõned nutikad pead riiklikus superarvutirakenduste keskuses, kes ehitasid veebiserverit, nägid võimalust ja CGI tuli peagi kohale.
CGI on reeglite kogum, mille järgi saavad serveris olevad programmid veebiserveri kaudu klientidele andmeid saata. CGI spetsifikatsiooniga on kaasnenud muudatused HTML-is ja HTTP-s, mis tutvustab uut omadust, mida nimetatakse vormideks.
Kuigi CGI võimaldab programmidel andmeid kliendile saata, laiendavad vormid seda võimalust, võimaldades kliendil sellesse CGI-programmi andmeid saata. Nüüd ei saa kasutaja mitte ainult praegust kellaaega näha, vaid ka kella seada! CGI vormid on avanud ukse tõelisele interaktiivsusele veebimaailmas. Levinud CGI-rakendused hõlmavad järgmist:
- Dünaamiline HTML. Terveid saite saab luua ühe CGI programmiga.
- Otsingumootorid, mis leiavad kasutaja määratud sõnadega dokumente.
- Külalisteraamatud ja teadetetahvlid, kuhu kasutajad saavad oma postitusi lisada.
- Tellimuste vormid.
- Küsimustikud.
- Teabe hankimine serveris hostitud andmebaasist.
Järgmistes peatükkides käsitleme kõiki neid CGI-rakendusi, aga ka mõnda muud. Need kõik pakuvad suurepärast CGI-andmebaasi ühenduvust, mis meid selles jaotises huvitab.
HTML vormid
Enne CGI spetsiifikaga tutvumist on kasulik vaadata kõige levinumat viisi lõppkasutajatel CGI programmidega liidestamiseks: HTML-vormid. Vormid on osa HTML-keelest, mis pakub lõppkasutajale erinevat tüüpi välju. Väljadele sisestatud andmed saab edastada veebiserverisse. Väljasid saab kasutada teksti sisestamiseks või nupud, mida kasutaja saab klõpsata või linnukesega märkida. Siin on HTML-lehe näide, mis sisaldab vormi:
<НТМL><НЕАD><ТITLЕ>Minu vormide leht
<р>See on vormiga leht.
See vorm loob 40-märgilise stringi, kuhu kasutaja saab sisestada oma nime. Sisestusrea all on nupp, mida vajutades saadab vormi andmed serverisse. Järgmised on vormiga seotud sildid, mida toetab tänapäeval kõige laialdasemalt kasutatav standard HTML 3.2. Siltide ja atribuutide nimesid saab igal juhul sisestada, kuid järgime valikulist tava, et avasildid on suurtähed ja sulgevad sildid väiketähed.
Ainus sisestustüüp, mida me siin pole kasutanud, on sildi tüüp IMAGE ... Seda saab kasutada alternatiivse vormi esitamise viisina. Kuid tüüp IMAGE ühildub harva tekstipõhiste ja mitte väga reageerivate brauseritega, seega on mõistlik seda vältida, välja arvatud juhul, kui teie saidil on rikkalik graafiline stiil.
Nüüd, kui olete HTML-vormide põhitõdedega tuttav, võite hakata õppima CGI enda kohta.
CGI spetsifikatsioon
Mis siis täpselt on reeglistik, mis võimaldab näiteks Illinoisi osariigis Batavias asuval CGI-programmil suhelda Välis-Mongoolia veebibrauseriga? Ametliku CGI spetsifikatsiooni koos hulga muu CGI teabega leiate NCSA serverist aadressil http://hoohoo ... ncsa.uluc.edu/ cgi /. See peatükk on aga olemas selleks, et ei peaks kaua reisima ja seda ise otsima.
CGI edastab andmeid CGI npor raami ja veebiserveri ning seega ka veebikliendi vahel neljal viisil:
- Keskkonnamuutujad.
- Käsurida.
- Standardne sisendseade.
- Standardne väljundseade.
Nende nelja meetodi abil edastab server kõik kliendi saadetud andmed CGI programmi. Seejärel teeb CGI programm oma võlu ja saadab väljundi tagasi serverisse, mis edastab selle kliendile.
Need andmed on koos Apache HTTP-serveri hinnanguga. Apache on kõige laialdasemalt kasutatav veebiserver, mis töötab peaaegu igal platvormil, sealhulgas Windows 9x ja Windows NT. Neid saab aga rakendada kõikidele HTTP-serveritele, mis toetavad CGI-d. Mõnel patenteeritud serveril, näiteks Microsofti ja Netscape'i serveritel, võib olla lisafunktsioone või need võivad töötada veidi erinevalt. Kuna veebi nägu muutub jätkuvalt uskumatu kiirusega, arenevad standardid ikka veel ja kahtlemata on muudatusi ka tulevikus. Kui aga rääkida CGI-st, siis tundub, et tegemist on hästi väljakujunenud tehnoloogiaga – makstav hind on see, et teised tehnoloogiad, näiteks apletid, on selle tagasi lükanud. Kõik CGI-programmid, mille selle teabe abil kirjutate, on peaaegu kindlasti suutelised töötama enamikus veebiserverites veel aastaid.
Kui CGI-programmi käivitatakse vormi kaudu, mis on kõige tavalisem liides, saadab brauser serverisse pika stringi, mis algab CGI-programmi teest ja selle nimest. Sellele järgnevad mitmesugused muud andmed, mida nimetatakse teeinfoks ja mis edastatakse keskkonnamuutuja PATH_INFO kaudu CGI programmi (joonis 9-1). Teeteabele järgneb "?", millele järgneb vormiandmed, mis saadetakse serverisse HTTP GET-meetodi abil. Need andmed tehakse CGI-programmile kättesaadavaks keskkonnamuutuja QUERY_STRING kaudu. Kõik andmed, mida leht saadab HTTP POST-meetodil, mis on kõige sagedamini kasutatav meetod, edastatakse CGI-programmi standardsisendi kaudu. Tüüpiline string, mida server saab brauserist vastu võtta, on näidatud joonisel 1. 9-1. Programm nimega vormis lugeda kataloogis cgi-bin helistab server koos täiendava teeteabega Lisainformatsioon ja valik = abitaotluse andmed – ilmselt osana algsest URL-ist. Lõpuks saadetakse HTTP POST meetodi kaudu vormi enda andmed (tekst "CGI programmeerimine" väljal "märksõnad").
Keskkonnamuutujad
Kui server käivitab CGI-programmi, edastab ta sellele esmalt mõned andmed, et need töötaksid keskkonnamuutujate kujul. Seitseteist muutujat on spetsifikatsioonis ametlikult määratletud, kuid palju rohkem kasutatakse mitteametlikult allpool kirjeldatud mehhanismi kaudu, mida nimetatakse HTTP_ / nec / zams / n. CGI programm
on käsurealt käivitamisel juurdepääs neile muutujatele samamoodi nagu mis tahes kestakeskkonna muutujatele. Näiteks shelliskriptis saab keskkonnamuutujale F00 juurde pääseda kui $ F00; Perlis näeb see kõne välja nagu $ ENV ("F00"); C-s getenv ("F00"); ja nii edasi Tabelis 9-1 on loetletud muutujad, mille server alati määrab – vähemalt null. Lisaks nendele muutujatele määratakse kliendi poolt päringu päises tagastatud andmed muutujatele kujul HTTP_F00, kus F00 on päise nimi. Näiteks sisaldab enamik veebibrausereid versiooniteavet päises nimega USEfl_AGENT. Teie CGI-npor-frame saab need andmed saada muutujast HTTP_USER_AGENT.
Tabel 9-1.CGI keskkonnamuutujad
Keskkonna muutuja |
Kirjeldus |
||
CONTENT_LENGTH |
POST- või PUT-meetodiga saadetud andmete pikkus baitides. |
||
SISU TÜÜP |
POST- või PUT-meetodiga lisatud andmete MIME-tüüp. |
||
GATEWAY_INTERFACE |
Serveri toetatud CGI spetsifikatsiooni versiooninumber. |
||
PATH_INFO |
Kliendi edastatud lisateave. Näiteks nõudma http://www.myserver.eom/test.cgi/this/is/a/ tee? väli = roheline muutuja PATH_ INFO väärtus on / see / on / a / tee. |
||
PATH_TRANSLATED |
Sama mis PATH_INFO, kuid server toodab kõik |
||
|
Võimalik tõlge, näiteks nime laiendus nagu "-konto". " |
||
QUERY_STRING |
Kõik andmed pärast "?" URL-is. Need on ka andmed, mis saadetakse siis, kui vormi REQ-UEST_METHOD on GET. |
||
REMOTE_ADDR |
Taotluse esitanud kliendi IP-aadress. |
||
REMOTE_HOST |
Kliendi masina hostinimi, kui see on saadaval. |
||
REMOTE_IDENT |
Kui veebiserver ja klient toetavad autentimist identd, siis on see päringu esitanud konto kasutajanimi. |
||
REQUEST_METHOD |
Meetod, mida klient kasutab päringu tegemiseks. CGI-programmide puhul, mida me ehitame, on see tavaliselt POST või GET. |
||
SERVER_NAME | Masina hostinimi – või IP-aadress, kui nimi pole saadaval –, millel veebiserver töötab. | ||
SERVER_PORT | Veebiserveri kasutatav pordinumber. | ||
SERVER_PROTOCOL |
Protokoll, mida klient kasutab serveriga suhtlemiseks. Meie puhul on see protokoll peaaegu alati HTTP. | ||
SERVER_TARKVARA | Teave CGI-programmi töötava veebiserveri versiooni kohta. | ||
SCRIPT_NAME |
Käivitava skripti tee, nagu klient on määranud. Saab kasutada URL-ile viitamiseks iseendale ja selleks, et erinevates kohtades viidatud skriptid saaksid sõltuvalt kohast käitada erinevalt. |
||
Siin on näide Perli CGI-skriptist, mis prindib välja kõik serveri poolt määratud keskkonnamuutujad, aga ka kõik päritud muutujad, näiteks PATH, mille on seadnud serveri käivitanud shell.
#! / usr / bin / perl -w
printida<< HTML;
Sisutüüp: tekst / html \ n \ n
HTML
foreach (klahvid% ENV) (print "$ _: $ ENV ($ _)
\ n ";)
printida<
HTML
Kõiki neid muutujaid saab teie CGI programm kasutada ja isegi muuta. Need muudatused ei mõjuta aga programmi käivitanud veebiserverit.
Käsurida
CGI võimaldab argumente edastada CGI programmi käsurea parameetritena, mida kasutatakse harva. Seda kasutatakse harva, kuna selle praktilisi rakendusi on vähe ja me ei hakka sellel üksikasjalikult peatuma. Põhimõte on see, et kui keskkonnamuutuja QUERY_STRING ei sisalda sümbolit "=", siis käivitatakse CGI programm päringust QUERY_STRING võetud käsurea parameetritega. Näiteks, http://www.myserver.com/cgi- prügikast / sõrm? juur jookseb sõrmejuur peale www.myserver.com.
Perli jaoks on kaks peamist teeki, mis pakuvad CGI-liidest. Esimene on cgi-lib.pl Kasulikkus cgi-lib.pl väga levinud, kuna see oli pikka aega ainus suur raamatukogu. See on loodud töötama Perl 4-s, kuid see töötab ka Perl 5-ga. Teine teek, CGI.pm, uuem ja paljuski parem cgi-lib.pl. CGI.pm kirjutatud Perl 5 jaoks ja kasutab CGI andmetega töötamiseks täielikult objektorienteeritud raamistikku. Moodul CGI.pm parsib standardsisendi ja muutuja QUERY_STRING ning salvestab andmed CGI-objekti. Teie programm peab lihtsalt looma uue CGI-objekti ja kasutama soovitud andmete toomiseks lihtsaid meetodeid, nagu paramQ. Näide 9-2 on lühike demonstratsioon selle kohta, kuidas CGI.pm tõlgendab andmeid. Kõik selle peatüki Perli näited kasutavad CGI.pm.
Näide 9-2.
CGI andmete sõelumine Perlis
#! / usr / bin / perl -w
kasuta CGI qw (: standard);
# Kasutatakse moodulit CGI.pm. qw (: standard) import
# saadaolevate standardsete CGI-funktsioonide nimeruum
# selgem kood. Seda saab teha, kui skript
# kasutatakse ainult ühte CGI-objekti.
$ mycgi = uus CGI; # Looge CGI-objekt, mis on vormiandmete "värav".
@fields = $ mycgi-> param; # Ekstraheerige kõigi täidetud vormiväljade nimed
print header, start_html ("CGI.pm test"); ft meetodid "header" ja "start_html",
# ette nähtud
# CGI.pm, muutke HTML-i hankimine lihtsaks.
# "päis" väljastab vajaliku HTTP-päise, a
# "start_html" kuvab HTML-i pealkirja antud nimega,
#a ka sildi
.printida"<р>Vormi andmed:
";
foreach (@väljad) (prindi $ _, ":", - $ mycgi-> param ($ _), "
"; }
# Printige iga välja jaoks kasutades saadud nimi ja väärtus
#
$ mycgi-> param ("väljanimi").
print end_html; # Lühike lõpumärgendite väljastamiseks "".
Sisendandmete töötlemine C-vormingus
Kuna MySQL-i ja mSQL-i põhiliidesed on kirjutatud C-keeles, ei loobu me C-st täielikult Perli kasuks, vaid kui see on asjakohane, toome mõned näited C-s. CGI-programmeerimiseks on kolm laialdaselt kasutatavat C-teeki: cgic Tom Boutell *; cgihtml Eugene Kim t ja libcgi EIT-st *. Me usume seda cgic on kõige täiuslikum ja lihtsamini kasutatav. Sellel puudub aga võimalus loetleda kõik vormimuutujad, kui te neid eelnevalt ei tea. Tegelikult saab selle lisada lihtsa plaastriga, kuid see jääb sellest peatükist välja. Seetõttu kasutame näites 9-3 raamatukogu cgihtml, korrata ülaltoodud Perli skripti C-s.
Näide 9-3.CGI andmete sõelumine C-s
/*
cgihtmltest.c – tüüpiline CGI programm võtmete ja nende väärtuste kuvamiseks
vormilt saadud andmetest * /
#kaasa
#include "cgi-lib.h" / * See sisaldab kõiki CGI funktsioonide määratlusi * /
#include "html-lib.h" / * See sisaldab "kõiki HTML-i abifunktsioonide määratlusi * /
tühine print_all (loetelu 1)
/ * Need funktsioonid väljastavad vormi edastatud andmed ülaltoodud Perli skriptiga samas vormingus. Cgihtml pakub ka sisseehitatud funktsiooni
Print_entries (), mis teeb sama HTML-loendivormingus. * / (
sõlm * aken;
/ * "Sõlm" tüüp on määratletud cgihtml teegis ja viitab lingitud loendile, mis salvestab kõik vormiandmed. * /
aken = I.pea; / * Määrab kursori vormiandmete algusesse * /
while (aken! = NULL) (/ * Liikuge lingitud loendist viimase (esimese tühja) elemendini * /
printf ("% s:% s
\ n ", aken-> kirje. nimi, asenda_ltgt (aken-> kirje.väärtus));
/ * Prindi andmed. Replace__ltgt () on funktsioon, mis mõistab teksti HTML-kodeeringut ja tagab selle õige kuvamise kliendi brauseris. * /
aken = aken-> järgmine; / * Liigu loendis järgmise üksuse juurde. * /
} }
int main () (
nimekirja kanded; / * Osuti sõelutud andmetele * /
int staatus; / * Olekut tähistav täisarv * /
HTML__päis (); / * HTML-i abifunktsioon, mis väljastab HTML-i päise * /
Html_begin ("cgihtml test");
/ * HTML-i abifunktsioon, mis kuvab määratud pealkirjaga HTML-lehe alguse. * /
olek = read_cgi_input (& kirjed); / * Sisestab ja sõelub vormi andmeid * /
Printf ("<р>Vormi andmed:
");
Prindi_kõik (kanded); / * Kutsub ülal määratletud funktsiooni print_all () välja. * /
html_end (); / * HTML-i abifunktsioon, mis prindib HTML-lehe lõpu. * /
List_clear (& kirjed); / * Vabastab vormiandmete poolt kasutatava mälu. * /
tagasi 0; )
Standardne väljundseade
CGI programmi poolt standardväljundisse saadetud andmed loeb veebiserver ja saadab need kliendile. Kui skripti nimi algab tähega nph-, seejärel saadetakse andmed otse kliendile ilma veebiserveri sekkumiseta. Sel juhul peab CGI programm genereerima õige HTTP-päise, millest klient aru saab. Vastasel juhul laske veebiserveril teie jaoks HTTP-päis genereerida.
Isegi kui te ei kasuta nph-script, tuleb serverile anda üks käsk, mis annab talle teavet teie väljundi kohta. Tavaliselt on see Content-Type HTTP-päis, kuid see võib olla ka päis Asukoht. Pealkirjale peab järgnema tühi rida, st reavahetus või CR / LF kombinatsioon.
Sisutüübi päis ütleb serverile, millist tüüpi andmeid teie CGI-programm tagastab. Kui see on HTML-leht, peab string olema sisutüüp: tekst / html. Asukoha päis ütleb serverile erineva URL-i või sama serveri erineva tee, kuhu klient suunata. Päis peaks välja nägema selline: Asukoht: http:// www. minu server. com / teine / koht /.
Pärast HTTP-päiseid ja tühja rida saate saata tegelikud andmed, mida teie programm toodab – HTML-lehe, pildi, teksti või mis iganes. Apache'iga kaasasolevate CGI-programmide hulgas on nph-test-cgi ja test-cgi, mis näitavad hästi erinevust nph ja mitte-nph päiste vahel.
Selles jaotises kasutame teeke CGI.pm ja cgic, millel on funktsioonid nii HTTP- kui ka HTML-päiste väljastamiseks. See võimaldab teil keskenduda tegeliku sisu kuvamisele. Neid abifunktsioone kasutatakse selle peatüki varasemates näidetes.
CGI skriptimise olulised omadused
Põhimõtteliselt teate juba, kuidas CGI töötab. Klient esitab andmed, tavaliselt vormi kaudu, veebiserverisse. Server käivitab CGI programmi, edastades sellele andmeid. CGI programm töötleb ja tagastab oma väljundi serverile, mis edastab selle kliendile. Nüüd, alates arusaamisest, kuidas CGI npor raamid töötavad, peate liikuma edasi mõistmiseni, miks neid nii laialdaselt kasutatakse.
Kuigi teate sellest peatükist juba piisavalt, et koostada lihtne ja töötav CGI-programm, tuleb enne tõeliselt töötava MySQL- või mSQL-programmi kirjutamist käsitleda veel mõnda olulist küsimust. Esiteks peate õppima, kuidas töötada mitme kujuga. Järgmiseks peate õppima mõned turvameetmed, mis takistavad ründajatel teie serveri failidele ebaseaduslikku juurdepääsu või nende hävitamist.
Olukorda meenutades
Oleku meeldejätmine on oluline vahend kasutajatele hea teeninduse pakkumiseks, mitte ainult paadunud kurjategijatega võitlemiseks, nagu võib tunduda. Probleemi põhjustab asjaolu, et HTTP on nn "no memory" protokoll. See tähendab, et klient saadab andmed serverisse, server tagastab andmed kliendile ja siis läheb igaüks oma teed. Server ei salvesta kliendi kohta andmeid, mida võib vaja minna järgnevates toimingutes. Samuti pole kindlust, et klient salvestab tehtud toimingu kohta mingeid andmeid, mida saab hiljem kasutada. See seab kohese ja olulise piirangu World Wide Webi kasutamisele.
Selle protokolliga CGI-skriptimine on analoogne vestluse meeldejätmise puudumisega. Alati, kui kellegagi räägite, hoolimata sellest, kui sageli olete temaga varem vestelnud, peate end tutvustama ja otsima ühist jututeemat. Ütlematagi selge, et see ei soodusta tootlikkust. Joonis 9-2 näitab, et kui päring jõuab CGI-programmi, on see programmi täiesti uus eksemplar, millel puudub seos eelmisega.
Kliendi poolel oli Netscape Navigatori tulekuga kiire välimusega lahendus, mida nimetatakse küpsisteks. See koosneb uue HTTP-päise loomisest, mida saab edasi-tagasi saata kliendi ja serveri vahel, sarnaselt sisutüübi ja asukoha päistele. Kliendi brauser, olles saanud küpsise päise, peab salvestama küpsises olevad andmed, samuti selle domeeni nime, milles see küpsis kehtib. Seejärel, kui külastatakse määratud domeeni URL-i, tuleb küpsise päis serverisse tagasi saata, et seda saaks kasutada selle serveri CGI programmides.
Küpsiste meetodit kasutatakse peamiselt kasutajatunnuse salvestamiseks. Külastajate teavet saab salvestada serverimasina faili. Selle kasutaja unikaalse ID saab saata küpsisena kasutaja brauserisse, misjärel iga kord, kui kasutaja seda saiti külastab, saadab brauser selle ID automaatselt serverisse. Server edastab ID CGI programmile, mis avab vastava faili ja pääseb ligi kõikidele kasutajaandmetele. Kõik see toimub kasutajale nähtamatul viisil.
Nii kasulik kui see meetod ka pole, ei kasuta enamik suuri saite seda oleku meeldejätmise ainsa vahendina. Sellel on mitu põhjust. Esiteks ei toeta kõik brauserid küpsiseid. Kuni viimase ajani ei toetanud vaegnägijatele (rääkimata ebapiisava internetiühenduse kiirusega inimestest) mõeldud põhibrauser - Lynx - küpsiseid. Ta ei toeta neid endiselt "ametlikult", kuigi mõned tema laialt levinud "kõrvalharud" seda teevad. Teiseks, mis veelgi olulisem, seovad küpsised kasutaja konkreetse masinaga. Üks suurepäraseid asju veebi juures on see, et sellele on juurdepääs kõikjalt maailmast. Sõltumata sellest, kus teie veebileht loodi või talletati, saab seda kuvada mis tahes Interneti-ühendusega masinas. Kui aga proovite pääseda ligi küpsisefaili toega saidile kellegi teise masinast, lähevad kõik küpsises hoitavad isikuandmed kaotsi.
Paljud saidid kasutavad endiselt küpsiseid kasutajalehtede isikupärastamiseks, kuid enamik täiendab neid traditsioonilise sisselogimis-/parooliliidesega. Kui saidile pääsetakse ligi brauserist, mis ei toeta küpsiseid, sisaldab leht vormi, kuhu kasutaja sisestab saidi esmakordsel külastamisel talle määratud registreerimisnime ja parooli. Tavaliselt on see vorm väike ja tagasihoidlik, et mitte hirmutada enamikku kasutajaid, kes pole huvitatud isikupärastamisest, vaid tahavad lihtsalt kaugemale minna. Pärast seda, kui kasutaja sisestab vormi sisselogimise ja parooli, leiab CGI faili selle kasutaja andmetega, nagu oleks nimi saadetud koos küpsisega. Seda meetodit kasutades saab kasutaja registreeruda isikupärastatud veebisaidile kõikjal maailmas.
Lisaks kasutaja eelistuste arvestamise ja tema kohta teabe pikaajalise säilitamise ülesannetele võib tuua peenema näite oleku salvestamisest, mille annavad populaarsed otsingumootorid. Kui otsite selliste teenustega nagu AltaVista või Yahoo, saate tavaliselt oluliselt rohkem tulemusi, kui on võimalik lihtsalt loetavas vormingus kuvada. Selle probleemi lahendamiseks kuvatakse väike arv tulemusi (tavaliselt 10 või 20) ja antakse mingisugune navigeerimisfunktsioon järgmise tulemuste rühma vaatamiseks. Kuigi see käitumine võib tavalisele veebirändurile tunduda tavaline ja ootuspärane, ei ole tegelik rakendamine triviaalne ja nõuab olekut.
Kui kasutaja esitab esimest korda otsingumootori päringu, kogub otsingumootor kõik tulemused, mis võib olla piiratud teatud eelmääratletud piiranguga. Trikk seisneb selles, et saada korraga väike arv tulemusi, jättes samal ajal meelde, milline kasutaja neid tulemusi taotles ja millist osa ta järgmisena ootab. Jättes kõrvale otsingumootori enda keerukuse, seisame silmitsi probleemiga pakkuda kasutajale järjestikku teavet ühel lehel. Mõelge näitele 9-4, mis näitab CGI-skripti, mis prindib failist välja kümme rida ja laseb sellel näha järgmist või eelmist kümmet rida.
Näide 9-4. Oleku salvestamine CGI-skriptis
#! / usr / bin / perl -w
kasutada CGI-d;
Ava (F, "/ usr / dict / words") või sure ("Ma ei saa avada! $!");
# See väljastatav fail võib olla ükskõik milline.
$ väljund = uus CGI;
sub print_range (# See on programmi põhifunktsioon, minu $ start = shift;
# Faili algusrida, minu $ count = 0;
# Osuti, minu $ rida = "";
# Faili praegune rida, prindi $ väljund-> päis,
$ output-> start_html ("Minu sõnastik");
#
Loob HTML-i pealkirjaga "Minu sõnastik", printige "
while (($ count< $start) and ($line =
# Jäta vahele kõik stardijoonele eelnevad read, while (($ count< $start+10) and
($line ?
#
Printige järgmised 10 rida.
minu $ uusnext = $ algus + 10; minu $ uuseelmine = $ algus-10;
# Määrake URL-ide jaoks algsed read "Järgmine" ja "Eelmine",
printida"
";
välja arvatud juhul, kui ($ algus == 0) (# Lisage "Eelmine" URL, kui ainult teie
# ei ole enam alguses.
print qq% Eelmine%; )
välja arvatud juhul, kui (eof) (# Lisage "Järgmine" URL, kui ainult teie #
mitte faili lõpus.
print qq% Järgmine%;
}
print "HTML;HTML
väljapääs (0); )
# Kui andmed pole saadaval, alustage otsast,
if (mitte $ output-> param) (
& printimisvahemik (0); )
# Vastasel juhul alustage andmetes määratud realt.
& print_range ($ väljund-> param ("start"));
Selles näites toimub oleku meeldejätmine kõige lihtsama meetodi abil. Andmete salvestamisega pole probleeme, kuna hoiame neid failis serveris. Peame ainult teadma, kust väljundit alustada, nii et skript sisaldab lihtsalt URL-i järgmise või eelmise ridade rühma alguspunkti – kõike seda, mida on vaja järgmise lehe loomiseks.
Kui aga vajate enamat kui lihtsalt faili ümberpööramist, võib URL-ile tuginemine olla tülikas. Seda raskust saab leevendada HTML-vormingu abil ja olekuteabe lisamisega siltidesse. tippige HIDDEN. Seda tehnikat on edukalt kasutatud paljudel saitidel, mis võimaldab luua linke seotud CGI programmide vahel või laiendada ühe CGI programmi kasutamist, nagu eelmises näites. Selle asemel, et linkida konkreetse objektiga, näiteks avalehega, võivad URL-i andmed osutada automaatselt loodud kasutaja ID-le.
Nii töötavad AltaVista ja teised otsingumootorid. Esimesel otsingul luuakse kasutaja ID ja peidetakse see järgmistesse URL-idesse. See ID on seotud ühe või mitme päringutulemusi sisaldava failiga. URL-is on veel kaks asja: praegune asukoht tulemuste failis ja suund, milles soovite selles edasi liikuda. Need kolm väärtust on kõik, mida on vaja suurte otsingumootorite võimsate navigatsioonisüsteemide käitamiseks.
Midagi on siiski veel puudu. Meie näites kasutatud fail / usr / dieet / sõnad väga suur. Mis siis, kui jätame selle lugemise keskele, kuid tahame selle juurde hiljem tagasi tulla? Järgmise lehe URL-i meelde jätmata pole enam võimalust tagasi minna, isegi AltaVista ei luba seda. Kui taaskäivitate arvuti või alustate töötamist mõnest muust arvutist, ei saa te naasta eelmiste otsingutulemuste juurde ilma päringut uuesti sisestamata. See pikaajaline olekulisus on aga ülalpool käsitletud veebisaidi isikupärastamise keskmes ja tasub vaadata, kuidas seda ära kasutada. Näide 9-5 on näite 9-4 muudetud versioon.
Näide 9-5.
Stabiilne oleku meeldejätmine
#! / usr / bin / perl -w
kasutada CGI-d;
umask 0;
Ava (F, "/ usr / dict / words") või sure ("Ma ei saa avada! $!");
Chdir ("kasutajad") või die ("Ma ei saa $ kataloogi minna!");
#
See on kataloog, kuhu kõik andmed salvestatakse.
# kasutaja kohta.
Väljund = uus CGI;
if (mitte $ output-> param) (
print $ väljund-> päis,
$ output-> start_html ("Minu sõnastik");
print "HTML;