PHP स्क्रिप्ट में SQL क्वेरी का सही तरीके से निर्माण कैसे करें?



(1)

मैं एक डेटाबेस में उपयोगकर्ता जानकारी सम्मिलित करने के लिए एक SQL क्वेरी बनाने की कोशिश कर रहा हूं। $lname और $lname चर में सही मान ("जॉन" और "डो") होते हैं, लेकिन क्वेरी विफल रहती है। यहाँ मेरा कोड है:

$fname = $_POST['first_name'];
$lname = $_POST['last_name'];  
$sql = "INSERT INTO users (fname, lname) VALUES ($fname, $lname)";
mysqli_query($conn, $sql);

त्रुटि संदेश की जाँच करने के बाद मैंने पाया है कि यह क्वेरी त्रुटि के साथ विफल है

'फ़ील्ड सूची' में अज्ञात कॉलम 'जॉन'

बिना किसी त्रुटि के इसे चलाने के लिए मैं SQL क्वेरी में चर को कैसे ठीक से शामिल कर सकता हूं?

  • यह प्रश्न SQL सिंटैक्स के बारे में नहीं है, जिससे मैं काफी परिचित हूं, लेकिन PHP स्क्रिप्ट में वैरिएबल का उपयोग करके एक क्वेरी बनाने के नियमों के बारे में।
  • मैं एक त्वरित पैच नहीं चाहता जो केवल तत्काल त्रुटि को समाप्त करता है, लेकिन एक अत्याधुनिक समाधान जो त्रुटि मुक्त और साथ ही सुरक्षित है।

SQL क्वेरी में एक वैरिएबल जोड़ने का सबसे गलती-प्रूफ तरीका एक तैयार स्टेटमेंट के माध्यम से इसे जोड़ना है।

यह समझना बहुत महत्वपूर्ण है कि केवल एक चर के आसपास उद्धरण जोड़ना पर्याप्त नहीं है और अंततः सिंटैक्स त्रुटियों से SQL इंजेक्शन में असंख्य समस्याएं पैदा हो जाएंगी। दूसरी ओर, तैयार किए गए कथनों की प्रकृति के कारण, यह एक बुलेट-प्रूफ समाधान है जो किसी भी समस्या को डेटा चर के माध्यम से पेश करना असंभव बनाता है।

इसलिए, आपके द्वारा चलाए जाने वाले प्रत्येक क्वेरी के लिए, यदि कम से कम एक चर का उपयोग किया जा रहा है, तो आपको इसे एक प्लेसहोल्डर के साथ स्थानापन्न करना होगा, फिर अपनी क्वेरी तैयार करनी होगी, और फिर इसे निष्पादित करना होगा, चर अलग से पारित करना।

सबसे पहले, आपको अपनी क्वेरी को बदलना होगा, चर के स्थान पर प्लेसहोल्डर्स जोड़ना। आपकी क्वेरी बन जाएगी:

$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)";

फिर, आपको इसे तैयार करना होगा, चर को बाँधना होगा और निष्पादित करना होगा:

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ss", $fname, $lname);
mysqli_stmt_execute($stmt);

जैसा कि आप देख सकते हैं, यह सिर्फ तीन सरल आदेश हैं:

  • तैयार () जहां आप प्लेसहोल्डर्स के साथ एक क्वेरी भेजते हैं
  • bind_param जहाँ आप स्ट्रिंग के साथ टाइप करते हैं ("s" स्ट्रिंग के लिए है और आप इसे वास्तव में किसी भी प्रकार के लिए उपयोग कर सकते हैं) और वास्तविक चर की तुलना में।
  • और निष्पादित करें ()

इस तरह, आप हमेशा सुनिश्चित कर सकते हैं कि क्वेरी में आपके द्वारा जोड़े गए डेटा के कारण एक भी SQL सिंटैक्स त्रुटि नहीं हो सकती है! एक बोनस के रूप में, यह कोड SQL इंजेक्शन के खिलाफ बुलेट-प्रूफ भी है!

नमक की एक चुटकी है, हालांकि, mysqli तैयार बयानों के साथ एक सेलेक्ट क्वेरी चलाने के रूप में अधिक जटिल हो सकता है। इसलिए मैं कई कारणों से पीडीओ को आपके डेटाबेस ड्राइवर के रूप में चुनने का दृढ़ता से सुझाव दूंगा।





sql