किसी भी MySQL स्टेटमेंट के अंदर PHP वेरिएबल जोड़ने के नियम सरल और सरल हैं:
- कोई भी वैरिएबल जो एसक्यूएल डेटा शाब्दिक का प्रतिनिधित्व करता है , (या, इसे सीधे शब्दों में कहें तो - एक SQL स्ट्रिंग, या एक संख्या) एक तैयार कथन के माध्यम से जोड़ा जाना चाहिए। कोई अपवाद नहीं।
- कोई अन्य क्वेरी भाग, जैसे SQL कीवर्ड, तालिका या फ़ील्ड नाम, या ऑपरेटर - को श्वेत सूची के माध्यम से फ़िल्टर किया जाना चाहिए ।
तो चूंकि आपके उदाहरण में केवल डेटा अक्षर शामिल हैं, तो सभी चर प्लेसहोल्डर (जिसे पैरामीटर भी कहा जाता है) के माध्यम से जोड़ा जाना चाहिए। ऐसा करने के लिए:
- अपने SQL स्टेटमेंट में, सभी वेरिएबल को प्लेसहोल्डर्स से बदलें
- तैयार करें परिणामी क्वेरी
- बांधें प्लेसहोल्डर्स के लिए चर
- निष्पादित करें प्रश्न
और यहां बताया गया है कि इसे सभी लोकप्रिय PHP डेटाबेस ड्राइवरों के साथ कैसे किया जाता है:
mysql ext का उपयोग करके डेटा अक्षर जोड़ना
ऐसा ड्राइवर मौजूद नहीं है ।
mysqli
का उपयोग करके डेटा अक्षर जोड़ना
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description)
VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();
कोड थोड़ा जटिल है लेकिन इन सभी ऑपरेटरों का विस्तृत विवरण मेरे लेख में पाया जा सकता है, एक कैसे चलाएं Mysqli का उपयोग करके INSERT क्वेरी करें , साथ ही एक समाधान जो प्रक्रिया को नाटकीय रूप से आसान बनाता है।
एक सेलेक्ट क्वेरी के लिए आपको get_result()
. में सिर्फ एक कॉल जोड़ना होगा एक परिचित mysqli_result
प्राप्त करने की विधि जिससे आप सामान्य तरीके से डेटा प्राप्त कर सकते हैं:
$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
पीडीओ का उपयोग करके डेटा अक्षर जोड़ना
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description)
VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);
पीडीओ में, हम संयुक्त भागों को बाँध और निष्पादित कर सकते हैं, जो बहुत सुविधाजनक है। पीडीओ नामित प्लेसहोल्डर्स का भी समर्थन करता है जो कुछ को बेहद सुविधाजनक लगता है।
कीवर्ड या पहचानकर्ता जोड़ना
कभी-कभी हमें एक वेरिएबल जोड़ना पड़ता है जो किसी क्वेरी के दूसरे भाग का प्रतिनिधित्व करता है, जैसे कीवर्ड या पहचानकर्ता (डेटाबेस, टेबल या फ़ील्ड नाम)। यह एक दुर्लभ मामला है लेकिन इसके लिए तैयार रहना बेहतर है।
इस मामले में, आपके वेरिएबल को स्पष्ट रूप से values मानों की एक सूची के विरुद्ध जांचा जाना चाहिए आपकी लिपि में लिखा है। यह मेरे अन्य लेख में समझाया गया है, उपयोगकर्ता की पसंद के आधार पर ORDER BY खंड में फ़ील्ड नाम जोड़ना :
<ब्लॉकक्वॉट>दुर्भाग्य से, पीडीओ के पास पहचानकर्ताओं (तालिका और फ़ील्ड नाम) के लिए कोई प्लेसहोल्डर नहीं है, इसलिए एक डेवलपर को उन्हें मैन्युअल रूप से फ़िल्टर करना होगा। इस तरह के फ़िल्टर को अक्सर "श्वेत सूची" कहा जाता है (जहां हम केवल अनुमत मानों को सूचीबद्ध करते हैं) एक "ब्लैक-लिस्ट" के विपरीत जहां हम अस्वीकृत मानों को सूचीबद्ध करते हैं।
इसलिए हमें PHP कोड में सभी संभावित रूपों को स्पष्ट रूप से सूचीबद्ध करना होगा और फिर उनमें से चुनना होगा।
यहां एक उदाहरण दिया गया है:
$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) {
throw new InvalidArgumentException("Invalid field name");
}
<ब्लॉकक्वॉट> दिशा के लिए बिल्कुल उसी दृष्टिकोण का उपयोग किया जाना चाहिए,
$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) {
throw new InvalidArgumentException("Invalid ORDER BY direction");
}
ऐसे कोड के बाद दोनों $direction
और $orderby
वेरिएबल को SQL क्वेरी में सुरक्षित रूप से रखा जा सकता है, क्योंकि वे या तो अनुमत वेरिएंट में से एक के बराबर हैं या कोई त्रुटि होगी।
पहचानकर्ताओं के बारे में उल्लेख करने वाली आखिरी बात, उन्हें विशेष डेटाबेस सिंटैक्स के अनुसार भी स्वरूपित किया जाना चाहिए। MySQL के लिए यह backtick
होना चाहिए पहचानकर्ता के चारों ओर वर्ण। तो उदाहरण के लिए हमारे आदेश के लिए अंतिम क्वेरी स्ट्रिंग होगी
$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";