MySQLi এর সাথে prepared statements ব্যবহার করা একটি গুরুত্বপূর্ণ কৌশল যা SQL injection থেকে রক্ষা করে এবং ডাটাবেস কুয়েরি পারফরম্যান্স উন্নত করে। Prepared statements SQL কুয়েরিকে প্যারামিটারাইজড করে, যার ফলে ইউজারের ইনপুট ডেটা কুয়েরির কাঠামো পরিবর্তন করতে পারে না। এটি SQL injection আক্রমণ প্রতিরোধে সাহায্য করে।
নিচে MySQLi এর সাথে Prepared Statements ব্যবহার করার পদ্ধতি বর্ণনা করা হয়েছে।
Prepared Statements ব্যবহার করার ধাপ:
1. MySQLi কানেকশন তৈরি করা
প্রথমে, ডাটাবেসের সাথে সংযোগ তৈরি করতে হবে। এখানে MySQLi এর object-oriented পদ্ধতি ব্যবহার করা হয়েছে।
<?php
$host = "localhost"; // Database host
$user = "root"; // Database username
$password = ""; // Database password
$dbname = "test"; // Database name
// MySQLi connection
$conn = new mysqli($host, $user, $password, $dbname);
// Check the connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>
2. Prepared Statement তৈরি করা
এবার prepared statement তৈরি করতে হবে। prepare() মেথড ব্যবহার করে, একটি SQL কুয়েরি তৈরি করা হয় যেখানে ইউজারের ইনপুট প্লেসহোল্ডার হিসাবে রাখা হয়।
<?php
// SQL query with placeholder
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND email = ?");
?>
এখানে ? প্লেসহোল্ডার হিসেবে কাজ করছে, যা পরে ইউজারের ইনপুট দ্বারা প্রতিস্থাপিত হবে।
3. Parameters Binding করা
এখন, কুয়েরির প্লেসহোল্ডারগুলোতে ইউজারের ইনপুট বাউন্ড করতে হবে। bind_param() মেথড ব্যবহার করে, ডাটা টাইপ এবং ভ্যালু বাউন্ড করা হয়।
<?php
$username = 'john_doe'; // Example username
$email = 'john@example.com'; // Example email
// 's' indicates string data type for both parameters
$stmt->bind_param("ss", $username, $email);
?>
এখানে "ss" বোঝাচ্ছে যে দুটি প্যারামিটার (username এবং email) string টাইপের।
4. Query Execute করা
ইউজারের ইনপুট বাউন্ড করার পর, execute() মেথড ব্যবহার করে কুয়েরি এক্সিকিউট করা হয়।
<?php
$stmt->execute();
?>
এখন কুয়েরিটি ডাটাবেসে পাঠানো হবে এবং ডাটাবেসের রেজাল্ট ফিরে আসবে।
5. Result Fetch করা
কুয়েরি এক্সিকিউট হওয়ার পর, এর রেজাল্ট ব্যবহার করতে get_result() মেথড ব্যবহার করে রেজাল্ট ফেচ করা হয়। এরপর, আপনি যে কোন ধরনের ডেটা ফেচ করতে পারেন, যেমন fetch_assoc(), fetch_row() ইত্যাদি।
<?php
$result = $stmt->get_result(); // Get the result from query
// Fetch all rows as associative array
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'] . "<br>";
echo "Email: " . $row['email'] . "<br>";
}
?>
এখানে fetch_assoc() মেথড ব্যবহার করা হয়েছে, যাতে রেজাল্ট অ্যারে আকারে ফিরে আসে।
6. Prepared Statement বন্ধ করা
এখন, কাজ শেষ হলে, স্টেটমেন্ট এবং কানেকশন বন্ধ করা উচিত।
<?php
$stmt->close(); // Close the prepared statement
$conn->close(); // Close the database connection
?>
পূর্ণ উদাহরণ:
<?php
$host = "localhost"; // Database host
$user = "root"; // Database username
$password = ""; // Database password
$dbname = "test"; // Database name
// MySQLi connection
$conn = new mysqli($host, $user, $password, $dbname);
// Check the connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// SQL query with placeholder
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND email = ?");
// Parameters to bind
$username = 'john_doe'; // Example username
$email = 'john@example.com'; // Example email
// Bind the parameters ('ss' means two string parameters)
$stmt->bind_param("ss", $username, $email);
// Execute the query
$stmt->execute();
// Get the result
$result = $stmt->get_result();
// Fetch and display the data
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'] . "<br>";
echo "Email: " . $row['email'] . "<br>";
}
// Close the statement and connection
$stmt->close();
$conn->close();
?>
Prepared Statements এর সুবিধা
- SQL Injection Prevention: ইউজারের ইনপুট সরাসরি কুয়েরিতে ইনপুট না হওয়ার কারণে SQL injection আক্রমণ প্রতিরোধ করা যায়।
- Code Efficiency: কোড আরও পরিষ্কার এবং সুরক্ষিত হয়, কারণ প্রতিবার ইউজার ইনপুট এক্সিকিউট করার সময় কুয়েরি আবার তৈরি করতে হয় না।
- Performance: প্রিপেয়ারড স্টেটমেন্ট ব্যবহার করলে, যদি একই কুয়েরি একাধিক বার চলানো হয়, তাহলে ডাটাবেসের মধ্যে কুয়েরি কম্পাইল করার প্রক্রিয়া একবারই ঘটে, যার ফলে কর্মক্ষমতা বৃদ্ধি পায়।
সারাংশ
MySQLi এর সাথে prepared statements ব্যবহার করে SQL কুয়েরি নিরাপদভাবে এক্সিকিউট করা যায়। এটি SQL injection প্রতিরোধে সহায়ক এবং কোডের কার্যকারিতা ও নিরাপত্তা বৃদ্ধি করে। এই প্রক্রিয়াটি ডাটাবেস কুয়েরি পরিচালনায় একটি অত্যন্ত নিরাপদ এবং কার্যকরী পদ্ধতি।
Read more