Database Tutorials PHP দিয়ে MySQL Query Execution এবং ResultSet Management গাইড ও নোট

622

PHP দিয়ে MySQL কুয়েরি এক্সিকিউট এবং রেজাল্টসেট ম্যানেজমেন্ট একটি গুরুত্বপূর্ণ পদক্ষেপ, যা ডেটাবেস থেকে ডেটা রিট্রিভ করতে এবং ফলাফলগুলো প্রক্রিয়া করতে ব্যবহৃত হয়। PHP এবং MySQL এর মধ্যে কুয়েরি এক্সিকিউশন সাধারণত mysqli বা PDO ব্যবহার করে করা হয়। এখানে আমরা mysqli এক্সটেনশনের মাধ্যমে কুয়েরি এক্সিকিউট এবং রেজাল্টসেট ম্যানেজমেন্ট দেখব।


১. MySQL Query Execution (কুয়েরি এক্সিকিউশন)

MySQL কুয়েরি এক্সিকিউট করতে mysqli_query() ফাংশন ব্যবহার করা হয়। এই ফাংশনটি একটি কুয়েরি এক্সিকিউট করে এবং তার ফলাফল রিটার্ন করে।

উদাহরণ: SELECT কুয়েরি এক্সিকিউশন

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydatabase";

// MySQL সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি এক্সিকিউট করা
$sql = "SELECT id, username, email FROM users";
$result = $conn->query($sql);  // কুয়েরি এক্সিকিউট

// ফলাফল চেক করা
if ($result->num_rows > 0) {
    // রেকর্ডগুলো প্রিন্ট করা
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["username"]. " - Email: " . $row["email"]. "<br>";
    }
} else {
    echo "0 results";
}

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

ব্যাখ্যা:

  • $conn->query($sql): এটি SELECT কুয়েরি এক্সিকিউট করে এবং ফলাফল রিটার্ন করে।
  • $result->fetch_assoc(): এটি প্রতিটি রেকর্ডকে অ্যাসোসিয়েটিভ অ্যারে হিসেবে রিটার্ন করে, যার মাধ্যমে ডেটা প্রদর্শন করা হয়।
  • $result->num_rows: এটি রিটার্ন করা রেজাল্ট সেটে মোট রেকর্ডের সংখ্যা প্রদর্শন করে।

২. INSERT, UPDATE, DELETE কুয়েরি এক্সিকিউশন

এই ধরনের কুয়েরিগুলোর জন্য mysqli_query() ফাংশন ব্যবহৃত হয়, কিন্তু ফলাফল হিসেবে কোনো রেজাল্টসেট থাকে না, তাই আমরা কেবল নিশ্চিত হই যে কুয়েরি সফলভাবে সম্পন্ন হয়েছে কিনা।

উদাহরণ: INSERT, UPDATE, DELETE কুয়েরি এক্সিকিউশন

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydatabase";

// MySQL সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);

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

