PHP पाठ – पाठ 2 – फ़ाइलों के साथ कार्य: खोलना, लिखना, पढ़ना।
पिछले पाठ में हमने अपनी गेस्टबुक, ब्लॉग या चैट के लिए एक ढांचा (framework) तैयार किया था। अब हमें केवल उसमें कार्यक्षमता जोड़नी है। इस पाठ में हम अपनी प्रविष्टियों (entries) को फ़ाइलों में लिखेंगे और फिर उन फ़ाइलों से पढ़ेंगे।
PHP में फ़ाइलों के साथ काम करने के लिए कई फ़ंक्शन उपलब्ध हैं। हम उनमें से कुछ ही देखेंगे, क्योंकि वास्तविक वेबसाइट आमतौर पर डेटा को डेटाबेस (DB) में सहेजती है, न कि फ़ाइलों में। लेकिन मूल सिद्धांत को समझने के लिए हम फ़ाइल विधियों पर ध्यान देंगे। डेटाबेस पर काम हम अगले पाठों में सीखेंगे।
यदि आपके पास पिछले पाठ के फ़ाइलें नहीं हैं, तो पहले उस पाठ पर जाएँ और उन्हें डाउनलोड करें।
अब आइए "रिकॉर्ड जोड़ने" फॉर्म पर जाएँ:
/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 केवल नियंत्रक (controller) के रूप में काम करेगा, और डेटा की प्रोसेसिंग तथा आउटपुट simpleCMS क्लास के माध्यम से होगी। यह विभाजन कोड की पठनीयता और रखरखाव को बेहतर बनाता है।
चलो सबसे पहले साधारण तरीके से शुरू करते हैं — फॉर्म से आने वाले डेटा को प्रिंट करते हैं।
public function write($p) { // संदेश लिखने की विधि print_r($p); }
जैसा कि आप देख सकते हैं, हम स्थानीय वेरिएबल $p का उपयोग कर रहे हैं, भले ही डेटा $_POST सुपरग्लोबल से आया हो। ऐसा इसलिए क्योंकि भविष्य में हम यह डेटा किसी XML फ़ाइल से या API से भी प्राप्त कर सकते हैं।
फॉर्म भरें और सबमिट करें। मेरे मामले में मुझे यह आउटपुट मिला:
Array ( [title] => Иван [bodytext] => Привет, Мир! )
यदि आपके मान अलग हैं, तो ऐरे भी अलग होगा। हमने यह इसलिए प्रिंट किया ताकि हम जान सकें कि कौन से कीज़ (keys) हैं — यहाँ हमारे पास $p['title'] और $p['bodytext'] हैं। अब इन्हें फ़ाइल में सहेजते हैं।
PHP में फ़ाइल में लिखना (Writing to file)
फ़ाइल में कुछ लिखने से पहले, हमें उसे “लिखने के लिए खोलना” होता है। इसका मतलब है कि फ़ाइल को PHP की एक वेरिएबल से जोड़ा जाए। PHP में फ़ाइल पर सभी क्रियाएँ resource टाइप वेरिएबल पर की जाती हैं। उदाहरण:
public function write($p) { // संदेश लिखने की विधि $message = fopen("messages/file.txt","w"); print_r($message); }
मैंने messages नामक फोल्डर में file.txt बनाया है। यदि आप फॉर्म सबमिट करते हैं, तो आउटपुट होगा:
Resource id #4
Resource PHP में एक विशेष प्रकार का डेटा है, जो किसी बाहरी फ़ाइल या कनेक्शन को दर्शाता है। अब हम इस वेरिएबल के माध्यम से फ़ाइल में डेटा लिख सकते हैं।
public function write($p) { $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); }
\r\n नई पंक्ति (newline) का प्रतीक है। परिणामस्वरूप फ़ाइल में यह लिखा जाएगा:
Иван
Привет, Мир!
फ़ाइल पर काम पूरा होने के बाद, हमें उसे बंद करना चाहिए ताकि मेमोरी खाली हो जाए:
public function write($p) { $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); fclose ($message); // फ़ाइल बंद करें }
ध्यान दें, प्रत्येक बार जब हम यह कोड चलाते हैं, तो फ़ाइल पुनः लिखी जाती है। यह fopen() में दिए गए पैरामीटर पर निर्भर करता है। हम फ़ाइल को पढ़ने या जोड़ने (append) के लिए भी खोल सकते हैं:
$message = fopen("messages/file.txt","r"); // केवल पढ़ने के लिए
- r – केवल पढ़ने के लिए खोलता है।
- r+ – पढ़ने और लिखने दोनों के लिए।
- w – नया खाली फ़ाइल बनाता है, यदि फ़ाइल मौजूद है तो उसकी सामग्री मिटा देता है।
- w+ – पढ़ने और लिखने दोनों के लिए, लेकिन पहले फ़ाइल खाली कर देता है।
- a – फ़ाइल को जोड़ने (append) के लिए खोलता है, लिखाई हमेशा फ़ाइल के अंत में होती है।
- a+ – पढ़ने और जोड़ने (append) दोनों के लिए।
यदि हम w मोड का उपयोग करते हैं, तो PHP नया फ़ाइल बनाता है। चलिए प्रत्येक संदेश को समय के आधार पर यूनिक नाम से सहेजते हैं:
time() फ़ंक्शन 1 जनवरी 1970 से अब तक के सेकंड्स लौटाता है।
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); }
अब प्रत्येक नई प्रविष्टि के लिए समय का उपयोग फ़ाइल नाम के रूप में होगा, जिससे हर फ़ाइल का नाम अलग होगा।
PHP में फ़ाइल पढ़ना (Reading from file)
फ़ाइल पढ़ने के लिए हमें उसे पढ़ने के मोड r में खोलना होता है। सभी फ़ाइलें messages फ़ोल्डर में हैं, और हम उन्हें एक-एक करके पढ़ेंगे। इसके लिए हम while लूप और opendir() का उपयोग करेंगे:
if (is_dir('messages')) { if ($dh = opendir('messages')) { while (($file = readdir($dh)) !== false) { // आवश्यक क्रियाएँ } closedir($dh); } }
readdir() प्रत्येक बार एक फ़ाइल का नाम लौटाता है। काम पूरा होने पर closedir() से फ़ोल्डर बंद कर दें।
अब इसे अपने मेथड display_public() में उपयोग करते हैं:
public function display_public() { $content = ''; if (is_dir('messages')) { if ($dh = opendir('messages')) { while (($file = readdir($dh)) !== false) { if(substr($file, -4) == '.txt'){ $filename = 'messages/' . $file; $message = fopen($filename, 'r'); $title = fgets($message); $body = fgets($message); $time = fgets($message); print '<div class="post">'; print '<span class="time">' . date('d-m-Y', $time) . '</span><h2>' . $title . '</h2>'; print '<p>' . $body . '</p>'; print '</div>'; fclose($message); } } closedir($dh); } } $content .= '<p><a href="/index.php?admin=1">संदेश जोड़ें</a></p>'; return $content; }
मैंने प्रत्येक लाइन पर टिप्पणी दी है ताकि आप समझ सकें कि क्या हो रहा है।
संभावना है कि आपको व्यावहारिक रूप से फ़ाइल-पंक्ति पढ़ने की आवश्यकता न हो, लेकिन PHP में फ़ाइल और डायरेक्टरी हैंडलिंग को समझने के लिए यह अभ्यास अत्यंत उपयोगी है।
नीचे इस चरण का पूर्ण कोड दिया गया है।