Tag Archives: PDO

মাইএসকিউএল এ পিএইচপি সংযোগ (PHP Connect to MySQL)

Huge Sell on Popular Electronics

মাইএসকিউএল এ পিএইচপি সংযোগ

নয়ন চন্দ্র দত্ত

কি খবর সবার? সবাই ভালতো । আজ আমি অনেক গুরুত্বপুর্ণ একটা বিষয় মাইএসকিউএল এ পিএইচপি সংযোগ নিয়ে বিস্তারিত আলোচনা করবো । মাইএসকিউএল এ কীভাবে পিএইচপি সংযোগ করতে হয় তা আজ আমরা দেখব। তাহলে চলুন শুরু করা যাক ...।

পিএইচপি 5 এবং পরে্র একটি মাইএসকিউএল ডাটাবেস ব্যবহার করে কাজ করতে পারেন। যেমন-

  • MySQLi extension ("i" দিয়ে উন্নততর বোঝায়)
  • PDO (পিএইচপি ডাটা অবজেক্টস)

পিএইচপি এর আগের ভার্সনে মাইএসকিউএল এক্সটেনশন ব্যবহার করা হত। যাইহোক, এই এক্সটেনশন 2012 সালে অবাঞ্চিত হয়েছে ।

এখন প্রশ্ন হচ্ছে, আমি কী MySQLi বা PDO ব্যবহার করতে পারব?

যদি আপনার একটি সংক্ষিপ্ত উত্তর প্রয়োজন হয়, তাহলে এটি হতে পারে "আপনি কি পছন্দ করেন" ।

MySQLi এবং PDO তাদের উভয়েরই সুবিধা আছে।

PDO 12টি বিভিন্ন ডাটাবেস সিস্টেম কাজ করে এবং MySQLi শুধুমাত্র মাইএসকিউএল উপাত্ত সঙ্গে কাজ করে।

যদি আপনি অন্য ডাটাবেস ব্যবহার করার জন্য আপনার প্রকল্প switch করতে চান তাহলে PDO প্রক্রিয়াটি সহজ করে তোলে। আপনার শুধুমাত্র সংযোগ স্ট্রিং এবং কয়েকটি queries পরিবর্তন করতে হবে। MySQLi দিয়ে আপনি সম্পূর্ণ কোড পুনর্লিখন করতে হবে - প্রশ্ন অন্তর্ভুক্ত হয়েছে।

উভয় বস্তু ভিত্তিক হয়, কিন্তু MySQLi একটি পদ্ধতিগত API- অফার করে।

প্রস্তুত বিবৃতি এসকিউএল ইনজেকশন থেকে রক্ষা করে এবং তা ওয়েব অ্যাপ্লিকেশন নিরাপত্তার জন্য খুবই গুরুত্বপূর্ণ ।

MySQLi এবং PDO সিনট্যাক্স উভয় মাইএসকিউএল এর উদাহরণ

নিম্নলিখিত অধ্যায়গুলির মধ্যে আমরা পিএইচপি এবং মাইএসকিউএল দিয়ে কাজ করার তিনটি উপায় দেখাবঃ

  • MySQLi (অবজেক্ট ওরিয়েন্টেড)
  • MySQLi (পদ্ধতিগত)
  • PDO

MySQLi ইনস্টলেশন

লিনাক্স এবং উইন্ডোজ জন্য: PHP5 মাইএসকিউএল প্যাকেজ ইনস্টল করা থাকলে অধিকাংশ ক্ষেত্রে MySQLi এক্সটেনশন স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যায়।

ইনস্টলেশন সংক্রান্ত বিস্তারিত বিবরণ এর জন্য ভিজিট করতে পারেন http://php.net/manual/en/mysqli.installation.php

PDO ইনস্টলেশন

ইনস্টলেশন সংক্রান্ত বিস্তারিত বিবরণ এর জন্য ভিজিট করতে পারেন http://php.net/manual/en/pdo.installation.php

মাইএসকিউএল এ একটি সংযোগ খুলুন

MySQL ডাটাবেসের মধ্যে তথ্য অ্যাক্সেস করার পূর্বে আমাদের সার্ভারের সাথে সংযোগ করতে হবে।

উদাহরণ ( MySQLi অবজেক্ট ওরিয়েন্টেড):


<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 
 // Create connection
 $conn = new mysqli($servername, $username, $password);
 
 // Check connection
 if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
 } 
 echo "Connected successfully";
 ?>

 

*** উপরে অবজেক্ট ওরিয়েন্টেড উদাহরণ দ্রষ্টব্য: $ connect_error পিএইচপি 5.2.9 এবং 5.3.0 পর্যন্ত Broken ছিল.
আপনার পূর্বের 5.2.9 এবং 5.3.0 পিএইচপি সংস্করণের সাথে সামঞ্জস্য নিশ্চিত করা প্রয়োজন হলে, পরিবর্তে নিম্নলিখিত কোড ব্যবহার করুন:


<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 
 // Create connection
 $conn = new mysqli($servername, $username, $password);
 
 // Check connection
 if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
 } 
 echo "Connected successfully";
 ?>

 

উদাহরণ (প্রথাগত MySQLi )


<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 
 // Create connection
 $conn = mysqli_connect($servername, $username, $password);
 
 // Check connection
 if (!$conn) {
     die("Connection failed: " . mysqli_connect_error());
 }
 echo "Connected successfully";
 ?>

 

উদাহরণ ( PDO )


<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 
 try {
     $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
     // set the PDO error mode to exception
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     echo "Connected successfully"; 
     }
 catch(PDOException $e)
     {
     echo "Connection failed: " . $e->getMessage();
     }
 ?>

 

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

সংযোগ বন্ধ করুন

সংযোগ স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে যখন স্ক্রিপ্ট শেষ হবে। সংযোগ বন্ধ করার পূর্বে নিম্নলিখিত কাজগুলো অণুসরণ করুনঃ

উদাহরণ (MySQLi অবজেক্ট ওরিয়েন্টেড)


$conn->close();

 

উদাহরণ (প্রথাগত MySQLi)


mysqli_close($conn);

 

উদাহরণ (PDO)


$conn = null;

 

আজকের মত এই পর্যন্ত। আশা করি সবার খুব ভাল লেগেছে । সবাই বেশি বেশি করে প্রাকটিস করবেন । সবাই ভাল থাকবেন আর কোন সমস্যা হলে নিশ্চই কমেন্ট করবেন ।

 

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

Huge Sell on Popular Electronics

ডাটাবেজ ম্যানেজম্যান্ট সিস্টেমে একটি প্রিপেয়ার্ড স্টেটমেন্ট হলো এমন একটি ফিচার যা একই বা একই ধরণের ডাটাবেজ স্টেটমেন্ট (যেমন 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;
?>