// INSERT কুয়েরি
$sql = "INSERT INTO users (username, email) VALUES ('alice_smith', 'alice@example.com')";
if ($conn->query($sql) === TRUE) {
    echo "New record created successfully<br>";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

// UPDATE কুয়েরি
$sql = "UPDATE users SET email='alice_new@example.com' WHERE username='alice_smith'";
if ($conn->query($sql) === TRUE) {
    echo "Record updated successfully<br>";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

// DELETE কুয়েরি
$sql = "DELETE FROM users WHERE username='alice_smith'";
if ($conn->query($sql) === TRUE) {
    echo "Record deleted successfully<br>";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

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

ব্যাখ্যা:

  • $conn->query($sql): INSERT, UPDATE, DELETE কুয়েরি এক্সিকিউট করার জন্য এটি ব্যবহৃত হয়। সফল হলে TRUE রিটার্ন হয়।
  • $conn->error: যদি কোনো ত্রুটি ঘটে, তবে এটি ত্রুটির বার্তা দেখাবে।

৩. Prepared Statements (প্রিপেয়ারড স্টেটমেন্ট)

প্রিপেয়ারড স্টেটমেন্ট কুয়েরি এক্সিকিউশনে আরও নিরাপদ এবং কার্যকর পদ্ধতি প্রদান করে। এটি SQL ইনজেকশন থেকে রক্ষা করতে সাহায্য করে এবং ডেটা ব্যাচ প্রসেসিংয়ে কার্যকর হয়।

উদাহরণ: Prepared Statement দিয়ে কুয়েরি এক্সিকিউশন

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydatabase";

// MySQL সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);

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

// Prepared statement তৈরি করা
$stmt = $conn->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);  // 'ss' মানে দুটি স্ট্রিং (string)

// ভ্যালু সেট করা
$username = "bob_jones";
$email = "bob@example.com";

// এক্সিকিউট করা
$stmt->execute();

echo "New record created successfully<br>";

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

ব্যাখ্যা:

  • $conn->prepare(): এটি কুয়েরিকে প্রস্তুত করে।
  • $stmt->bind_param(): এখানে প্রথম প্যারামিটারটি ডেটা টাইপ (যেমন "ss" মানে দুটি স্ট্রিং) এবং দ্বিতীয় প্যারামিটার হলো ভ্যারিয়েবল।
  • $stmt->execute(): এটি কুয়েরি এক্সিকিউট করে।

৪. ResultSet Management (রেজাল্টসেট ম্যানেজমেন্ট)

MySQL থেকে ডেটা রিটার্ন হওয়ার পর, এটি এক্সিকিউট করা রেজাল্টসেট থেকে প্রয়োজনীয় তথ্য বের করা এবং ব্যবহার করা যায়। রেজাল্টসেট ম্যানেজমেন্টে প্রধানত fetch_assoc(), fetch_row(), এবং fetch_object() ফাংশন ব্যবহার করা হয়।

উদাহরণ: ফলাফলগুলি বিভিন্নভাবে রিটার্ন করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydatabase";

// MySQL সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি এক্সিকিউট করা
$sql = "SELECT id, username, email FROM users";
$result = $conn->query($sql);

// ফলাফল চেক করা
if ($result->num_rows > 0) {
    // অ্যাসোসিয়েটিভ অ্যারে ব্যবহার করে ডেটা রিটার্ন করা
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["username"]. " - Email: " . $row["email"]. "<br>";
    }

    // বা, রেজাল্টসেট থেকে এক রেকর্ড একটি রাউ হিসেবে নিতে পারেন
    $row = $result->fetch_row();
    echo "First record: " . $row[1] . " - " . $row[2] . "<br>";
    
    // বা, রেজাল্টসেট থেকে একটি অবজেক্ট হিসেবে নিতে পারেন
    $row = $result->fetch_object();
    echo "Object record: " . $row->username . " - " . $row->email . "<br>";
} else {
    echo "0 results";
}

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

ব্যাখ্যা:

  • $result->fetch_assoc(): এটি রেজাল্ট থেকে অ্যাসোসিয়েটিভ অ্যারে রিটার্ন করে।
  • $result->fetch_row(): এটি রেজাল্ট থেকে একটি রো হিসেবে রিটার্ন করে, যেখানে কলামগুলো ইনডেক্সের মাধ্যমে অ্যাক্সেস করা হয়।
  • $result->fetch_object(): এটি রেজাল্ট থেকে একটি অবজেক্ট রিটার্ন করে, যেখানে কলামগুলো অবজেক্টের প্রপার্টি হিসেবে অ্যাক্সেস করা হয়।

সারাংশ

PHP এবং MySQL দিয়ে কুয়েরি এক্সিকিউশন এবং রেজাল্টসেট ম্যানেজমেন্ট একটি

Content added By

mysqli এবং PDO দিয়ে SQL Query Execute করা

361

PHP দিয়ে SQL কুয়েরি এক্সিকিউট (Execute) করার জন্য MySQLi এবং PDO উভয়েই শক্তিশালী পদ্ধতি প্রদান করে। এই দুটি পদ্ধতির সাহায্যে SELECT, INSERT, UPDATE, DELETE সহ যেকোনো SQL কুয়েরি এক্সিকিউট করা যায়। এখানে উভয় পদ্ধতিতে SQL কুয়েরি এক্সিকিউট করার পদ্ধতি আলোচনা করা হবে।


1. MySQLi দিয়ে SQL Query Execute করা

1.1 Procedural মেথডে SQL Query Execute করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

// MySQLi সংযোগ স্থাপন
$conn = mysqli_connect($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি তৈরি
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);

// কুয়েরি এক্সিকিউট করা এবং ফলাফল চেক করা
if (mysqli_num_rows($result) > 0) {
    // প্রতিটি রেকর্ড প্রদর্শন
    while($row = mysqli_fetch_assoc($result)) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
    }
} else {
    echo "0 results";
}

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

