ResultSet Paginate এবং Sort করা গাইড ও নোট

Database Tutorials - পিএইচপি মাইএসকিউএল আই (PHP MySQL) - PHP দিয়ে MySQL Query Execution এবং ResultSet Management
279

PHP এবং MySQL ব্যবহার করে ডেটাবেসের ResultSet (যেমন SELECT কুয়েরি দিয়ে আনা রেকর্ড) পেজিনেট এবং সাজানো (sort) করার প্রক্রিয়াটি খুবই গুরুত্বপূর্ণ যখন বড় ডেটাসেটের সাথে কাজ করতে হয়। পেজিনেশন ব্যবহারকারীর জন্য ডেটা লোডিং প্রক্রিয়া দ্রুত ও কার্যকরী করে এবং সাজানো (sorting) ডেটার ক্রম অনুসারে দেখানোর সুবিধা দেয়।


১. ResultSet Paginate করা

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

১.১ পেজিনেশন কোডের কাঠামো

পেজিনেশন করতে হলে, প্রথমে মোট রেকর্ডের সংখ্যা বের করতে হবে, তারপর তা পৃষ্ঠায় ভাগ করতে হবে। উদাহরণস্বরূপ, ১০টি রেকর্ড এক পৃষ্ঠায় দেখানো হলে, পেজিংয়ের জন্য কুয়েরি এবং লজিক নিচে দেওয়া হলো:

<?php
// ডেটাবেস সংযোগ
$conn = new mysqli("localhost", "root", "", "my_database");

// সংযোগ চেক করা
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// পেজ নম্বর ও পেজ সাইজ সেট করা
$limit = 10; // এক পৃষ্ঠায় কতটি রেকর্ড দেখানো হবে
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // পেজ নম্বর
$offset = ($page - 1) * $limit; // পেজ অনুযায়ী অফসেট নির্ধারণ

// পেজিনেটেড কুয়েরি
$sql = "SELECT * FROM users LIMIT $limit OFFSET $offset";
$result = $conn->query($sql);

// রেকর্ডগুলো দেখানো
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
    }
} else {
    echo "No records found.";
}

// পেজিনেশন লিঙ্ক তৈরি করা
$sqlTotal = "SELECT COUNT(*) FROM users"; // মোট রেকর্ডের সংখ্যা
$resultTotal = $conn->query($sqlTotal);
$rowTotal = $resultTotal->fetch_row();
$totalRecords = $rowTotal[0];
$totalPages = ceil($totalRecords / $limit); // মোট পেজের সংখ্যা

// পেজ লিঙ্ক প্রদর্শন
for ($i = 1; $i <= $totalPages; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
}

$conn->close();
?>

এখানে:

  • $limit: এক পৃষ্ঠায় কতটি রেকর্ড দেখানো হবে।
  • $page: বর্তমানে কোন পেজটি দেখানো হচ্ছে, যা URL এর মাধ্যমে আনা হয়।
  • $offset: এটি নির্ধারণ করে কোন রেকর্ড থেকে শুরু হবে (যেমন, ১ম পৃষ্ঠার জন্য ০, ২য় পৃষ্ঠার জন্য ১০ ইত্যাদি)।
  • LIMIT $limit OFFSET $offset: এই কুয়েরি পেজিনেটেড ডেটা আনে।

২. ResultSet Sort করা (ORDER BY)

ডেটা সাজানোর জন্য ORDER BY কুয়েরি ব্যবহার করা হয়। ASC (ascending) বা DESC (descending) অপশন দিয়ে আপনি ডেটা সাজাতে পারেন।

২.১ বেসিক SORT কুয়েরি

SELECT * FROM users ORDER BY name ASC;  // নামের ভিত্তিতে অ্যাসেন্ডিং অর্ডারে সাজানো

এখানে ASC মানে হল অ্যাসেন্ডিং অর্ডার, যা ছোট থেকে বড় সাজায়। আপনি চাইলে DESC (descending) ব্যবহার করে বড় থেকে ছোট সাজাতে পারেন।


৩. PHP দিয়ে Sorting এবং Pagination একত্রিত করা

আপনি যদি একযোগে পেজিনেশন এবং সোর্টিং (sorting) করতে চান, তবে আপনি ORDER BY কুয়েরি ব্যবহার করে ডেটা সাজিয়ে পেজিনেটেড রেকর্ডও ফেচ করতে পারবেন। নিচে একটি উদাহরণ দেওয়া হল যেখানে name কলামের ভিত্তিতে ডেটা সাজানো হয়েছে এবং পেজিনেশন করা হয়েছে।

<?php
// ডেটাবেস সংযোগ
$conn = new mysqli("localhost", "root", "", "my_database");

