PHP Դասեր - Դաս 2 - Աշխատանք ֆայլերի հետ՝ բացում, գրառում, ընթերցում
Նախորդ դասում մենք ստեղծեցինք կմախք մեր հյուրերի գրքի, բլոգի կամ չատի համար։ Այժմ մնում է միայն ավելացնել ֆունկցիոնալը։ Այս դասում մենք գրառումները կգրենք ֆայլերի մեջ և կարտածենք գրառումները ֆայլերից։
PHP-ում կան բազմաթիվ ֆունկցիաներ ֆայլերի հետ աշխատելու համար։ Մենք կդիտարկենք դրանցից որոշները, քանի որ ամենայն հավանականությամբ ձեր կայքը տվյալները կգրի տվյալների բազա (ես դրանում վստահ եմ), ոչ թե ֆայլերի մեջ։ Ուստի մենք կդիտարկենք միայն որոշ ֆունկցիաներ՝ որպեսզի դուք հասկանաք էությունը։ Իսկ տվյալների բազայի հետ աշխատանքը մենք կդիտարկենք ավելի ուշ։
Ուրեմն, եթե չունեք այն ֆայլերը, որոնք ստեղծել ենք նախորդ դասում, վերադարձեք մեկ դաս հետ և ներբեռնեք այդ ֆայլերը։
Եկեք անցնենք գրառման ավելացման ձևին՝
/index.php?admin=1
Այս ձևից մենք կավելացնենք մեր գրառումները։ Այս գրառումները մշակելու համար մեզ անհրաժեշտ է index.php էջում (այդ էջին է ուղարկվում տվյալները ձևից) ստուգել՝ արդյոք $_POST փոփոխականում արժեքներ կան։ Դա ստուգվում է շատ պարզ կերպով՝
if($_POST){ }
Չէ՞ որ պարզ է։ Այժմ փաթեթավորող փակագծերի մեջ պետք է տեղադրել $_POST զանգվածի մշակումը։ Մենք չենք գրելու մշակման կոդը ուղիղ փակագծերի մեջ, այլ այն կտեղադրենք մեր դասի մեջ որպես մեթոդ, իսկ մշակումը կանչելու ենք օբյեկտի մեթոդի միջոցով։ index.php ֆայլում կանչում ենք մեթոդը՝
if($_POST){ $obj->write($_POST); }
Իսկ simpleCMS.php ֆայլում մենք կունենանք write() մեթոդի իրագործումը՝
public function write($p) { // հաղորդագրության գրանցման մեթոդ }
Ինչու՞ ենք դա անում։ Որպեսզի կրճատենք index.php ֆայլում գրած կոդը։ index.php ֆայլը անհրաժեշտ է միայն կառավարման համար, իսկ զանգվածների մշակումն ու տվյալների արտածումը պետք է իրականացվի այլ ֆայլից, օրինակ՝ մեր simpleCMS դասի ֆայլից։ Այս տարանջատումը թույլ է տալիս բարձրացնել կոդի արդյունավետությունը։ Եթե որևէ մեկը նայի մեր կոդին, նա միանգամից կհասկանա՝ որտեղ ինչ կա։ Իսկ ձեզ համար էլ ավելի հեշտ կլինի կողմնորոշվել, երբ ամեն ինչ իր տեղում է։
Եկեք սկսենք մշակումը պարզից՝ տպենք $_POST զանգվածը, որը փոխանցվում է ձևից։ Դրա համար պետք է տեղադրել այս կոդը՝
public function write($p) { // հաղորդագրության գրանցման մեթոդ print_r($p); }
Ինչպես տեսնում եք՝ մենք դիմում ենք տեղային $p փոփոխականին, չնայած մեթոդի պարամետրերի մեջ փոխանցվում է գլոբալ փոփոխական։ Մենք անմիջապես չենք աշխատում գլոբալ փոփոխականի հետ, քանի որ հետագայում կարող ենք ցանկանալ գրառում կատարել ոչ թե ձևից, այլ օրինակ XML ֆայլից տվյալներ ստանալով։ Տեղային փոփոխականի օգտագործումը թույլ է տալիս մեզ ունիվերսալացնել այս մեթոդի կիրառումը՝ դարձնելով այն ընդհանուր տարբեր դեպքերի համար։
Եկեք լրացնենք ձևը և ուղարկենք։ Ինձ մոտ ստացվեց այսպիսի տվյալներ՝
Array ( [title] => Իվան [bodytext] => Բարև, Աշխարհ! )
Եթե դուք այլ բան եք լրացրել, ապա զանգվածն էլ տարբեր կլինի։ Մենք արտածեցինք զանգվածը՝ որպեսզի տեսնենք որ բանալիներն ենք կարող օգտագործել։ Մեզ մոտ դրանք են՝ $p['title'] և $p['bodytext']։ Այժմ մենք գիտենք՝ ինչ տվյալներ ունենք, մնում է դրանք գրել ֆայլի մեջ։ Եկեք սկսենք գրառումից։
PHP՝ Գրառում ֆայլի մեջ
Մինչ որևէ բան գրելը ֆայլի մեջ, անհրաժեշտ է «բացել ֆայլը գրառման համար»։ Բացել ֆայլը գրառման համար նշանակում է՝ կապել ֆայլը PHP փոփոխականի հետ։ Ֆայլի հետ ամբողջ աշխատանքը PHP-ում ծավալվում է resource տիպի փոփոխականի հետ։ Հիմա ցույց կտամ՝ ինչ է դա նշանակում՝
public function write($p) { // հաղորդագրության գրանցման մեթոդ $message = fopen("messages/file.txt","w"); print_r($message); }
Դրա համար ես ստեղծել եմ file.txt ֆայլը messages պանակի մեջ։ Եվ հիմա, եթե լրացնենք ձևը և ուղարկենք այն, ապա կստանանք՝
Resource id #4
Resource-ը փոփոխական $message-ի տիպն է, իսկ 4-ը դրա հերթական համարն է՝ id-ն մյուս resource տիպի փոփոխականների շարքում։ Եվ հիմա, եթե մենք գործողություններ կատարենք $message փոփոխականի հետ, ապա դա կարտացոլվի ֆայլի մեջ։ Մենք կգրենք ֆայլը տող առ տող, որպեսզի հետագայում նույնպես կարողանանք տող առ տող կարդալ այն՝
public function write($p) { // հաղորդագրության գրանցման մեթոդ $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); }
\r\n սիմվոլները կրկնակի չակերտների մեջ (միակի դեպքում կարող են չաշխատել) նշանակում են նոր տողի անցում։ Արդյունքում՝ file.txt ֆայլում կլինի այսպիսի տեքստ՝
Իվան
Բարև, Աշխարհ!
Այն բանից հետո, երբ բոլոր գործողությունները կատարվեն ֆայլի հետ, անհրաժեշտ է փակել ֆայլի փոփոխականը՝ որպեսզի այն չզբաղեցնի օպերատիվ հիշողություն։
public function write($p) { // հաղորդագրության գրանցման մեթոդ $message = fopen("messages/file.txt","w"); // բացում ենք ֆայլը fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); fclose ($message); //փակում ենք ֆայլը }
Հավանաբար նկատեցիք՝ որ ամեն անգամ երբ մենք նորից գրում ենք ֆայլը, այն վերագրվում է։ Դա կախված է fopen ֆունկցիայի պարամետրից։ Մենք կարող ենք նաև լրացնել ֆայլը կամ պարզապես բացել այն ընթերցման համար։ Օրինակ՝ այսպես՝
$message = fopen("messages/file.txt","r"); // բացում ենք ֆայլը միայն ընթերցման համար
- r – բացում է ֆայլը միայն ընթերցման համար։
- r+ - բացում է ֆայլը ընթերցման և գրառման համար։
- w – ստեղծում է նոր դատարկ ֆայլ։ Եթե այդ պահին այդ անունով ֆայլ արդեն կա՝ այն ջնջվում է։
- w+ - նման է r+֊ին, սակայն եթե ֆայլը գոյություն ունի, նրա բովանդակությունը ջնջվում է։
- a – բացում է գոյություն ունեցող ֆայլը գրառման ռեժիմով՝ ցուցիչը տեղափոխելով վերջին բայթին։
- a+ - բացում է ֆայլը ընթերցման և գրառման ռեժիմով՝ ցուցիչը տեղափոխելով վերջին բայթին։ Ֆայլի բովանդակությունը չի ջնջվում։
Ինչպես նշված է վերևում, եթե մենք բացում ենք ֆայլը w պարամետրով, ապա ստեղծվում է նոր ֆայլ՝ անվանմամբ, որը վերցվում է առաջին պարամետրից։ Եկեք ստեղծենք ֆայլի անունը՝ ըստ ժամանակի, որը վերադարձվում է time() ֆունկցիայի միջոցով։
time() ֆունկցիան վերադարձնում է վայրկյանների քանակը 1970 թվականի հունվարի 1-ից սկսած։
Ձեզ մոտ պետք է ստացվի հետևյալը՝
public function write($p) { // հաղորդագրության գրանցման մեթոդ $message = fopen('messages/'.time(),"w"); // բացում ենք ֆայլը fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']. "\r\n"); fputs ($message, time()); fclose ($message); //փակում ենք ֆայլը }
Այսպիսով՝ ամեն վայրկյան time() ֆունկցիան վերադարձնում է ավելի մեծ թիվ, և ֆայլերի անունները կունենան աճող արժեք։ Կարող եք փորձել ավելացնել նոր գրառումներ՝ և նոր ֆայլեր կհայտնվեն messages պանակում։ Այժմ մնում է կարդալ ֆայլերը և արտածել մեր գրառումները։