এখানে, mysqli_query() ফাংশন ব্যবহার করে SQL কুয়েরি এক্সিকিউট করা হয়েছে এবং mysqli_fetch_assoc() ফাংশন দিয়ে ফলাফল বের করা হয়েছে।

1.2 Object-Oriented মেথডে SQL Query Execute করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

// MySQLi সংযোগ স্থাপন
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি তৈরি
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// কুয়েরি এক্সিকিউট করা এবং ফলাফল চেক করা
if ($result->num_rows > 0) {
    // প্রতিটি রেকর্ড প্রদর্শন
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
    }
} else {
    echo "0 results";
}

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

এখানে, query() মেথড ব্যবহার করে SQL কুয়েরি এক্সিকিউট করা হয়েছে এবং fetch_assoc() মেথড দিয়ে ফলাফল বের করা হয়েছে।


2. PDO দিয়ে SQL Query Execute করা

2.1 PDO দিয়ে SQL Query Execute করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

try {
    // PDO সংযোগ তৈরি করা
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SELECT কুয়েরি তৈরি
    $sql = "SELECT id, name, email FROM users";

    // কুয়েরি এক্সিকিউট করা
    $stmt = $conn->query($sql);

    // কুয়েরি এক্সিকিউট করার পর ফলাফল চেক করা
    if ($stmt->rowCount() > 0) {
        // প্রতিটি রেকর্ড প্রদর্শন
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
        }
    } else {
        echo "0 results";
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn = null;
?>

এখানে, query() মেথড ব্যবহার করে SQL কুয়েরি এক্সিকিউট করা হয়েছে এবং fetch(PDO::FETCH_ASSOC) দিয়ে ফলাফল বের করা হয়েছে।


3. Prepared Statements ব্যবহার করে SQL Query Execute করা

Prepared Statements SQL ইনজেকশন থেকে সুরক্ষা প্রদান করে এবং ডেটাবেসের কার্যক্ষমতা বৃদ্ধি করে। এটি ডেটাবেসের সাথে কাজ করার সেরা পদ্ধতি হিসেবে বিবেচিত।

3.1 MySQLi দিয়ে Prepared Statement ব্যবহার করে SQL Query Execute করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

// MySQLi সংযোগ স্থাপন
$conn = mysqli_connect($servername, $username, $password, $dbname);

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

// প্রস্তুত বিবৃতি তৈরি করা
$stmt = $conn->prepare("SELECT id, name, email FROM users WHERE email = ?");
$stmt->bind_param("s", $email);

// মান সেট করা
$email = "john@example.com";

// কুয়েরি এক্সিকিউট করা
$stmt->execute();

// ফলাফল বের করা
$result = $stmt->get_result();
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
    }
} else {
    echo "0 results";
}

// প্রস্তুত বিবৃতি বন্ধ করা এবং সংযোগ বন্ধ করা
$stmt->close();
$conn->close();
?>

এখানে, prepare() মেথড দিয়ে SQL কুয়েরি প্রস্তুত করা হয়েছে এবং bind_param() দিয়ে মান বাইন্ড করা হয়েছে।

3.2 PDO দিয়ে Prepared Statement ব্যবহার করে SQL Query Execute করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";

