PHP MySQL तैयार वक्तव्य
एसक्यूएल इंजेक्शन के खिलाफ तैयार बयान बहुत उपयोगी हैं।
तैयार विवरण और बाध्य पैरामीटर
एक तैयार कथन एक विशेषता है जिसका उपयोग उच्च दक्षता के साथ बार-बार समान (या समान) SQL कथन निष्पादित करने के लिए किया जाता है।
तैयार बयान मूल रूप से इस तरह काम करते हैं:
- तैयार करें: एक SQL स्टेटमेंट टेम्प्लेट बनाया जाता है और डेटाबेस को भेजा जाता है। कुछ मानों को अनिर्दिष्ट छोड़ दिया जाता है, जिन्हें पैरामीटर (लेबल "?") कहा जाता है। उदाहरण: MyGuests Values में INSERT करें(?, ?, ?)
- डेटाबेस SQL स्टेटमेंट टेम्प्लेट पर क्वेरी ऑप्टिमाइज़ेशन को पार्स, संकलित और निष्पादित करता है, और परिणाम को निष्पादित किए बिना संग्रहीत करता है
- निष्पादित करें: बाद के समय में, एप्लिकेशन मानों को मापदंडों से बांधता है, और डेटाबेस स्टेटमेंट को निष्पादित करता है। एप्लिकेशन स्टेटमेंट को जितनी बार चाहे उतनी बार अलग-अलग वैल्यू के साथ निष्पादित कर सकता है
SQL कथनों को सीधे निष्पादित करने की तुलना में, तैयार किए गए कथनों के तीन मुख्य लाभ हैं:
- तैयार किए गए कथन पार्सिंग समय को कम करते हैं क्योंकि क्वेरी पर तैयारी केवल एक बार की जाती है (हालाँकि कथन को कई बार निष्पादित किया जाता है)
- बाउंड पैरामीटर सर्वर पर बैंडविड्थ को कम करते हैं क्योंकि आपको हर बार केवल पैरामीटर भेजने की आवश्यकता होती है, न कि पूरी क्वेरी
- एसक्यूएल इंजेक्शन के खिलाफ तैयार बयान बहुत उपयोगी होते हैं, क्योंकि पैरामीटर मान, जो बाद में एक अलग प्रोटोकॉल का उपयोग करके प्रेषित होते हैं, को सही ढंग से बचने की आवश्यकता नहीं होती है। यदि मूल विवरण टेम्पलेट बाहरी इनपुट से प्राप्त नहीं होता है, तो SQL इंजेक्शन नहीं हो सकता है।
MySQLi . में तैयार विवरण
निम्न उदाहरण MySQLi में तैयार किए गए कथनों और बाध्य मापदंडों का उपयोग करता है:
उदाहरण (तैयार विवरण के साथ MySQLi)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
उपरोक्त उदाहरण से समझाने के लिए कोड लाइनें:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
हमारे एसक्यूएल में, हम एक प्रश्न चिह्न (?) डालते हैं जहां हम एक पूर्णांक, स्ट्रिंग, डबल या ब्लॉब मान में प्रतिस्थापित करना चाहते हैं।
फिर, bind_param() फ़ंक्शन पर एक नज़र डालें:
$stmt->bind_param("sss", $firstname, $lastname, $email);
यह फ़ंक्शन पैरामीटर को SQL क्वेरी से बांधता है और डेटाबेस को बताता है कि पैरामीटर क्या हैं। "sss" तर्क उन डेटा के प्रकारों को सूचीबद्ध करता है जो पैरामीटर हैं। s वर्ण mysql को बताता है कि पैरामीटर एक स्ट्रिंग है।
तर्क चार प्रकारों में से एक हो सकता है:
- मैं - पूर्णांक
- डी - डबल
- एस - स्ट्रिंग
- ख - बूँद
हमारे पास प्रत्येक पैरामीटर के लिए इनमें से एक होना चाहिए।
MySQL को यह बताकर कि किस प्रकार के डेटा की अपेक्षा की जाए, हम SQL इंजेक्शन के जोखिम को कम करते हैं।
नोट: यदि हम बाहरी स्रोतों (जैसे उपयोगकर्ता इनपुट) से कोई डेटा सम्मिलित करना चाहते हैं, तो यह बहुत महत्वपूर्ण है कि डेटा को स्वच्छ और मान्य किया जाए।
पीडीओ . में तैयार विवरण
निम्नलिखित उदाहरण पीडीओ में तैयार बयानों और बाध्य मापदंडों का उपयोग करता है:
उदाहरण (तैयार विवरण के साथ पीडीओ)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
} catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>