// সংযোগ চেক করা
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// পেজ নম্বর ও পেজ সাইজ সেট করা
$limit = 10; // এক পৃষ্ঠায় কতটি রেকর্ড দেখানো হবে
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // পেজ নম্বর
$offset = ($page - 1) * $limit; // পেজ অনুযায়ী অফসেট নির্ধারণ

// Sorting এর জন্য প্যারামিটার গ্রহণ
$sort = isset($_GET['sort']) ? $_GET['sort'] : 'name'; // ডিফল্টভাবে 'name' দ্বারা সাজানো হবে
$order = isset($_GET['order']) ? $_GET['order'] : 'ASC'; // ডিফল্টভাবে ASC অর্ডার হবে

// পেজিনেটেড ও সোর্টেড কুয়েরি
$sql = "SELECT * FROM users ORDER BY $sort $order LIMIT $limit OFFSET $offset";
$result = $conn->query($sql);

// রেকর্ডগুলো দেখানো
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
    }
} else {
    echo "No records found.";
}

// পেজিনেশন লিঙ্ক তৈরি করা
$sqlTotal = "SELECT COUNT(*) FROM users"; // মোট রেকর্ডের সংখ্যা
$resultTotal = $conn->query($sqlTotal);
$rowTotal = $resultTotal->fetch_row();
$totalRecords = $rowTotal[0];
$totalPages = ceil($totalRecords / $limit); // মোট পেজের সংখ্যা

// পেজ লিঙ্ক প্রদর্শন
for ($i = 1; $i <= $totalPages; $i++) {
    echo "<a href='?page=$i&sort=$sort&order=$order'>$i</a> ";
}

// Sorting লিঙ্ক তৈরি করা
echo "<br><a href='?page=$page&sort=name&order=ASC'>Sort by Name ASC</a> | 
      <a href='?page=$page&sort=name&order=DESC'>Sort by Name DESC</a>";

// সংযোগ বন্ধ করা
$conn->close();
?>

এখানে:

  • $sort: এটি ব্যবহারকারীকে একটি কলাম (যেমন name) নির্বাচন করতে দেয় যা দিয়ে ডেটা সাজানো হবে।
  • $order: এটি সিলেক্ট করা হয়েছে ASC বা DESC, যাতে আপনি নির্বাচন করতে পারেন ডেটা অ্যাসেন্ডিং বা ডেসেন্ডিং অর্ডারে সাজাতে চান।
  • URL লিঙ্ক: পেজিনেশন এবং সোর্টিং লিঙ্কের মধ্যে GET parameters প্রেরণ করা হয়েছে যাতে ইউজার পেজ এবং অর্ডার নির্বাচন করতে পারেন।

৪. Sorting এবং Pagination: Best Practices

  1. Sanitize User Input: ব্যবহারকারীর কাছ থেকে আসা $_GET['sort']** এবং **$_GET['order'] এর মান যাচাই করুন, কারণ সরাসরি ব্যবহারকারীর ইনপুট ব্যবহার করা SQL Injection এর ঝুঁকি তৈরি করতে পারে। সঠিকভাবে এই মানগুলো validate করা উচিত।

    $valid_columns = ['name', 'id', 'email'];
    if (!in_array($sort, $valid_columns)) {
        $sort = 'name'; // ডিফল্ট কলাম
    }
    $order = ($order == 'DESC') ? 'DESC' : 'ASC'; // শুধুমাত্র ASC অথবা DESC
    
  2. Error Handling: কোয়েরি চলানোর সময় যদি কোন ত্রুটি ঘটে, তাহলে সেই ত্রুটি সঠিকভাবে হ্যান্ডেল করা উচিত।
  3. Performance Optimization: পেজিনেশন এবং সোর্টিং ব্যবহার করার সময় বড় ডেটাসেট হলে পারফরম্যান্সের দিকে নজর রাখতে হবে। সঠিক indexing এবং LIMIT/OFFSET ব্যবহার করা গুরুত্বপূর্ণ।

সারাংশ

PHPMySQL এর মাধ্যমে ResultSet পেজিনেট এবং সোর্ট করা সহজ। পেজিনেশন ব্যবহার করে ডেটা ছোট অংশে ভাগ করে দেখানো যায়, এবং ORDER BY কুয়েরি ব্যবহার করে ডেটা সজ্জিত করা যায়। পেজিনেশন এবং সোর্টিং একত্রিত করার জন্য, আপনি ডেটা LIMIT এবং OFFSET ব্যবহার করতে পারেন, যাতে ইউজার ইন্টারফেসে দ্রুত লোডিং হয়। Sanitize এবং validate ব্যবহারকারীর ইনপুট নিশ্চিত করতে গুরুত্বপূর্ণ, এবং বড় ডেট

Content added By
Promotion

Are you sure to start over?

Loading...