PHP पाठ – पाठ 3.5 – MySQL डेटाबेस के साथ कार्य। JOIN ऑपरेटर। सर्वर पर फ़ाइल अपलोड करना।
इस पाठ को लिखना शुरू करने से पहले, मैंने लंबे समय तक सोचा कि JOIN ऑपरेटर वाले क्वेरीज़ को सबसे अच्छे तरीके से कैसे समझाया जाए। बात यह है कि JOIN ऑपरेटर का उपयोग कई तालिकाओं से एक साथ डेटा चयन करने के लिए किया जाता है। और चूंकि हमें एक और तालिका की आवश्यकता होगी, तो चलिए उसे बनाते हैं। मैं सुझाव देता हूँ कि हम एक तालिका बनाएँ जहाँ हम इस पाठ में फॉर्म के माध्यम से अपलोड की जाने वाली फ़ाइलों को सहेजेंगे। इस प्रकार यह पाठ दो दिशाओं में विभाजित होगा — डेटाबेस (DB) के साथ कार्य और फॉर्म्स के साथ कार्य।
आइए फ़ाइल अपलोड करने के लिए एक फ़ील्ड जोड़ने से शुरू करें। ताकि फॉर्म फ़ाइलें अपलोड कर सके, हमें इसके पैरामीटर में एक विशेष प्रकार जोड़ना होगा:
$content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">';
इस प्रकार, enctype पैरामीटर के माध्यम से हम ब्राउज़र को बताते हैं कि यह फॉर्म फ़ाइलें अपलोड करेगा। अब जब फॉर्म तैयार है, तो आइए फ़ाइल अपलोड फ़ील्ड जोड़ें:
public function display_admin() { // संदेश इनपुट करने की विधि $content = ''; $content .= '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; $content .= '<label for="title">नाम:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" />'; $content .= '<div class="clear"></div>'; $content .= '<label for="bodytext">संदेश:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext"></textarea>'; $content .= '<input type="file" name="filename">'; // फ़ाइल अपलोड फ़ील्ड $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="संदेश जोड़ें" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">मुख्य पृष्ठ पर वापस जाएँ</a></p>'; return $content; }
input
टाइप file
के माध्यम से हम अपनी फ़ाइल अपलोड करेंगे। यदि आप कोड को सहेजते हैं और संदेश जोड़ने वाले पृष्ठ को रीफ़्रेश करते हैं, तो आपको फ़ाइल अपलोड करने का फ़ील्ड दिखाई देना चाहिए।
अब देखते हैं कि POST अनुरोध में फ़ाइल किस प्रकार भेजी जाती है:
public function write($p) { print_r($p); // फॉर्म का ऐरे प्रिंट करें print_r($_FILES); // फ़ाइल ऐरे प्रिंट करें $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')'; return mysql_query($sql); }
अब हम किसी फ़ाइल को अपलोड करते हैं और संदेश सहेजते हैं। सभी फ़ाइलें जो फॉर्म के माध्यम से अपलोड की जाएँगी, वे सुपरग्लोबल वेरिएबल $_FILES
में उपलब्ध होंगी। मैंने एक फ़ाइल अपलोड की और ये ऐरे प्राप्त हुए:
Array ( [title] => asfasdf [bodytext] => asfasdf ) Array ( [filename] => Array ( [name] => ip.txt [type] => text/plain [tmp_name] => Y:\tmp\phpAA.tmp [error] => 0 [size] => 13 ) )
अब जब हमारे पास डेटा और फ़ाइल दोनों के ऐरे हैं, तो आइए एक Files तालिका बनाएँ ताकि हम अपलोड की गई फ़ाइलों को सहेज सकें। शुरुआत में साइट की रूट में एक files नामक फ़ोल्डर बनाएँ। यदि आप Linux सर्वर या होस्टिंग पर काम कर रहे हैं, तो इस फ़ोल्डर को 777 अनुमति दें ताकि स्क्रिप्ट इस फ़ोल्डर में फ़ाइलें सहेज सके।
अब हम buildDB()
विधि में तालिका निर्माण क्वेरी को बदलेंगे:
$sql = "CREATE TABLE Messages ( mid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(mid), title varchar(15), bodytext text, created int(11), file int(11), ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; CREATE TABLE Files ( fid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(fid), filename varchar(255), filepath varchar(255), filemime varchar(255), filesize int(10), timestamp int(10), )ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";
नई तालिका जोड़ने के अलावा, हमने Messages तालिका में fid नामक एक फ़ील्ड भी जोड़ा है जो Files तालिका के लिए एक विदेशी कुंजी (foreign key) का कार्य करेगा। नई Files तालिका में निम्नलिखित फ़ील्ड होंगे:
fid — तालिका की प्राथमिक कुंजी (Primary Key), यानी फ़ाइल का क्रमांक।
filename — फ़ाइल का नाम।
filepath — वेबसाइट की रूट से फ़ाइल का पथ।
filemime — फ़ाइल का MIME प्रकार, जिससे उसके उपयोग और एक्सटेंशन का पता चलता है (जैसे text/plain, image/jpg, image/png आदि)।
filesize — फ़ाइल का आकार (बाइट्स में)।
timestamp — फ़ाइल अपलोड होने का समय।
अब फ़ाइल को सहेजने और डेटाबेस में जोड़ने की क्वेरी लिखते हैं। आवश्यक फ़ील्ड आप phpMyAdmin से बना सकते हैं।
if($_FILES["filename"]["size"] > 1024*3*1024) { echo ("फ़ाइल का आकार तीन मेगाबाइट से अधिक है"); exit; } // जाँचें कि फ़ाइल वास्तव में अपलोड हुई है या नहीं if(is_uploaded_file($_FILES["filename"]["tmp_name"])) { // यदि फ़ाइल सफलतापूर्वक अपलोड हुई, तो इसे // अस्थायी डायरेक्टरी से गंतव्य में स्थानांतरित करें move_uploaded_file($_FILES["filename"]["tmp_name"], "/files/".$_FILES["filename"]["name"]); } else { echo("फ़ाइल अपलोड में त्रुटि"); }
इस प्रकार हम फ़ाइल को files फ़ोल्डर में सहेजते हैं। अब सफल अपलोड के बाद, हम डेटाबेस में Files तालिका में प्रविष्टि जोड़ते हैं:
$sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) VALUES ("'. $_FILES['filename']['name'] . '", "files/' . $_FILES['filename']['name'] . '", "'. $_FILES['filename']['type'] .'", '. $_FILES['filename']['size'] .', '. time() . ')'; mysql_query($sql);
अब जब हमने फ़ाइल का रिकॉर्ड डेटाबेस में जोड़ दिया है, तो हमें संदेश भी जोड़ना होगा। Messages में जोड़ने की क्वेरी को थोड़ा बदलेंगे ताकि उसमें fid फ़ील्ड भी शामिल हो:
$sql = 'INSERT INTO Messages (title, bodytext, created, fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ',LAST_INSERT_ID())';
यहाँ LAST_INSERT_ID()
फ़ंक्शन पर ध्यान दें — यह MySQL फ़ंक्शन है जो डेटाबेस में किसी भी तालिका में जोड़ी गई अंतिम प्रविष्टि का ID लौटाता है। हमारे मामले में यह ID Files तालिका से आएगा।
अब हमारे रिकॉर्ड डेटाबेस में जुड़ जाते हैं, अब हमें उन्हें JOIN ऑपरेटर की मदद से प्रदर्शित करना है। आइए संदेशों को प्रदर्शित करने की क्वेरी बदलें ताकि फ़ाइल का नाम भी दिखाई दे:
public function display_public() { // संदेश प्रदर्शित करने की विधि $content = ''; $sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC'; $result = mysql_query($sql) or die(mysql_error()); ...
यहाँ JOIN ऑपरेटर को मैंने LEFT के साथ उपयोग किया है। दरअसल, तालिकाओं का संयोजन कई तरीकों से किया जा सकता है, जिन्हें हम अगले पाठों में विस्तार से देखेंगे। फिलहाल यह समझना पर्याप्त है कि LEFT JOIN सभी रिकॉर्ड प्रदर्शित करता है, यहाँ तक कि जिनमें fid मौजूद नहीं है।
अब यदि हम क्वेरी का ऐरे प्रिंट करें:
public function display_public() { // संदेश प्रदर्शित करने की विधि $content = ''; $sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC'; $result = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_array($result)){ // क्वेरी परिणाम को विशेष फ़ंक्शन mysql_fetch_array() से प्रोसेस करें print_r($row);
तो हम देखेंगे कि आउटपुट में Messages और Files दोनों तालिकाओं के डेटा हैं। यदि संबंधित फ़ाइल नहीं है, तो फ़ाइल फ़ील्ड खाली रहेगा, इसलिए हमें उन्हें PHP से जाँचना चाहिए:
if(!empty($row['filename'])){ $content .= '<p>संलग्नक: <a target="_blank" href="/'. $row['filepath'] .'">'. $row['filename'] .'</a></p>'; }
अब संदेश के साथ-साथ अपलोड की गई फ़ाइल का लिंक भी दिखाई देगा। अगले पाठ में हम JOIN ऑपरेटर को और विस्तार से समझेंगे, जो हमें एक साथ कई तालिकाओं से डेटा प्रदर्शित करने देता है। साथ ही, मैं अब प्रत्येक पाठ के साथ phpMyAdmin से प्राप्त अद्यतन डेटाबेस डंप भी संलग्न करूँगा।