PHP पाठ – पाठ 3.2 – MySQL डेटाबेस के साथ कार्य। डेटा जोड़ना (INSERT INTO)। डेटा चयन करना (SELECT)।
पिछले पाठ में हमने अपनी वेबसाइट के लिए एक तालिका बनाई थी। इस पाठ में हम अपनी तालिका को बेहतर बनाएँगे और डेटाबेस के साथ काम करना शुरू करेंगे — उसमें डेटा जोड़ेंगे और उससे डेटा प्राप्त करेंगे। मुझे नहीं लगता कि इसमें कुछ कठिन होगा, तो चलिए शुरू करते हैं।
सबसे पहले, मैं सुझाव देता हूँ कि हम अपनी तालिका messages को बेहतर बनाएँ। वर्तमान में इसमें डेटा फ़ील्ड हैं, लेकिन हमें रिकॉर्ड की क्रम संख्या के लिए एक अतिरिक्त फ़ील्ड की आवश्यकता है। यदि आप Drupal की डेटाबेस तालिका देखें, तो वहाँ node तालिका में nid नामक फ़ील्ड होता है, जिसके माध्यम से नोड्स को क्रमांकित किया जाता है। हमें भी अपनी messages तालिका में ऐसा ही एक फ़ील्ड जोड़ना होगा।
आइए phpMyAdmin खोलें (उदाहरण के लिए, http://localhost/tools/phpmyadmin यदि आप Denwer का उपयोग कर रहे हैं) और अपनी तालिका को संपादित करें। तालिका की शुरुआत में एक नया कॉलम जोड़ें, जैसा नीचे चित्र में दिखाया गया है:
इस कॉलम को mid (message id) नाम दें, डेटा प्रकार INT रखें और लंबाई 11 प्रतीक। साथ ही AUTO_INCREMENT विकल्प पर टिक लगाएँ — इसका अर्थ है कि यह कॉलम स्वचालित रूप से प्रत्येक नई पंक्ति के लिए 1 से बढ़ेगा। इसके अलावा, Index फ़ील्ड में PRIMARY सेट करें, ताकि यह तालिका की प्राथमिक कुंजी (Primary Key) बन जाए।
यदि आपको याद हो, तो हमने अपनी simpleCMS क्लास में तालिका बनाने के लिए एक अलग मेथड बनाया था। अब हमें इस मेथड को संशोधित करना होगा ताकि वह mid फ़ील्ड भी जोड़े। phpMyAdmin में messages तालिका खोलें और Export पर क्लिक करें:
हम तालिका एक्सपोर्ट पृष्ठ पर पहुँचेंगे। एक्सपोर्ट SQL क्वेरी के रूप में किया जाता है जो तालिका के निर्माण और संशोधन के लिए उपयोग होती हैं। phpMyAdmin में तालिका को बदलने के बाद हम उसके निर्माण का SQL कोड आसानी से कॉपी कर सकते हैं — यह बहुत उपयोगी है।
एक्सपोर्ट पृष्ठ पर सभी सेटिंग्स डिफ़ॉल्ट पर छोड़ें और OK दबाएँ। PhpMyAdmin आपको SQL क्वेरी ब्राउज़र में या एक फ़ाइल के रूप में दिखाएगा। दोनों ही तरीके हमारे लिए उपयुक्त हैं। हमें इस कोड को कॉपी करना होगा:
ध्यान दें कि phpMyAdmin में बैकटिक (`) का उपयोग होता है। PHP में हम सामान्य एकल उद्धरण (‘ ’) का उपयोग कर सकते हैं। इस कोड को अपने buildDB() मेथड में कॉपी करें:
public function buildDB(){ $sql = "CREATE TABLE IF NOT EXISTS 'messages' ( 'mid' int(11) NOT NULL AUTO_INCREMENT, 'title' varchar(150) DEFAULT NULL, 'bodytext' text, 'created' varchar(100) DEFAULT NULL, PRIMARY KEY ('mid') ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; return mysql_query($sql); }
अब आइए देखें यह कैसे काम करता है। पहले हम तालिका messages को हटा देंगे:
हटाने की पुष्टि करें। अब जब हम अपने साइट पर index.php चलाएँगे, तो buildDB() मेथड चलकर तालिका को पुनः बनाएगा।
public function buildDB(){ $sql = "CREATE TABLE Messages ( mid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(mid), title varchar(15), bodytext text, created int(11) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; $result = mysql_query($sql); print_r($result); }
अब जब हम index.php चलाते हैं, तो तालिका Messages फिर से बन जाती है, जैसे पहले थी।
INSERT INTO क्वेरी — डेटा जोड़ना
अब डेटाबेस बन गया है, तो हम संदेशों को डेटाबेस में जोड़ने और दिखाने के लिए अपने मेथड्स बनाएँगे। चलिए डेटा जोड़ने से शुरू करते हैं। इसके लिए write() मेथड खोलें और उसमें बदलाव करें।
डेटा जोड़ने के लिए हम SQL ऑपरेटर INSERT INTO का उपयोग करेंगे:
public function write($p) { // संदेश जोड़ने की मेथड $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')'; return mysql_query($sql); }
अब समझते हैं यह क्वेरी कैसे काम करती है। जैसा कि पहले बताया गया, क्वेरी INSERT INTO से शुरू होती है, फिर तालिका का नाम (Messages) दिया जाता है। उसके बाद कॉलमों की सूची दी जाती है, जहाँ हम डेटा डालना चाहते हैं। ध्यान दें कि हमने यहाँ mid नहीं लिखा क्योंकि उसका मान MySQL स्वचालित रूप से जोड़ता है (क्योंकि हमने AUTO_INCREMENT सक्षम किया है)। फिर आता है VALUES कीवर्ड, जिसके बाद हम प्रत्येक कॉलम के मान देते हैं। कॉलम और मानों का क्रम समान होना चाहिए।
यदि कोई मान स्ट्रिंग प्रकार का है, तो उसे उद्धरण चिह्नों (“ ”) में रखें। ध्यान रखें कि SQL क्वेरी स्वयं एकल उद्धरण (‘ ’) में लिपटी हुई है, इसलिए स्ट्रिंग मानों के लिए हमें डबल उद्धरण (“ ”) का उपयोग करना चाहिए, जैसे:
"'. $p["title"] . '"
क्वेरी में उद्धरणों का क्रम होगा: डबल, एकल, डॉट, वेरिएबल, डॉट, एकल, डबल।
यह एक उदाहरण के लिए पर्याप्त है। हम आगे और अभ्यास करेंगे। अब चलिए तालिका में कुछ रिकॉर्ड जोड़ते हैं — इसके लिए ऊपर दिए गए कोड को अपने write() मेथड में डालें।
SELECT क्वेरी — डेटा चयन करना
कुछ पंक्तियाँ जोड़ने के बाद, उन्हें phpMyAdmin में देखें:
अब हम इन रिकॉर्ड्स को डेटाबेस से दिखा सकते हैं। इसके लिए display_public() मेथड में बदलाव करें और SELECT क्वेरी का उपयोग करें:
public function display_public() { // संदेश प्रदर्शित करने की मेथड $content = ''; $sql = 'SELECT * FROM Messages'; // चयन क्वेरी $result = mysql_query($sql); // क्वेरी परिणाम को वेरिएबल में सहेजें while($row = mysql_fetch_array($result)){ // परिणाम को पंक्ति दर पंक्ति प्रोसेस करें print '<div class="post">'; print '<span class="time">#' . $row['mid'] . ' दिनांक ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; print '<p>' . $row['bodytext'] . '</p>'; print '</div>'; } $content .= '<p><a href="/index.php?admin=1">संदेश जोड़ें</a></p>'; return $content; }
अब सभी संदेश डेटाबेस से प्रदर्शित होंगे। चलिए इसे समझते हैं। SELECT क्वेरी * (asterisk) का उपयोग करती है, जो दर्शाता है कि हम सभी कॉलम चुनना चाहते हैं। यदि हम केवल कुछ कॉलम चाहते हैं, तो लिख सकते हैं:
$sql = 'SELECT mid,title FROM Messages'; $result = mysql_query($sql);
इस स्थिति में केवल mid और title चुने जाएँगे।
FROM ऑपरेटर यह निर्धारित करता है कि डेटा किस तालिका से लिया जाएगा।
mysql_query() का परिणाम एक वेरिएबल में सहेजना आवश्यक है क्योंकि उसे बाद में mysql_fetch_array() से प्रोसेस किया जाएगा। यह फ़ंक्शन प्रत्येक कॉल पर एक-एक पंक्ति का ऐरे लौटाता है, जब तक कि पंक्तियाँ समाप्त नहीं हो जातीं। इसके बाद यह false लौटाता है, इसलिए हम इसके लिए while लूप का उपयोग करते हैं।
ORDER BY — डेटा को क्रम में लाना
हम डेटा को क्रमबद्ध भी कर सकते हैं। इसके लिए ORDER BY ऑपरेटर का उपयोग करें। डिफ़ॉल्ट रूप से यह आरोही (ascending) क्रम में सॉर्ट करता है:
$sql = 'SELECT * FROM Messages ORDER BY mid';
उतरते क्रम में (descending) सॉर्ट करने के लिए DESC का उपयोग करें:
$sql = 'SELECT * FROM Messages ORDER BY mid DESC';
आरोही क्रम स्पष्ट रूप से बताने के लिए ASC भी लिखा जा सकता है:
$sql = 'SELECT * FROM Messages ORDER BY mid ASC';
हालाँकि यह डिफ़ॉल्ट रूप से लागू होता है।
WHERE — चयन शर्तें
हम चयन को फ़िल्टर करने के लिए WHERE शर्त का उपयोग भी कर सकते हैं:
$sql = 'SELECT * FROM Messages WHERE mid<3 ORDER BY mid DESC';
इस प्रकार हम केवल पहले दो रिकॉर्ड (mid=1 और mid=2) प्राप्त करेंगे, यदि वे मौजूद हैं।
हम कई शर्तें जोड़ सकते हैं और AND तथा OR ऑपरेटरों का उपयोग कर सकते हैं।
$limit_time = time() - 3600; // एक घंटा पहले का समय $sql = 'SELECT * FROM Messages WHERE mid<3 AND created>' . $limit_time . ' ORDER BY mid DESC';
इस प्रकार हम एक अतिरिक्त शर्त जोड़ते हैं कि संदेश एक घंटे से पहले नहीं बनाया गया हो। फिलहाल चयन (SELECT) क्वेरीज़ के लिए इतना काफी है। अब हम अगले पाठ पर चलते हैं।