PHP তে ডাটাবেস সংযোগ স্থাপন এবং পরিচালনার জন্য প্রধানত দুটি পদ্ধতি ব্যবহৃত হয়— mysqli (MySQL Improved) এবং PDO (PHP Data Objects)। এই দুটি পদ্ধতির মধ্যে কিছু মূল পার্থক্য রয়েছে যা ডেভেলপারদের জন্য গুরুত্বপূর্ণ হতে পারে। এখানে mysqli এবং PDO এর মধ্যে প্রধান পার্থক্যগুলো আলোচনা করা হলো।
1. সাপোর্ট করা ডাটাবেস
- mysqli: এটি শুধুমাত্র MySQL ডাটাবেস সিস্টেমের জন্য ডিজাইন করা হয়েছে। এর মানে হলো, আপনি যদি MySQL ব্যবহার করেন, তাহলে mysqli পছন্দসই পদ্ধতি হতে পারে।
- PDO: PDO একাধিক ডাটাবেস সিস্টেম সাপোর্ট করে, যেমন MySQL, PostgreSQL, SQLite, MSSQL, এবং আরও অনেক। এটি ডাটাবেসের প্রকারভেদ অনুযায়ী কোডে ছোট পরিবর্তন এনে একাধিক ডাটাবেসে কাজ করতে সাহায্য করে।
2. অবজেক্ট-ওরিয়েন্টেড এবং প্রসিডিউরাল স্টাইল
mysqli: এটি দুটো স্টাইল সাপোর্ট করে—অবজেক্ট-ওরিয়েন্টেড (OOP) এবং প্রসিডিউরাল (Procedural)।
উদাহরণ (OOP):
$mysqli = new mysqli($host, $user, $password, $dbname); $result = $mysqli->query("SELECT * FROM table_name");উদাহরণ (Procedural):
$mysqli = mysqli_connect($host, $user, $password, $dbname); $result = mysqli_query($mysqli, "SELECT * FROM table_name");PDO: এটি শুধুমাত্র অবজেক্ট-ওরিয়েন্টেড (OOP) স্টাইল সাপোর্ট করে। PDO-তে শুধুমাত্র অবজেক্ট হিসেবে কাজ করা হয়।
উদাহরণ:
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); $stmt = $pdo->query("SELECT * FROM table_name");
3. প্রিপেয়ারড স্টেটমেন্ট এবং ইনজেকশন প্রতিরোধ
mysqli: mysqli প্রিপেয়ারড স্টেটমেন্ট সাপোর্ট করে এবং SQL ইনজেকশন থেকে রক্ষা করতে সাহায্য করে। এটি আপনার কোডে ডাইনামিক ডাটাবেস কোয়েরি লেখার সময় ইনজেকশন প্রতিরোধ করতে ব্যবহৃত হয়।
উদাহরণ:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $email); $stmt->execute();PDO: PDO তেও প্রিপেয়ারড স্টেটমেন্ট সাপোর্ট রয়েছে এবং এটি SQL ইনজেকশন থেকে রক্ষা করতে সক্ষম। PDO-তে প্রিপেয়ারড স্টেটমেন্ট ব্যবহার খুবই সহজ।
উদাহরণ:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]);
4. ফেচ মেথড (Fetch Method)
mysqli: mysqli তে ডাটা ফেচ করার জন্য বিভিন্ন মেথড ব্যবহার করা যায়, যেমন
fetch_assoc(),fetch_row(),fetch_object()।উদাহরণ:
$result = $mysqli->query("SELECT * FROM table_name"); while($row = $result->fetch_assoc()) { echo $row['column_name']; }PDO: PDO তে ডাটা ফেচ করতে
fetch()বাfetchAll()মেথড ব্যবহার করা হয়। PDO তে বিভিন্ন ফেচ মোড থাকে, যেমনPDO::FETCH_ASSOC,PDO::FETCH_OBJ।উদাহরণ:
$stmt = $pdo->query("SELECT * FROM table_name"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $row['column_name']; }
5. ট্রানজেকশন সাপোর্ট
mysqli: mysqli তে ট্রানজেকশন সাপোর্ট রয়েছে। তবে, ট্রানজেকশন ব্যবহারের জন্য কিছু অতিরিক্ত কোড লিখতে হয়, যেমন
begin_transaction(),commit(), এবংrollback()।উদাহরণ:
$mysqli->begin_transaction(); // কিছু কোয়েরি চালানো $mysqli->commit();PDO: PDO তেও ট্রানজেকশন সাপোর্ট রয়েছে এবং এটি ব্যবহার করতে সহজ।
beginTransaction(),commit(), এবংrollBack()মেথড ব্যবহার করা হয়।উদাহরণ:
$pdo->beginTransaction(); // কিছু কোয়েরি চালানো $pdo->commit();
6. অতিরিক্ত ফিচার
- mysqli:
- MySQL স্পেসিফিক ফিচার যেমন MySQL রেপ্লিকেশন এবং স্টোরড প্রোসিজার সমর্থন করে।
multi_query()এর মাধ্যমে একাধিক কোয়েরি একসাথে রান করা যায়।
- PDO:
- PDO তে ডাটাবেসের মধ্যে ফিচারের পার্থক্য যতটা সম্ভব গোপন রাখা হয় এবং এটি ডাটাবেস স্বাধীনতা নিশ্চিত করে।
- PDO তে named parameters সাপোর্ট করা হয়, যা কোড লেখাকে আরও পরিষ্কার এবং ম্যানটেইনযোগ্য করে তোলে।
7. অভ্যন্তরীণ পারফরম্যান্স
- mysqli: MySQL নির্ভরশীল এবং বিশেষভাবে অপটিমাইজ করা হয়েছে, তাই MySQL-এ ভালো পারফরম্যান্স প্রদানে এটি উপযোগী।
- PDO: যদিও PDO একাধিক ডাটাবেস সিস্টেম সাপোর্ট করে, তবে এটি কিছুটা বেশি জেনেরিক এবং কিছু ক্ষেত্রে mysqli থেকে একটু কম পারফরম্যান্স হতে পারে (বিশেষত যদি আপনি শুধু MySQL ব্যবহার করছেন)।
8. ভুল (Error) পরিচালনা
mysqli: mysqli তে ভুল সনাক্ত করার জন্য, এটি
mysqli_error()এবংmysqli_errno()ফাংশন ব্যবহার করে। কোডের মধ্যে ভুল হলে এটি স্বতঃসিদ্ধভাবে প্রিন্ট করতে পারে।উদাহরণ:
if ($mysqli->connect_error) { die("Connection failed: " . $mysqli->connect_error); }PDO: PDO তে ভুল পরিচালনার জন্য
try-catchব্লক ব্যবহার করা হয়। এটি ডাটাবেস ইররগুলি প্রোপারলি ক্যাচ এবং হ্যান্ডল করতে সহায়তা করে।উদাহরণ:
try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo "Error: " . $e->getMessage(); }
সারাংশ
| বৈশিষ্ট্য | mysqli | PDO |
|---|---|---|
| সাপোর্ট করা ডাটাবেস | শুধুমাত্র MySQL | MySQL, PostgreSQL, SQLite, MSSQL ইত্যাদি |
| স্টাইল | OOP এবং প্রসিডিউরাল | শুধুমাত্র OOP |
| প্রিপেয়ারড স্টেটমেন্ট | হ্যাঁ | হ্যাঁ |
| একাধিক ডাটাবেস সাপোর্ট | না | হ্যাঁ |
| ট্রানজেকশন সাপোর্ট | হ্যাঁ | হ্যাঁ |
| ফেচ মেথড | fetch_assoc(), fetch_row() ইত্যাদি | fetch(), fetchAll() |
| কোড সিম্পলিটি | সহজ | আরও পরিষ্কার এবং ম্যানটেইনযোগ্য |
| পারফরম্যান্স | MySQL-এর জন্য অপটিমাইজড | কিছুটা কম পারফরম্যান্স (ডাটাবেস নির্ভর) |
| ভূল (Error) হ্যান্ডলিং | mysqli_error(), mysqli_errno() | try-catch |
সারাংশ
mysqli এবং PDO উভয়ই PHP এর ডাটাবেস ইন্টারঅ্যাকশনের জন্য শক্তিশালী পদ্ধতি। তবে, PDO একাধিক ডাটাবেস সিস্টেম সাপোর্ট করে এবং কোডের পোর্টেবিলিটি বাড়ায়, যেখানে mysqli শুধুমাত্র MySQL-এ কাজ করে। PDO-এর মাধ্যমে একাধিক ডাটাবেসে কাজ করা সহজ, এবং এটি উন্নত ইরর হ্যান্ডলিং এবং নিরাপত্তা ফিচার প্রদান করে। যদি শুধুমাত্র MySQL ব্যবহৃত হয়, তবে mysqli কিছুটা পারফরম্যান্সে এগিয়ে থাকতে পারে, কিন্তু PDO বেশি ফ্লেক্সিবল এবং পোর্টেবল।
Read more