try {
    // PDO সংযোগ তৈরি করা
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // প্রস্তুত কুয়েরি তৈরি করা
    $stmt = $conn->prepare("SELECT id, name, email FROM users WHERE email = :email");

    // মান বাইন্ড করা
    $stmt->bindParam(':email', $email);

    // মান সেট করা
    $email = "john@example.com";

    // কুয়েরি এক্সিকিউট করা
    $stmt->execute();

    // ফলাফল বের করা
    if ($stmt->rowCount() > 0) {
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
        }
    } else {
        echo "0 results";
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn = null;
?>

এখানে, prepare() মেথড দিয়ে SQL কুয়েরি প্রস্তুত করা হয়েছে এবং bindParam() দিয়ে মান বাইন্ড করা হয়েছে।


উপসংহার

MySQLi এবং PDO উভয় পদ্ধতিই PHP ডেভেলপমেন্টে SQL কুয়েরি এক্সিকিউট করার জন্য শক্তিশালী এবং জনপ্রিয় পদ্ধতি। mysqli_query() এবং query() মেথডের মাধ্যমে আপনি সহজে SQL কুয়েরি এক্সিকিউট করতে পারেন। তবে, Prepared Statements ব্যবহারের মাধ্যমে SQL ইনজেকশন থেকে সুরক্ষা নিশ্চিত করা সম্ভব, এবং এটি প্রোডাকশনে আরও নিরাপদ এবং কার্যকরী।

Content added By

Multiple Rows এবং Columns Fetch করা

279

PHP দিয়ে MySQL ডাটাবেস থেকে একাধিক row এবং column ফেচ করা অত্যন্ত সাধারণ এবং গুরুত্বপূর্ণ একটি কাজ। একাধিক রেকর্ড একসাথে ফেচ করতে SELECT কোয়েরি ব্যবহার করা হয়। এটি ডাটাবেসের থেকে প্রয়োজনীয় ডাটা একত্রে বের করতে সহায়তা করে।

এই গাইডে আমরা দেখব কীভাবে mysqli এবং PDO ব্যবহার করে একাধিক রো (row) এবং কলাম (column) ফেচ করা যায়।


1. mysqli ব্যবহার করে Multiple Rows এবং Columns Fetch করা

1.1 mysqli (প্রসিডিউরাল স্টাইল)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// ডাটাবেস সংযোগ
$conn = mysqli_connect($servername, $username, $password, $dbname);

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

// SELECT কোয়েরি
$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);

// একাধিক রেকর্ড ফেচ করা
if (mysqli_num_rows($result) > 0) {
    // প্রতিটি রেকর্ড ফেচ করা
    while($row = mysqli_fetch_assoc($result)) {
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "No results found";
}

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

1.2 mysqli (অবজেক্ট-ওরিয়েন্টেড স্টাইল)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

// ডাটাবেস সংযোগ
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কোয়েরি
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// একাধিক রেকর্ড ফেচ করা
if ($result->num_rows > 0) {
    // প্রতিটি রেকর্ড ফেচ করা
    while($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "No results found";
}

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

2. PDO ব্যবহার করে Multiple Rows এবং Columns Fetch করা

PDO দিয়ে একাধিক রেকর্ড ফেচ করার জন্য fetchAll() মেথড ব্যবহার করা হয়, যা একসাথে সমস্ত রেকর্ড ফেচ করে। fetch() মেথডও ব্যবহার করা যায় একাধিক রেকর্ড প্রক্রিয়া করার জন্য।

2.1 PDO ব্যবহার করে Multiple Rows Fetch করা

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    // PDO দিয়ে ডাটাবেস সংযোগ
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    
    // PDO তে এরর হ্যান্ডলিং সেট করা
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SELECT কোয়েরি
    $sql = "SELECT id, name, email FROM users";
    $stmt = $conn->prepare($sql);
    $stmt->execute();

    // একাধিক রেকর্ড ফেচ করা
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($result) {
        foreach ($result as $row) {
            echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
        }
    } else {
        echo "No results found";
    }

} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn = null;
?>

2.2 PDO ব্যবহার করে fetch() মেথড দিয়ে Multiple Rows Fetch করা

fetch() মেথড একে একে রেকর্ড ফেচ করে, তাই লুপের মাধ্যমে একাধিক রেকর্ড প্রক্রিয়া করা হয়।

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";

try {
    // PDO দিয়ে ডাটাবেস সংযোগ
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    
    // PDO তে এরর হ্যান্ডলিং সেট করা
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // SELECT কোয়েরি
    $sql = "SELECT id, name, email FROM users";
    $stmt = $conn->prepare($sql);
    $stmt->execute();

    // একাধিক রেকর্ড ফেচ করা
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }

} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

