WP Custom Query – wpdb Class में prepare() नाम का एक Method Define किया गया है, जो कि एक बहुत ही उपयोगी Method है। इस Method को Use करके हम किसी SQL Query में Pass किए जाने वाले Variables को Escape कर सकते हैं, ताकि SQL Injection Attack से अपनी Website को बचा सकें।
यानी हम हमारे WordPress Database पर जब भी कोई Custom Query Fire करना चाहते हैं, जिसमें किसी Variable में Stored Value के आधार पर Query Perform होता है, तब हम इस प्रकार की Query को prepare() Method के बीच Enclose करते हैं और Query Fire करने से पहले सभी Custom Variables को इस बात के लिए Manually Check करते हैं कि उनमें Exactly उसी प्रकार का Data रहे, जिस प्रकार का Data उनमें होना चाहिए। इस प्रक्रिया को हम इसलिए Follow करते हैं, ताकि किसी भी तरह से SQL Injection Attack सम्भव न रहे।
उदाहरण के लिए यदि हम हमारे द्वारा Create की गई किसी User Registration Table में User द्वारा Web Form के माध्यम से आने वाले Data को Insert करना चाहते हैं, तो इस जरूरत को पूरा करने के लिए हमें INSERT Query Fire करना होगा।
चूंकि हम कभी भी User द्वारा Input किए गए Data पर भरोसा नहीं कर सकते, क्योंकि User, Web Form द्वारा किसी भी तरह का Data Input कर सकता है, जो कि हमारे Database के लिए नुकसानदायक भी हो सकता है।
इसलिए जब User द्वारा Input किया गया Data, Web Server पर पहुंचता है, तब उस Data को Directly Database की किसी Table में Insert करने के बजाय हम उसे prepare() Method द्वारा Database में Insert करने से पहले Prepare करते हैं और यदि User द्वारा आने वाला वह Data किसी भी तरह से हमारे Database के लिए Harmful हो सकता है, तो हम उस Data को Reject करते हुए Query को Fire होने से रोक देते हैं। जिससे हमारा Database, User द्वारा Manually Fill किए गए Form Fields में भेजे गए किसी Harmful SQL Statement से सुरिक्षत हो जाता है। prepare() Method को हम निम्नानुसार Use करते हैं:
<?php global $wpdb; $name = "Kuldeep"; $email = "admin@bccfalna.com"; $wpdb->query($wpdb->prepare( "INSERT INTO registration(name, email) VALUES (%s, %s)", $name, $email )); ?>
इस Code में हमने $wpdb->prepare() Method में निम्नानुसार तरीके से registration नाम की Custom Table में एक Record Insert करने के लिए Prepare किया है:
“INSERT INTO registration(name, email) VALUES (%s, %s)“, $name, $email
चूंकि registration Table के name व email दोनों ही Fields String Type के हैं, इसलिए इन दोनों Fields में String Values ही Insert हो, इस बात को निश्चित करने के लिए हमने SQL Statement के VALUES Part में दो बार %s का प्रयोग किया है।
ये Statement “C Language” के printf() Function की तरह है, जहां दोनों %s Control String के स्थान पर क्रमश% $name व $mail नाम के Variables में Stored Values Replace हो जाते हैं और जब prepare() Method Execute होता है, तो इस SQL Statement के हर Variable को इस बात के लिए Check करता है कि वे String Type के Data से ही Filled हों।
यदि इन Variable में String के बजाय किसी और प्रकार का Data हो, या String में कोई ऐसा Character हो, जो कि नहीं होना चाहिए, तो ये Method या तो इस Query को Properly Format कर देता है या फिर Fail कर देता है। परिणामस्वरूप हमारा Database SQL Injection Attach से सुरिक्षत रहता है।
SQL Query को Prepare करने के बाद इसे Execute करने के लिए हमें फिर से $wpdb->query() Method को Use करना होता है, जो इस Query को Execute करके एक Record को registration Table में Insert करता है।
prepare() Method हमेंशा दो Argument Accept करता है। जहां पहला Argument वह Query होता है, जिसे Fire करना है, जबकि दूसरे Argument के रूप में हमें उस पहली Query में Specify किए गए विभिन्न Control String के स्थान पर, Replace किए जाने वाले मानों को Specify करना होता है। इसलिए यदि हम चाहें, तो उपरोक्त Code को निम्नानुसार दूसरे तरीके से भी लिख सकते हैं:
<?php global $wpdb; $name = "BccFalna"; $email = "bccfalna@bccfalna.com"; $q = "INSERT INTO registration(name, email) VALUES (%s, %s)"; $wpdb->query($wpdb->prepare($q ,$name, $email)); ?>
INSERT के अलावा हम UPDATE व DELETE Operation के लिए भी prepare() Method को Use करते हुए ही SQL Queries को Fire करते हैं, क्योंकि इन दोनों Queries में भी User Input के आधार पर ही Update या Delete होने वाले Record का निर्ण; होता है और User Input पर कभी भी भरोसा नहीं करनाए अपने Database को सुरिक्षत बनाए रखने के लिए एक मुख्य नियम है।
<?php global $wpdb; $q = " DELETE FROM registration WHERE email = %s"; $wpdb->query( $wpdb->prepare($q, "admin@bccfalna.com") ); ?>
उपरोक्त Code उस Record को registration Table से Delete कर देगा, जिसके email Filed में Value के रूप में admin@bccfalna.com मान Specified है।
इसी तरह से हम निम्नानुसार तरीके से UPDATE Statement को भी prepare() Method का प्रयोग करते हुए Execute होने से पहले Prepare कर सकते हैं:
<?php global $wpdb; $q = " UPDATE registration SET email = %s WHERE email = %s"; $wpdb->query( $wpdb->prepare($q, "bccfalna@bccfalna.com", "admin@bccfalna.com") ); ?>
यहां जहां कहीं भी हमें User Input के आधार पर SQL Query Fire करने की जरूरत हो, या जिस किसी भी SQL Statement में User Input Value Participate कर रहा हो, उस SQL Query को हमें हमेंशा $wpdb->prepare() Method का प्रयोग करके उपयुक्त Data Type की Value के लिए Set कर देना चाहिए।
जिस तरह से हम किसी Custom Table के लिए उपरोक्तानुसार SQL Queries को Setup करके Fire कर सकते हैं, उसी तरह से हम WordPress की Default Tables के लिए भी Custom SQL Queries को Fire कर सकते हैं। हालांकि जहां तक सम्भव हो, हमें किसी जरूरत को पूरा करने के लिए WordPress API द्वारा Provided Methods को ही Use करना चाहिए।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Advance WordPress in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।
Advance WordPress in Hindi | Page: 835 | Format: PDF