পিএইচপি প্রিপেয়ার্ড স্ট্যাটমেন্ট (PHP Prepared Statements in Bangla)

ডাটাবেজ ম্যানেজম্যান্ট সিস্টেমে একটি প্রিপেয়ার্ড স্টেটমেন্ট হলো এমন একটি ফিচার যা একই বা একই ধরণের ডাটাবেজ স্টেটমেন্ট (যেমন SQL) বারবার দক্ষতার সাথে অ্যাকজিকিউট করতে ব্যবহৃত হয়। সার্ভার সাইড স্ক্রিপ্টিং ভাষা পিএইচপিতে (PHP) প্রিপেয়ার্ড স্টেটমেন্টগুলো এসকিউএল ইঞ্জেকশনের বিরুদ্ধে খুবই কার্যকর ভূমিকা রাখে। এসকিউএল ইঞ্জেকশন হলো এক ধরণের ইঞ্জেকশন কোড যা ডাটা-প্রোগ্রামগুলোতে আক্রমণ ও তথ্য চুরির কাজে ব্যবহার করা হয়।

 

প্রিপেয়ার্ড স্টেটম্যান্টস এবং বাউন্ড প্যারামিটারস

প্রিপেয়ার্ড স্টেটমেন্টগুলো সাধারণত নিচের মতো কাজ করেঃ

  1. প্রিপেয়ারঃ একটি এসকিউএল স্টেটমেন্ট টেমপ্লেট তৈরি করা হয় এবং ডাটাবেজে পাঠানো হয়। নির্দিষ্ট কতগুলো ভ্যালু অসংজ্ঞায়িত রাখা হয়, যেগুলো প্যারামিটার নামে পরিচিত এবং "?” চিহ্ন দিয়ে বুঝানো হয়। উদাহরণঃ INSERT INTO MyGuests VALUES(?, ?, ?)
  2. ডাটাবেজ এসকিউএল স্টেটমেন্ট টেমপ্লেটের উপর পার্স, কম্পাইল ও কোয়ারি অপটিমাইজেশন করে এবং তার ফলাফলটি একজিকিউট করে সংরক্ষণ করে।
  3. একজিকিউটঃ পরবর্তীতে, অ্যাপ্লিকেশনটি ভ্যালুগুলোকে প্যারামিটারে বাইন্ড করে, এবং ডাটাবেজ স্টেটমেন্টটিকে একজিকিউট করে। অ্যাপ্লিকেশনটি স্টেটমেন্টকে প্রত্যেকবার আলাদা আলাদা ভ্যালুর মাধ্যমে যতবার ইচ্ছে একজিকিউট করতে পারে।

এসকিউএল স্টেটমেন্ট সরাসরি একজিকিউট করার তুলনায় প্রিপেয়ার্ড স্টেটমেন্টের মাধ্যমে একজিকিউট করার দু'টি প্রধান সুবিধা রয়েছেঃ

  • প্রিপেয়ার্ড স্টেটমেন্ট পার্সিং টাইমকে কমিয়ে দেয় যেহেতু কোয়ারির উপর প্রস্তুতি একবারই করা হয় (যদিও স্টেটমেন্টটি অসংখ্যবার একজিকিউট করা হয়)।
  • বাউন্ড পারামিটারগুলো সার্ভারের প্রতি ব্যান্ডউইথের চাপ কমিয়ে দেয় যেহেতু আপনাকে শুধু প্যারামিটারগুলোকেই বার বার পাঠাতে হয়, পুরো কোয়ারি পাঠাতে হয়না।

প্রিপেয়ার্ড স্টেটমেন্ট এসকিউএল ইঞ্জেকশনের বিরুদ্ধে খুবই কার্যকরী কারণ প্যারামিটার ভ্যালুগুলোকে, যেগুলো পরবর্তীতে ভিন্ন প্রটোকল ব্যবহার করে পাঠানো হয়, তাদের সঠিকভাবে মুক্ত হতে হয় না। যদি এক্সটার্নাল ইনপুট থেকে প্রকৃত স্টেটমেন্ট টেমপ্লেটটিকে সংগ্রহ করা না হয়, তাহলে এসকিউএল ইঞ্জেকশন ঘটানো সম্ভব হয় না।

 

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 = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

 

উপরের উদাহরণটি থেকে ব্যাখ্যা করার কোড লাইনঃ


"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"


আমাদের SQL এ আমরা একটি প্রশ্নবোধক চিহ্ন অন্তর্ভূক্ত করেছি(?) যা আমরা একটি ইন্টিজার বা পূর্ন সংখ্যা, স্ট্রিং, ডাবল অথবা ব্লব ভ্যালু দিয়ে প্রতিস্থাপন করতে চাই।

এখন, bind_param() ফাংশনের দিকে লক্ষ্য করা যাকঃ


$stmt->bind_param("sss", $firstname, $lastname, $email);


এই ফাংশনটি প্যরামিটারগুলোকে এসকিউএল কোয়ারির দিকে বাইন্ড করে এবং ডাটাবেজকে প্যারামিটারগুলো সম্পর্কে বলে দেয়। "sss” আর্গুমেন্টটি প্যারামিটারগুলোর অনুসারে ডাটার প্রকারকে তালিকাভূক্ত করে। 's' অক্ষরটি মাইএসকিউএলকে বলে দেয় যে প্যারামিটারটি হলো একটি স্ট্রিং।

আর্গুমেন্টটি নিচের চার প্রকারের যেকোন একটি হতে পারেঃ

  • i - integer
  • d - double
  • s - string
  • b - BLOB

আমাদের প্রত্যেকটি প্যারামিটারের জন্য এগুলোর যেকোন একটি অবশ্যই লাগবে।

মাইএসকিউএলকে কি ধরনের ডাটা চাই তা বলার মাধ্যমে আমরা এসকিউএল ইঞ্জেকশনের ঝুঁকি কমিয়ে দিতে পারি।

লক্ষ্যণীয়ঃ যদি আমরা কোন এক্সটার্নাল সোর্স থেকে ডাটা ইনপুট করতে চাই (ইউজার ইনপুটের মতো) এটা খুবই গুরুত্বপূর্ণ যে আগে ডাটাকে স্যানিটাইজ এবং মিনিমাইজ করা হয়েছে।

 

PDO তে প্রিপেয়ার্ড স্টেটমেন্ট

নিচের উদাহরণটিতে PDO তে প্রিপেয়ার্ড স্টেটমেন্ট এবং প্যারামিটার ব্যবহার করা হয়েছেঃ


<?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 = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>

 

Permanent link to this article: http://bangla.sitestree.com/%e0%a6%aa%e0%a6%bf-%e0%a6%8f%e0%a6%87%e0%a6%9a-%e0%a6%aa%e0%a6%bf-%e0%a6%aa%e0%a7%8d%e0%a6%b0%e0%a6%bf%e0%a6%aa%e0%a7%87%e0%a7%9f%e0%a6%be%e0%a6%b0%e0%a7%8d%e0%a6%a1-%e0%a6%b8%e0%a7%8d%e0%a6%9f/