// সংযোগ বন্ধ করা
$conn = null;
?>

3. ফেচের বিভিন্ন পদ্ধতি

MySQL থেকে একাধিক রো এবং কলাম ফেচ করার সময়, আপনি ফেচের বিভিন্ন পদ্ধতি ব্যবহার করতে পারেন, যেগুলোর মাধ্যমে ডাটা অ্যাক্সেসের পদ্ধতি ভিন্ন হয়।

3.1 fetch_assoc() (mysqli)

এটি একটি অ্যাসোসিয়েটিভ অ্যারে রিটার্ন করে, যেখানে কলাম নামের মাধ্যমে ডাটা অ্যাক্সেস করা যায়।

$row = mysqli_fetch_assoc($result);
echo $row['name']; // 'name' কলামের ডাটা

3.2 fetch_row() (mysqli)

এটি ইনডেক্স অ্যারে রিটার্ন করে, যেখানে কলামের ডাটা ইনডেক্সের মাধ্যমে অ্যাক্সেস করা যায়।

$row = mysqli_fetch_row($result);
echo $row[0]; // প্রথম কলামের ডাটা

3.3 fetch_object() (mysqli)

এটি একটি অবজেক্ট রিটার্ন করে, যেখানে কলাম নাম প্রপার্টি হিসেবে অ্যাক্সেস করা যায়।

$row = mysqli_fetch_object($result);
echo $row->name; // 'name' কলামের ডাটা

3.4 fetchAll() (PDO)

PDO তে fetchAll() মেথড ব্যবহার করে একসাথে সমস্ত রেকর্ড ফেচ করা যায়। এটি একাধিক রেকর্ড একই সাথে রিটার্ন করে।

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
    echo $row['name'];
}

3.5 fetch() (PDO)

PDO তে fetch() মেথড একে একে রেকর্ড ফেচ করে। এটি ব্যবহারের সময়, প্রতিটি রেকর্ড লুপে ফেচ করা হয়।

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['name'];
}

4. Performance Optimization Tips

  • LIMIT ব্যবহার করুন: যখন বড় ডাটাবেস থেকে ডাটা রিট্রিভ করবেন, তখন LIMIT ব্যবহার করে ডাটা একসাথে না নিয়ে কিছু রেকর্ডই নিয়ে আসুন। এতে পারফরম্যান্স ভালো হয়।

    উদাহরণ:

    $sql = "SELECT id, name, email FROM users LIMIT 10";
    
  • Indexing ব্যবহার করুন: SELECT কোয়েরি আরও দ্রুত করার জন্য ডাটাবেসে সঠিকভাবে indexing ব্যবহার করুন।
  • Prepared Statements ব্যবহার করুন: SQL ইনজেকশন থেকে রক্ষা পেতে এবং ডাটা নিরাপত্তা বাড়ানোর জন্য prepared statements ব্যবহার করুন।

সারাংশ

PHP দিয়ে MySQL ডাটাবেস থেকে একাধিক রো এবং কলাম ফেচ করতে mysqli এবং PDO দুইটি পদ্ধতি ব্যবহৃত হয়। যেখানে mysqli প্রসিডিউরাল এবং অবজেক্ট-ওরিয়েন্টেড স্টাইল সাপোর্ট করে, PDO একাধিক ডাটাবেস সিস্টেম সাপোর্ট করে এবং কোডের পোর্টেবিলিটি বাড়ায়। একাধিক রেকর্ড ফেচ করার সময় fetchAll() এবং fetch() পদ্ধতি ব্যবহৃত হয়। এর মাধ্যমে কোডের রিডেবিলিটি এবং কার্যকারিতা নিশ্চিত করা যায়।

Content added By

Associative এবং Indexed Arrays ব্যবহার করে ResultSet Management

249

PHP এবং MySQL ব্যবহার করে ডেটাবেস থেকে ডেটা পুনরুদ্ধারের পর, সেই ডেটা প্রক্রিয়া বা প্রদর্শনের জন্য অ্যারে আকারে রাখা হয়। ResultSet ম্যানেজমেন্টের জন্য Associative Arrays এবং Indexed Arrays দুটি পদ্ধতি ব্যবহার করা যায়। এখানে আমরা দেখব, কীভাবে এই দুটি অ্যারে ব্যবহার করে ডেটা প্রক্রিয়া করা যায়।


1. Associative Arrays কি?

Associative Array একটি ধরনের অ্যারে যেখানে প্রতিটি মান একটি কী (key) দ্বারা চিহ্নিত হয়। MySQL এর SELECT কুয়েরি থেকে ডেটা রিটার্ন করার সময়, অ্যাসোসিয়েটিভ অ্যারে সাধারণত ব্যবহার করা হয়, কারণ এতে কলামের নাম (যেমন: column_name) কী হিসেবে থাকে এবং মানটি তার মানের হিসেবে থাকে।

1.1 Associative Array ব্যবহার করে ডেটা প্রাপ্তি

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "exampleDB";

// MySQL সার্ভারের সাথে সংযোগ তৈরি করা
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি চালানো
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// যদি রেকর্ড পাওয়া যায়
if ($result->num_rows > 0) {
  // অ্যাসোসিয়েটিভ অ্যারে ব্যবহার করে ডেটা প্রাপ্তি
  while($row = $result->fetch_assoc()) {
    echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
  }
} else {
  echo "0 results";
}

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

এখানে:

  • $result->fetch_assoc(): এই মেথডটি প্রতিটি রেকর্ডকে অ্যাসোসিয়েটিভ অ্যারে হিসেবে ফেরত দেয়, যেখানে কলামের নাম কী হিসেবে থাকে।
  • ডেটা পুনরুদ্ধার করার পর, আপনি কেবল কী ব্যবহার করে ডেটা অ্যাক্সেস করতে পারেন, যেমন $row["id"], $row["name"]

অ্যাসোসিয়েটিভ অ্যারে বিশেষভাবে উপকারী যখন আপনি কলামের নাম ব্যবহার করে ডেটা এক্সেস করতে চান, বিশেষত বড় এবং জটিল ডেটাবেস স্কিমায়।


2. Indexed Arrays কি?

Indexed Array হল একটি অ্যারে যেখানে প্রতিটি মান একটি ইন্টিজার ইনডেক্স দ্বারা চিহ্নিত হয়। MySQL থেকে Indexed Array সাধারণত ব্যবহার করা হয় যখন আপনি শুধুমাত্র ডেটার মান এবং ইন্ডেক্সের মাধ্যমে রেকর্ডগুলি অ্যাক্সেস করতে চান।

2.1 Indexed Array ব্যবহার করে ডেটা প্রাপ্তি

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "exampleDB";

// MySQL সার্ভারের সাথে সংযোগ তৈরি করা
$conn = new mysqli($servername, $username, $password, $dbname);

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

// SELECT কুয়েরি চালানো
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);

// যদি রেকর্ড পাওয়া যায়
if ($result->num_rows > 0) {
  // ইনডেক্সড অ্যারে ব্যবহার করে ডেটা প্রাপ্তি
  while($row = $result->fetch_row()) {
    echo "ID: " . $row[0] . " - Name: " . $row[1] . " - Email: " . $row[2] . "<br>";
  }
} else {
  echo "0 results";
}

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

এখানে:

  • $result->fetch_row(): এই মেথডটি একটি ইনডেক্সড অ্যারে ফেরত দেয়, যেখানে ডেটার মান সংখ্যা দিয়ে ইনডেক্স করা থাকে (যেমন $row[0], $row[1], $row[2] ইত্যাদি)।
  • আপনি ইনডেক্সের মাধ্যমে ডেটার মান অ্যাক্সেস করতে পারেন।

ইনডেক্সড অ্যারে সাধারণত তখন ব্যবহৃত হয়, যখন ডেটার কলামের নামের পরিবর্তে, শুধুমাত্র তাদের সিকোয়েন্স বা পজিশন (ইনডেক্স) দ্বারা ডেটা অ্যাক্সেস করতে চান।


3. Difference between Associative and Indexed Arrays

বৈশিষ্ট্যAssociative ArrayIndexed Array
কী (Key)কলামের নাম থাকে (যেমন: id, name, email)ইনডেক্স (0, 1, 2, ...)
ব্যবহারকলামের নাম ব্যবহার করে ডেটা অ্যাক্সেসইনডেক্স দ্বারা ডেটা অ্যাক্সেস
প্রফুল্লতাজটিল ডেটাবেস স্কিমা এবং ডেটাবেস রিডেবল কোডে উপকারীসহজ ডেটা অ্যাক্সেসের জন্য উপকারী

4. ResultSet Management এর কিছু অতিরিক্ত বিষয়

  • fetch_assoc() এবং fetch_row() মেথডগুলি PHP MySQL এর mysqli_result ক্লাসের মেথড। যেখানে fetch_assoc() অ্যাসোসিয়েটিভ অ্যারে ফেরত দেয়, আর fetch_row() ইনডেক্সড অ্যারে ফেরত দেয়।
  • আপনি একে অপরের সাথে মিশিয়ে ব্যবহার করতে পারেন, তবে সাধারণত অ্যাসোসিয়েটিভ অ্যারে বেশি ব্যবহার করা হয়, কারণ এটি কোডের রিডেবিলিটি এবং মেইন্টেনেবিলিটি উন্নত করে।

5. ResultSet Data ফিল্টারিং এবং প্রক্রিয়াকরণ

আপনি যদি অ্যারে থেকে কিছু নির্দিষ্ট ডেটা এক্সট্র্যাক্ট করতে চান, তাহলে PHP অ্যারে ফাংশন ব্যবহার করতে পারেন, যেমন:

  • array_filter(): অ্যারে থেকে কিছু নির্দিষ্ট মান ফিল্টার করতে।
  • array_map(): অ্যারের প্রতিটি মানের উপর ফাংশন প্রয়োগ করতে।
  • array_merge(): একাধিক অ্যারে একত্রিত করতে।
// অ্যারে ফিল্টারিং উদাহরণ
$users = [
  ["id" => 1, "name" => "John", "email" => "john@example.com"],
  ["id" => 2, "name" => "Jane", "email" => "jane@example.com"]
];

$filtered = array_filter($users, function($user) {
  return $user['name'] === 'John'; // 'John' নামের ইউজার ফিল্টার করা হচ্ছে
});

print_r($filtered);

এটি আপনাকে আরো জটিল ডেটা প্রক্রিয়াকরণের জন্য সহায়তা করবে।


সারাংশ

PHP এবং MySQL ব্যবহার করে ডেটা প্রক্রিয়া করার সময় Associative Arrays এবং Indexed Arrays দুটি ভিন্ন ধরনের অ্যারে ব্যবহার করা হয়। Associative Arrays যখন কলামের নাম দিয়ে ডেটা এক্সেস করতে হয়, তখন উপকারী, আর Indexed Arrays সহজ ডেটা অ্যাক্সেসের জন্য ব্যবহৃত হয়। এই দুটি অ্যারের সাহায্যে আপনি MySQL থেকে প্রাপ্ত ডেটাকে আরও কার্যকরভাবে ম্যানেজ এবং প্রক্রিয়া করতে পারেন।


Content added By

ResultSet Paginate এবং Sort করা

280

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...