Practical use of PHP in_array function

Practical use of PHP in_array function

PHP তে in_array() ফাংশনটি মূলত একটি অ্যারের মধ্যে একটি নির্দিষ্ট মান অনুসন্ধানের জন্য ব্যবহৃত হয়। আপনি কখন এবং কোথায় এটি ব্যবহার করতে পারেন তার জন্য এখানে কিছু সাধারণ use cases এবং বিবরণ রয়েছে:

১. Availability Check:

ডেটা অখণ্ডতা নিশ্চিত করতে, গ্রহণযোগ্য মানগুলির একটি পূর্বনির্ধারিত তালিকার বিপরীতে ইউজারের ইনপুটগুলিকে যাচাই করতে আপনি in_array() ফাঙ্কশন ব্যবহার করতে পারেন।

Real-World Example: Online Ticket Booking System

একটি সিনেমা, যেকোনো পরিবহন বা একটি ইভেন্টের জন্য একটি অনলাইন টিকিট বুকিং সিস্টেম বিবেচনা করুন, যেখানে ইউজাররা একটি শোয়ের জন্য আসন সিলেক্ট করতে পারেন। এই ধরনের সিস্টেমে, আপনি input validation এর জন্য in_array() ফাংশনটি ব্যবহার করতে পারেন যাতে আসন সিলেক্টের জন্য ইউজারের ইনপুটগুলি বৈধ এবং পূর্বনির্ধারিত গ্রহণযোগ্য value গুলির মধ্যে থাকে। অনুশীলনে এটি কীভাবে কাজ করে তা এখানে:

চলুন প্রথমে এই উদাহরণ টি দেখার জন্য নিম্নোক্ত SQL রান করার মাধ্যমে আমাদের প্রয়োজনীয় টেবিল টি এবং সেই সাথে কিছু স্যাম্পল ডেটা তৈরি করে ফেলি:

-- Create the 'seats' table
CREATE TABLE seats (
    seat_id INT AUTO_INCREMENT PRIMARY KEY,
    seat_number VARCHAR(10) NOT NULL,
    is_booked TINYINT(1) NOT NULL DEFAULT 0
);
 
-- Insert sample data for available seats
INSERT INTO seats (seat_number, is_booked) VALUES
    ('A1', 0),
    ('A2', 0),
    ('A3', 0),
    ('B1', 0),
    ('B2', 0),
    ('B3', 0),
    ('C1', 0),
    ('C2', 0),
    ('C3', 0),
    ('D1', 0),
    ('D2', 0),
    ('D3', 0),

উপরের SQL কোডে:

  • আমরা seats নামে একটি টেবিল তৈরি করি যার কলামগুলি seat_id, seat_number এবং is_booked আছে। seat_id হল একটি auto-incremented primary key,, seat_number সিট শনাক্তকারী (যেমন, ‘A1’, ‘A2’) সংরক্ষণ করে, এবং is_booked হল একটি boolean field যা নির্দেশ করে যে একটি আসন বুক করা হয়েছে কিনা (সিটটি খালি বুঝানোর জন্য 0, অলরেডি বুক করা হয়েছে বুঝানোর জন্য 1)।
  • আমরা seats টেবিলে খালি আসনের স্যাম্পল ডেটা ইনসার্ট করি। আপনি একই প্যাটার্ন অনুসরণ করে অতিরিক্ত খালি আসন প্রতিনিধিত্ব করতে আরো সারি যোগ করতে পারেন।

এই এসকিউএল কমান্ডগুলি আপনাকে প্রয়োজনীয় ডাটাবেস কাঠামো সেট আপ করতে এবং আপনার অনলাইন টিকিট বুকিং সিস্টেমের জন্য প্রাথমিক ডেটা দিয়ে এটি পূরণ করতে সহায়তা করবে।

Create showTime.php File

এবার showTime.php নামে নিম্নোক্ত class ফাইলটি তৈরি করুন , এবং নিম্নোক্ত কোডগুলো যোগ করুন :

<?php 
class showTime {
    private $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function getAvailableSeats() {
        $stmt = $this->db->prepare("SELECT seat_number FROM seats WHERE is_booked = 0");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_COLUMN);
    }

    public function bookSeats($selectedSeats) {
        $availableSeats = $this->getAvailableSeats();

        $validSeats = array_filter($selectedSeats, function($seat) use ($availableSeats) {
            return in_array($seat, $availableSeats);
        });

        if (count($validSeats) > 0) {
            // Perform the booking process and update the database here
            $this->updateDatabase($validSeats);
            return "Seats booked: " . implode(', ', $validSeats);
        } else {
            return "This seat is not availabel. Please choose available seats.";
        }
    }

    public function getBookedSeats() {
        try {
            $stmt = $this->db->prepare("SELECT seat_number FROM seats WHERE is_booked = 1");
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_COLUMN);
        } catch (PDOException $e) {
            // Handle database query error, e.g., log the error or return an empty array
            return [];
        }
    }

    private function updateDatabase($selectedSeats) {
        $placeholders = implode(', ', array_fill(0, count($selectedSeats), '?'));
        $stmt = $this->db->prepare("UPDATE seats SET is_booked = 1 WHERE seat_number IN ($placeholders)");
        $stmt->execute($selectedSeats);
    }
}


// Database connection
$dsn = "mysql:host=localhost;dbname=test";
$username = "root";
$password = "";

try {
    $db = new PDO($dsn, $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

// Example usage:
$showtime = new showTime($db);

এই উদাহরণে:

  • Showtime class খালি আসন গুলো খুঁজে বের করে আনতে এবং ডাটাবেসে booking status আপডেট করতে PDO ব্যবহার করে ডাটাবেসের সাথে যোগাযোগ করে।
  • getAvailableSeats method ডাটাবেস থেকে খালি আসন গুলো খুঁজে বের করে।
  • getBookedSeats method ডাটাবেস থেকে বুক করা আসন গুলো খুঁজে বের করে।
  • updateDatabase method টি সিলেক্টেড আসনগুলিকে বুক করা হিসাবে চিহ্নিত করতে ডেটাবেস আপডেট করে।

এই কোডটি ব্যবহার করার জন্য, আপনাকে আপনার প্রকৃত database credentials গুলো “your_database_name”, “your_username”, এবং “your_password” প্রতিস্থাপন করতে হবে।

Create book_seats.php file

এবার আমরা আমাদের ফ্রন্টএন্ড কোডের জন্য book_seats.php নামে একটি নতুন ফাইল তৈরি করব। এই ফাইলে, input validation, database interaction এবং ক্লায়েন্টকে পাঠানোর জন্য একটি response তৈরি সহ seat booking request করার জন্য আমাদেরকে সার্ভার-সাইড লজিক প্রয়োগ করতে হবে। এখানে একটি নমুনা book_seats.php ফাইল আছে:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Include database connection code
    require_once 'showTime.php';

    // Get selected seats from the POST data
    $selectedSeats = isset($_POST['seats']) ? $_POST['seats'] : [];

    if (empty($selectedSeats)) {
        echo "No seats selected.";
        exit;
    }

    // Initialize the Showtime class (similar to the previous PHP code)
    $showtime = new Showtime($db);

    // Attempt to book the selected seats
    $result = $showtime->bookSeats($selectedSeats);

    echo $result;
} else {
    // Handle non-POST requests, e.g., redirect to the booking page
    header('Location: booking_page.html');
}
?>

এই book_seats.php ফাইলে:

  • request method POST কিনা তা নিশ্চিত করতে আমরা পরীক্ষা করি যে এটি একটি seat booking request. যদি এটি একটি POST request না হয় তবে আপনি অন্যান্য case গুলো হ্যান্ডেল করতে পারেন, যেমন ইউজারদের booking page এ redirecting করা।
  • আমরা POST ডেটা থেকে selected seat গুলি খুঁজে বের করি৷ নিশ্চিত করুন যে $_POST[‘seats’] আপনার jQuery AJAX request ব্যবহৃত field name এর সাথে মেলে।
  • আমরা input validation সঞ্চালন এবং কোন আসন selected করা না হয় এমন cases হ্যান্ডেল করা।
  • আমরা seat booking প্রসেস করার জন্য পূর্ববর্তী পিএইচপি কোডের মতো শোটাইম ক্লাস ইনিশিয়ালাইজ করি। bookSeats method বুকিং প্রক্রিয়া হ্যান্ডেল করে এবং ফলাফল প্রদান করে।
  • অবশেষে, আমরা ক্লায়েন্টের কাছে বুকিং ফলাফল প্রদর্শন করি, যা ফ্রন্ট-এন্ড HTML page এ message div-এ প্রদর্শিত হবে।

Create get_seats.php file

খালি সিট গুলো এবং বুক করা সিট গুলোকে চেকবক্স আকারে একটি লিস্টে আনতে আমরা get_seats.php ফাইল তৈরি করব। এর জন্য আমরা নিম্নলিখিত পিএইচপি কোড ব্যবহারকরব । এই স্ক্রিপ্টটি ডাটাবেস থেকে সিটের ডেটা নিয়ে আসে এবং চেকবক্স লিস্টের জন্য HTML তৈরি করে:

<?php
// Include the database connection code
require_once 'showTime.php';

// Initialize the Showtime class (similar to the previous PHP code)
$showtime = new showTime($db);

// Get available and booked seats
$availableSeats = $showtime->getAvailableSeats();
$bookedSeats = $showtime->getBookedSeats();

// Create the HTML for the checkbox list
$html = '';

foreach ($availableSeats as $seat) {
    $html .= '<label><input type="checkbox" name="seat" value="' . $seat . '"> ' . $seat . ' (Available)</label><br>';
}

foreach ($bookedSeats as $seat) {
    $html .= '<label><input type="checkbox" name="seat" value="' . $seat . '" disabled> ' . $seat . ' (Booked)</label><br>';
}

echo $html;
?>

এই get_seats.php ফাইলে:

  • আমরা ডাটাবেস সংযোগ কোড include করি, যা showTime.php ফাইলে রয়েছে। নিশ্চিত করুন যে আপনার showTime.php স্ক্রিপ্ট আপনার ডাটাবেসের সাথে একটি PDO সংযোগ স্থাপন করে।
  • খালি এবং বুক করা আসনগুলি খুঁজে বের করতে আমরা showTime class ইনিশিয়ালাইজ করি। getAvailableSeats এবং getBookedSeats method সিট ডেটা আনার জন্য ব্যবহার করা হয়।
  • আমরা চেকবক্স তালিকার লিস্টের জন্য HTML তৈরি করি। খালি আসনগুলির জন্য, চেকবক্সগুলি সিট নম্বরের সাথে মান হিসাবে তৈরি করা হয় এবং লেবেলটি “Available” নির্দেশ করে। বুক করা আসনগুলির জন্য, চেকবক্সগুলিও তৈরি করা হয় কিন্তু অক্ষম করা হয় এবং “Booked” হিসাবে লেবেল করা হয়।
  • চেকবক্স তালিকার জন্য generated HTML ক্লায়েন্টের কাছে প্রদর্শিত হয় এবং HTML page এর seatSelection div-এ ঢোকানো হবে।

এই স্ক্রিপ্টটি ধরে নেয় যে আপনার showTime ক্লাসে ডেটাবেস থেকে খালি এবং বুক করা আসনগুলি খুঁজে বের করার মেথড রয়েছে। আপনার নির্দিষ্ট database structure এবং logic অনুযায়ী এটি আপডেট করতে পারেন।

Create booking_page.html File

এবার আমরা HTML page এ একটি checkbox list হিসাবে সমস্ত খালি এবং বুক করা আসনগুলি প্রদর্শন করতে, আপনি আপনার ফ্রন্ট-এন্ড কোডটি নিম্নরূপ কোডগুলো যোগ করতে পারেন:

<!DOCTYPE html>
<html>
<head>
    <title>Online Ticket Booking</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h1>Online Ticket Booking</h1>

    <div>
        <label>Select Seats:</label>
        <div id="seatSelection">
            <!-- Available Seats will be dynamically populated here -->
        </div>
        <button id="bookButton">Book Selected Seats</button>
    </div>

    <div id="message"></div>

    <script>
        $(document).ready(function() {
            // Load available seats when the page loads
            $.ajax({
                type: "GET",
                url: "get_seats.php", // The PHP backend URL to fetch seat data
                success: function(response) {
                    $('#seatSelection').html(response);
                }
            });

            $('#bookButton').click(function() {
                var selectedSeats = [];
                $("input[name='seat']:checked").each(function() {
                    selectedSeats.push($(this).val());
                });

                if (selectedSeats.length === 0) {
                    $('#message').html("No seats selected.");
                    return;
                }

                $.ajax({
                    type: "POST",
                    url: "book_seats.php", // The PHP backend URL for booking seats
                    data: { seats: selectedSeats },
                    success: function(response) {
                        $('#message').html(response);
                    }
                });
            });
        });
    </script>
</body>
</html>

এই HTML কোডে:

  • checkboxes হিসাবে খালি আসনগুলিকে dynamically পপুলেট করার জন্য আমরা id seatSelection সহ একটি div তৈরি করি।
  • একটি get_seats.php স্ক্রিপ্টে AJAX GET request ব্যবহার করে পেজটি লোড হলে আমরা খালি আসনগুলি লোড করি। ডাটাবেস থেকে খালি এবং বুক করা আসনগুলির চেকবক্স তালিকা আনতে এবং তৈরি করতে আপনাকে get_seats.php স্ক্রিপ্ট তৈরি করতে হবে।
  • আসন নির্বাচনের জন্য, আমরা name=’seat’ এবং seat number প্রতিনিধিত্বকারী একটি মান সহ চেকবক্স যুক্ত করি। ইউজাররা চেকবক্স চেক করে একাধিক আসন নির্বাচন করতে পারেন।
  • যখন “Book Selected Seats” button এ ক্লিক করা হয়, তখন জাভাস্ক্রিপ্ট কোড নির্বাচিত আসনগুলিকে সংগ্রহ করে এবং একটি POST request ব্যবহার করে সার্ভারে পাঠায়।

খালি এবং বুক করা আসনগুলির চেকবক্স তালিকা আনতে এবং জেনারেট করতে এবং আপনার ডাটাবেসের উপর ভিত্তি করে এটি আপডেট করতে আপনাকে get_seats.php স্ক্রিপ্টটি ইমপ্লিমেন্ট করতে হবে। এছাড়াও, নিশ্চিত করুন যে আপনার book_seats.php স্ক্রিপ্ট booking process হ্যান্ডেল করে এবং booking result রিটার্ন দেয়।

Output:

২. Conditional Execution:

আপনার স্ক্রিপ্টগুলিতে dynamic আচরণের জন্য একটি অ্যারেতে একটি নির্দিষ্ট মান পাওয়া যায় কিনা তার উপর ভিত্তি করে আপনি শর্তসাপেক্ষে কোড চালানোর জন্য in_array ফাংশন ব্যবহার করতে পারেন।

এখানে একটি উদাহরণ দেওয়া হয়েছে, যা শর্তসাপেক্ষ সম্পাদনের জন্য in_array ফাংশন ব্যবহার করে একটি role-based access control system কে অনুকরণ করে। এই ক্লাসটি আপনাকে ইউজারের roles এর উপর ভিত্তি করে শর্তসাপেক্ষে কোড এক্সেকিউট এর অনুমতি দেবে।

তবে কোডটি এক্সেকিউট করার পূর্বে , প্রথমে আপনাকে users এবং actions এই table দুটির structure এবং স্যাম্পল ডেটা তৈরি করে নিতে হবে। আপনি নিম্নোক্ত SQL রান করে কাজটি করতে পারেন :

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    roles VARCHAR(255) NOT NULL
);

CREATE TABLE actions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    role VARCHAR(255) NOT NULL
);

INSERT INTO users (username, roles) VALUES
('user1', 'user'),
('user2', 'user'),
('editor1', 'user,editor'),
('admin1', 'user,editor,admin');

INSERT INTO actions (name, role) VALUES
('view_profile', 'user'),
('edit_profile', 'user,editor'),
('delete_user', 'admin');

এখন, আসুন AccessControl এর জন্য একটি পিএইচপি ক্লাস তৈরি করি এবং এর ব্যবহার প্রদর্শন করি:

<?php
class AccessControl
{
    private $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function userHasPermission($username, $action)
    {
        $stmt = $this->db->prepare("
            SELECT roles FROM users WHERE username = :username
        ");
        $stmt->bindParam(':username', $username);
        $stmt->execute();
        $userRoles = explode(',', $stmt->fetchColumn());

        $stmt = $this->db->prepare("
            SELECT role FROM actions WHERE name = :action
        ");
        $stmt->bindParam(':action', $action);
        $stmt->execute();
        $allowedRoles = explode(',', $stmt->fetchColumn());

        foreach ($userRoles as $userRole) {
            if (in_array($userRole, $allowedRoles)) {
                return true;
            }
        }

        return false;
    }
}

// Usage example:
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = '';

try {
    $db = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

$accessControl = new AccessControl($db);

$username = 'user1';
$action = 'delete_user';

if ($accessControl->userHasPermission($username, $action)) {
    echo "$username can perform the action: $action\n";
} else {
    echo "$username is not allowed to perform the action: $action\n";
}

Output:

user1 is not allowed to perform the action: delete_user

এই উদাহরণে, AccessControl ক্লাস একটি ডাটাবেস কানেকশন নেয় এবং চেক করে যে ইউজাররা তাদের নির্ধারিত roles এর উপর ভিত্তি করে একটি নির্দিষ্ট ক্রিয়া সম্পাদন করার অনুমতি আছে কিনা। role গুলি ডাটাবেসে comma-separated values হিসাবে সংরক্ষণ করা হয়।

আপনি প্রয়োজন অনুসারে এসকিউএল কোয়েরি এবং ডাটাবেস কাঠামো পরিবর্তন করে আপনার নিজস্ব ডাটাবেস স্কিমা এবং প্রয়োজনীয়তার সাথে এই উদাহরণটিকে মোডিফাই করে নিতে পারেন।

৩. Duplicate Prevention:

in_array ফাংশন ব্যবহার করে, আপনি একটি ডাটাবেস টেবিলে ডুপ্লিকেট মান সন্নিবেশ রোধ করতে পারেন এটি যোগ করার আগে মানটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করতে পারেন।

Scenario: Complete Registration with Duplicate Prevent

একটি ডাটাবেস টেবিলে যেকোন রেজিস্ট্রেশন ফরম এর মান সন্নিবেশ করার সময় username বা email যেন ডুপ্লিকেট না হয় , তা প্রতিরোধের জন্য আমরা ফ্রন্টএন্ড এ একটি রেজিস্ট্রেশন ফরম তৈরি করব এবং ব্যাকএন্ড এর কাজের জন্য পিএইচপি ক্লাস তৈরি করব, ব্যাকএন্ড এর ক্লাসটি আমাদের ডাটাবেস অপারেশনগুলিকে এনক্যাপসুলেট করবে এবং ডাটাবেস টেবিল সন্নিবেশ করার পূর্বে ডুপ্লিকেটগুলি পরীক্ষা করার মেথড প্রদান করবে। চলুন প্রথমে আমরা নিম্নোক্ত SQL দিয়ে একটি টেবিল স্ট্রাকচার তৈরি করি :

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Create DuplicatePrevention.php File

এবার আমরা DuplicatePrevention.php নামে একটি ব্যাকএন্ড ক্লাস ফাইল তৈরি করব। যেখানে , ডাটাবেসের টেবিলে ডুপ্লিকেট ভ্যালু ইনসার্ট কে রোধএবং রেজিষ্ট্রেশন ফর্মের ডেটাগুলো ডেটাবেসে ইনসার্ট এর প্রয়োজনীয় মেথড গুলো থাকবে।

<?php 
class DuplicatePrevention {
    private $db;
    private $table;
    private $column;

    public function __construct($db, $table, $column) {
        $this->db = $db; // A PDO database connection
        $this->table = $table; // Name of the database table
        $this->column = $column; // Name of the column to check for duplicates
    }

    public function isDuplicate($value) {
        $query = $this->db->prepare("SELECT $this->column FROM $this->table");
        $query->execute();
        $existingValues = $query->fetchAll(PDO::FETCH_COLUMN);
        return in_array($value, $existingValues);
    }

    public function Insert($name,$email,$password) {
        $query = $this->db->prepare("INSERT INTO users (name, email, password) VALUES (:name, :email, :password)");
        $query->bindParam(':name', $name);
        $query->bindParam(':email', $email);
        $query->bindParam(':password', $password);

        if ($query->execute()) {
            return true;
        } else {
            return false;
        }
    }
}

এই DuplicatePrevention class এ , isDuplicate method ডাটাবেস টেবিলের নির্দিষ্ট কলাম থেকে সমস্ত মান বের করে এবং মানটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করতে in_array ব্যবহার করে। যদি ইতিমধ্যে ডেটাবেসে এই মানটি থেকে থাকে , তাহলে in_array ফাঙ্কশন true রিটার্ন করে। আর Insert Method এর মাধ্যমে আমরা ডেটাবেসে ডেটাগুলো সন্নিবেশ করি।

Create register_user.php File

এবার আমরা register_user.php নামে আরো একটি ব্যাকএন্ড ফাইল তৈরি করব। যার কাজ হবে , DuplicatePrevention ক্লাসের মাধ্যমে ডাটাবেসের টেবিলে ডুপ্লিকেট ভ্যালু ইনসার্ট কে রোধ করবে এবং রেজিষ্ট্রেশন ফর্মের ডেটাগুলো ডেটাবেসে ইনসার্ট করবে।

<?php
require_once('DuplicatePrevention.php'); // Include the DuplicatePrevention class

// Initialize a PDO database connection (replace with your database credentials)
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];
    
    // Initialize the DuplicatePrevention class
    $duplicatePrevention = new DuplicatePrevention($db, 'users', 'email');

    if ($duplicatePrevention->isDuplicate($email)) {
        $response = ['message' => 'Email already exists', 'status' => 'error'];
    } elseif (strlen($password) < 8) {
        $response = ['message' => 'Password is too short', 'status' => 'error'];
    } else {
        if ($duplicatePrevention->Insert($name,$email,$password)) {
            $response = ['message' => 'Registration successful!', 'status' => 'success'];
        } else {
            $response = ['message' => 'Registration failed', 'status' => 'error'];
        }
    }

    // Return the JSON response
    header('Content-Type: application/json');
    echo json_encode($response);
}
?>


Create register.html File

এবার আমরা ইউজার রেজিস্ট্রেশন করার জন্য রেজিস্ট্রেশন ফর্ম তৈরি করব। নিচের মতো করে register.html ফাইলটি তৈরি করুন :

<!DOCTYPE html>
<html>
<head>
    <title>Registration Form</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 offset-md-3 mt-5">
                <h2 class="text-center">Registration Form</h2>
                <form id="registration-form">
                    <div class="form-group">
                        <label for="name">Name:</label>
                        <input type="text" class="form-control" id="name" name="name" required>
                    </div>
                    <div class="form-group">
                        <label for="email">Email:</label>
                        <input type="email" class="form-control" id="email" name="email" required>
                    </div>
                    <div class="form-group">
                        <label for="password">Password:</label>
                        <input type="password" class="form-control" id="password" name="password" required>
                    </div>
                    <div class="form-group">
                        <label for="repeat-password">Repeat Password:</label>
                        <input type="password" class="form-control" id="repeat-password" name="repeat-password" required>
                    </div>
                    <button type="submit" class="btn btn-primary">Register</button>
                </form>
                <p id="registration-message" class="mt-3"></p>
            </div>
        </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="script.js"></script>
    <script>
        // Your jQuery and AJAX code can be placed here as shown in previous responses.
    </script>
</body>
</html>

এই Bootstrap-based registration form একটি ক্লিন এবং রেস্পন্সিভ ডিজাইন প্রদান করে। আপনি চাইলে আরও স্টাইল করতে পারেন এবং আপনার প্রজেক্টের প্রয়োজনীয়তা অনুযায়ী এটি কাস্টমাইজ করতে পারেন। স্টাইলিং এবং ইন্টারঅ্যাক্টিভিটি সঠিকভাবে কাজ করার জন্য আপনার প্রজেক্টে প্রয়োজনীয় Bootstrap এবং jQuery লাইব্রেরি অন্তর্ভুক্ত করা নিশ্চিত করুন।

Create script.js File

এবার আমরা script.js File টি তৈরি করব। যেখানে আমরা ফর্মটি সাবমিট হওয়ার পূর্বে প্রয়োজনীয় ভ্যালিডেশন এর কাজগুলো করব। এবং ajax এর মাধ্যমে ফর্ম এর ডেটা register_user.php ফাইলে পাঠাবো। এবং সার্ভার থেকে আসা প্রয়োজনীয় ভ্যালিডেশন রেস্পন্স গুলো প্রদর্শন করব।

        $(document).ready(function () {
            $("#registration-form").submit(function (event) {
                event.preventDefault();

                // Get form inputs
                var name = $("#name").val();
                var email = $("#email").val();
                var password = $("#password").val();
                var repeatPassword = $("#repeat-password").val();

                // Check if passwords match and meet complexity requirements
                if (password !== repeatPassword) {
                    $("#registration-message").text("Passwords do not match").addClass("text-danger");
                } else if (password.length < 8) {
                    $("#registration-message").text("Password is too short").addClass("text-danger");
                } else {
                    $.ajax({
                        type: "POST",
                        url: "register_user.php",
                        data: { name: name, email: email, password: password },
                        dataType: "json",
                        success: function (response) {
                            if (response.status === 'error') {
                                $("#registration-message").text(response.message).addClass("text-danger");
                            } else if (response.status === 'success') {
                               // Hide the form
                            $("#registration-form").hide();
                            // Display a waiting message
                            $("#registration-message").text("Registration successful. Redirecting in 5 seconds...").removeClass("text-danger").addClass("text-success");

                            // Delay the redirect by 5 seconds (5000 milliseconds)
                            setTimeout(function() {
                                window.location.href = "success_page.html";
                            }, 5000);

                            }
                        }
                    });
                }
            });
        });
    

এই কোডটি একটি jQuery script যা একটি registration form submission এবং সংশ্লিষ্ট server response পরিচালনা করে। কোডটি কী করে তার একটি সংক্ষিপ্ত বিবরণ এখানে দেওয়া হলো :

  • এটি জাভাস্ক্রিপ্ট কোড কার্যকর করার আগে document টি সম্পূর্ণ লোড এবং প্রস্তুত হওয়ার জন্য অপেক্ষা করে।
  • এটি registration-form ID সহ HTML form সিলেক্ট করে এবং এটিতে একটি submit event handler function সংযুক্ত করে।
  • ইভেন্ট হ্যান্ডলারের ভিতরে:
    • এটি default form submission আচরণকে বাধা দেয়, যা পেজটিকে রিলোড করতে পারে।
    • এটি ফর্ম থেকে name, email, password এবং repeatPassword fields গুলির মান বের করে।
    • এটি এন্টার করা পাসওয়ার্ডগুলি মেলে কিনা এবং পাসওয়ার্ডটি কমপক্ষে ৮ অক্ষর দীর্ঘ কিনা তা পরীক্ষা করে।
    • যদি পাসওয়ার্ডের অমিল থাকে বা দৈর্ঘ্যের প্রয়োজনীয়তা পূরণ না হয়, তাহলে এটি registration-message element এ red (text-danger) টেক্সট সহ একটি error message প্রদর্শন করে।
    • পাসওয়ার্ডগুলি ভ্যালিড হলে, এটি register_user.php সার্ভার স্ক্রিপ্টে একটি AJAX POST রিকোয়েস্ট পাঠায়, ইউজারের ডেটা (name, email এবং password) JSON হিসাবে পাস করে৷
    • এটি একটি status field সহ সার্ভার থেকে একটি JSON response আশা করে যেটি নির্দেশ করে যে registration টি success হয়েছে নাকি একটি error.
    • response status ‘error’ হলে, এটি registration-message element টিতে red কালার একটি error message প্রদর্শন করে।
    • যদি response status ‘success’ হয়, তবে এটি registration form লুকিয়ে রাখে, green (text-success), একটি সাফল্যের বার্তা দেখায় , এবং 5-সেকেন্ড বিলম্বের পরে ইউজারকে একটি success page এ (success_page.html) redirect করার জন্য একটি টাইমার সেট করে।

Create success_page.html File

সর্বশেষ success_page.html তৈরি এবং সেখানে একটি কংগ্রাচুলেশন মেসেজ এর মাধ্যমে কাজটি সম্পর্ন করতে পারেন।

৪. Data Cleaning:

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

Clean Data Before Insert to Database

আপনার সাধারণত একটি ক্লাস থাকবে যা ডেটাবেস সন্নিবেশের আগে ডেটা ক্লিন এবং ফিল্টার করার মেথড থাকবে । এখানে এই ধরনের একটি ক্লাসের একটি সহজ উদাহরণ দেওয়া হলো:

<?php

class DataCleaner
{
    private $excludedValues;
    private $replacementValues;

    public function __construct($excludedValues = [], $replacementValues = [])
    {
        $this->excludedValues = $excludedValues;
        $this->replacementValues = $replacementValues;
    }

    public function cleanData($data)
    {
        // Loop through the data array and apply cleaning rules
        foreach ($data as $key => $value) {
            if (in_array($value, $this->excludedValues)) {
                // Value is in the list of excluded values, so replace it
                $data[$key] = $this->getReplacementValue($value);
            }
        }

        return $data;
    }

    public function insertData($data, $pdo)
    {
        try {
            // Ensure that the required fields are present in the data
            $requiredFields = ['name', 'age', 'city', 'mobile', 'description'];
            foreach ($requiredFields as $field) {
                if (!isset($data[$field])) {
                    throw new Exception("Missing required field: $field");
                }
            }

            // Clean the data
            $cleanedData = $this->cleanData($data);

            // Prepare and execute the SQL statement
            $stmt = $pdo->prepare("INSERT INTO users (name, age, city, mobile, description) 
                                   VALUES (:name, :age, :city, :mobile, :description)");

            $stmt->bindParam(':name', $cleanedData['name']);
            $stmt->bindParam(':age', $cleanedData['age']);
            $stmt->bindParam(':city', $cleanedData['city']);
            $stmt->bindParam(':mobile', $cleanedData['mobile']);
            $stmt->bindParam(':description', $cleanedData['description']);

            $stmt->execute();

            // Output success message
            return "Data successfully cleaned and inserted into the database.";
        } catch (Exception $e) {
            // Handle errors
            return "Error: " . $e->getMessage();
        }
    }

    private function getReplacementValue($value)
    {
        // Check if a replacement value is defined, otherwise, return the original value
        return $this->replacementValues[$value] ?? $value;
    }
}

এবার আমরা এই ক্লাসটি প্রয়োগ করে আমরা ডাটাবেসে ডাটা ইনসার্ট করব

clean_data.php

<?php
include_once 'db.php'; // Replace with your actual database configuration file
include_once 'DataCleaner.php'; // Replace with the actual path to your DataCleaner class file

try {

    // Validate and sanitize input data
    $dataToClean = filter_input(INPUT_POST, 'data', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY);

    // Ensure $dataToClean is not empty and contains valid data
    if (!empty($dataToClean) && is_array($dataToClean)) {
        // Create an instance of DataCleaner
        $excludedValues = ['', 'N/A'];
        $replacementValues = ['' => 'Unknown', 'N/A' => 'Not Applicable'];
        $cleaner = new DataCleaner($excludedValues, $replacementValues);

        // Insert the cleaned data into the database
        $result = $cleaner->insertData($dataToClean, $db);

        // Output the result
        echo $result;
    } else {
        // Invalid or empty input data
        echo "Invalid or empty input data.";
    }
} catch (PDOException $e) {
    // Handle database errors
    echo "Error: " . $e->getMessage();
} finally {
    // Close the database connection
    $pdo = null;
}
?>

সর্বশেষ আমরা একটি register.html নামের একটি ফাইল তৈরি করব। যা দিয়ে ডেটা ইনসার্ট এর কাজ করব।

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Data Cleaner</title>
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>

<div class="container mt-5">
    <h2>Data Cleaner</h2>
    <form id="dataForm">
        <div class="form-group">
            <label for="name">Name:</label>
            <input type="text" class="form-control" id="name" name="name" value="John Doe">
        </div>
        <div class="form-group">
            <label for="age">Age:</label>
            <input type="text" class="form-control" id="age" name="age" value="N/A">
        </div>
        <div class="form-group">
            <label for="city">City:</label>
            <input type="text" class="form-control" id="city" name="city" value="New York">
        </div>
        <div class="form-group">
            <label for="mobile">Mobile:</label>
            <input type="text" class="form-control" id="mobile" name="mobile" value="">
        </div>
        <div class="form-group">
            <label for="description">Description:</label>
            <textarea class="form-control" id="description" name="description"></textarea>
        </div>
        <button type="button" class="btn btn-primary" onclick="cleanData()">Clean and Insert Data</button>
    </form>

    <div class="mt-4">
        <h3>Result:</h3>
        <pre id="result"></pre>
    </div>
</div>

<!-- jQuery and Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>

<script>
    function cleanData() {
        // Get form data
        var formData = $('#dataForm').serializeArray();

        // Convert form data to object
        var dataToClean = {};
        $.each(formData, function (index, field) {
            dataToClean[field.name] = field.value;
        });

        // AJAX request to clean and insert data
        $.ajax({
            type: 'POST',
            url: 'clean_data.php',
            data: {data: dataToClean},
            success: function (response) {
                $('#result').text(response);
            }
        });
    }
</script>

</body>
</html>

Data Cleaner

এই উদাহরণে:

  • DataCleaner class টি ডেটা ক্লিনিং এবং প্রিপ্রসেসিংয়ের জন্য ডিজাইন করা হয়েছে। এটি প্যারামিটার হিসাবে দুটি অ্যারে নেয়: $excludedValues (মানগুলি বাদ দিতে হবে) এবং $replacementValues (বাদ দেওয়া মানগুলিকে প্রতিস্থাপন করতে হবে)।
  • cleanData method একটি প্রদত্ত data array তে ডেটা ক্লিন করার rules প্রয়োগ করে। এটি পরীক্ষা করে যে অ্যারের মানগুলি বাদ দেওয়া মানগুলির সাথে মেলে এবং সংশ্লিষ্ট প্রতিস্থাপন মানগুলির সাথে তাদের প্রতিস্থাপন করে।
  • উদাহরণ ব্যবহার প্রদর্শন করে কিভাবে একটি DataCleaner ইনস্ট্যান্স তৈরি করতে হয় এবং এটি একটি ডেটাসেট ক্লিন করতে, ফিল্টার আউট এবং বাদ দেওয়া মান প্রতিস্থাপন করতে ব্যবহার করে।

Clean Excel File Data Before Insert To Database

আমরা একটি PHP class তৈরি করব যা দিয়ে আমরা একটি Excel file (XLSX) ফাইলকে ক্লিন করতে এবং ডেটাবেজে ইনসার্ট করতে ব্যবহার করা যেতে পারে। এবং একটি Cleaned Excel File কে ডাউনলোড করার সুবিধা দিবে। এখানে আমরা in_array() ব্যবহার করে ডেটা ক্লিন করার rules প্রয়োগ করে যে মানগুলিকে আরও প্রক্রিয়াকরণের আগে বাদ দেওয়া বা সংশোধন করা উচিত তা চিহ্নিত করতে এবং ফিল্টার আউট করতে। এই ক্লাসটি এক্সেল ফাইলের সাথে কাজ করার জন্য আমরা PhpSpreadsheet লাইব্রেরিটি ব্যবহার করব।

এই কোডটি ব্যবহার করার আগে, আপনাকে PhpSpreadsheet লাইব্রেরি ইনস্টল করতে হবে। আপনি কম্পোজার ব্যবহার করে এটি ইনস্টল করতে পারেন:

composer require phpoffice/phpspreadsheet

তবে প্রথমে নিম্নোক্ত SQL রান করার মাধ্যমে একটি ডেটাবেজ টেবিল তৈরি করে নিন :

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` varchar(50) NOT NULL,
  `city` varchar(255) NOT NULL,
  `mobile` varchar(20) DEFAULT NULL,
  `description` text DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

নিম্নে ExcelUploader ক্লাস দেওয়া আছে :

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;

class ExcelUploader
{
    private $conn;
    private $targetDir = "uploads/";

    public function __construct($dbConnection)
    {
        $this->conn = $dbConnection;

        // Ensure the target directory exists
        $this->createTargetDirectory();
    }

    private function createTargetDirectory()
    {
        if (!file_exists($this->targetDir)) {
            mkdir($this->targetDir, 0755, true);
        }
    }

    public function uploadAndInsertData($file)
    {
        $targetFile = $this->targetDir . basename($file["name"]);
        $uploadOk = 1;
        $fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

        // Check if file is a valid Excel or CSV file
        if ($fileType != "xls" && $fileType != "xlsx" && $fileType != "csv") {
            return "Sorry, only Excel and CSV files are allowed.";
        }

        // Validate other aspects such as file size, etc.

        if ($uploadOk == 0) {
            return "Sorry, your file was not uploaded.";
        } else {
            if (move_uploaded_file($file["tmp_name"], $targetFile)) {
                try {
                    // Process the uploaded file and insert data into the database
                    if ($fileType == "csv") {
                        $this->processCsvFile($targetFile);
                    } else {
                        $this->processExcelFile($targetFile);
                    }

                    return "File uploaded successfully and data inserted into the database.";
                } catch (\Exception $e) {
                    return "Error processing the uploaded file: " . $e->getMessage();
                }
            } else {
                return "Sorry, there was an error uploading your file.";
            }
        }
    }

    private function processCsvFile($file)
    {
        $rowNumber = 1;
        if (($handle = fopen($file, "r")) !== false) {
            while (($data = fgetcsv($handle, 1000, ",")) !== false) {
                // Assuming the first row in CSV contains headers
                if ($rowNumber === 1) {
                    $headers = array_map('trim', $data);
                    $rowNumber++;
                    continue;
                }

                // Create a new array with cleaned and replaced values
                $cleanedRow = array_map([$this, 'cleanAndReplace'], $data);

                // Insert data into the database
                $stmt = $this->conn->prepare("INSERT INTO users (" . implode(', ', $headers) . ") VALUES (?, ?, ?, ?, ?)");
                $stmt->execute($cleanedRow);

                $rowNumber++;
            }
            fclose($handle);

            // Save the cleaned CSV file
            $cleanedFileName = uniqid('cleaned_') . '_' . basename($file);
            $cleanedDirectory = 'cleaned/';
            if (!file_exists($cleanedDirectory)) {
                mkdir($cleanedDirectory, 0755, true);
            }

            $cleanedFilePath = $cleanedDirectory . $cleanedFileName;
            $this->saveCleanedCsvFile($cleanedFilePath, $headers);

            // Provide a download link for the cleaned CSV file
            echo '<a href="' . $cleanedFilePath . '" download>Download Cleaned Excel File</a>';
        }
    }

    private function processExcelFile($file)
    {
        $spreadsheet = IOFactory::load($file);
        $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);

        // Assuming the first row in Excel contains headers
        array_shift($sheetData);

        // Create a new Excel workbook and add a worksheet
        $newSpreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
        $newSheet = $newSpreadsheet->getActiveSheet();

        // Assuming the first row in Excel contains headers
        $newSheet->fromArray(array_keys($sheetData[0]), null, 'A1');

        $rowNumber = 2;

        foreach ($sheetData as $row) {
            $name = $this->cleanAndReplace($row['A']);
            $age = $this->cleanAndReplace($row['B']);
            $city = $this->cleanAndReplace($row['C']);
            $mobile = $this->cleanAndReplace($row['D']);
            $description = $this->cleanAndReplace($row['E']);

            // Insert data into the database
            $stmt = $this->conn->prepare("INSERT INTO users (name, age, city, mobile, description) VALUES (:name, :age, :city, :mobile, :description)");
            $stmt->bindParam(':name', $name, PDO::PARAM_STR);
            $stmt->bindParam(':age', $age, PDO::PARAM_STR);
            $stmt->bindParam(':city', $city, PDO::PARAM_STR);
            $stmt->bindParam(':mobile', $mobile, PDO::PARAM_STR);
            $stmt->bindParam(':description', $description, PDO::PARAM_STR);
            $stmt->execute();

            // Add cleaned data to the new Excel file
            $newSheet->fromArray([$name, $age, $city, $mobile, $description], null, 'A' . $rowNumber);

            $rowNumber++;
        }

        // Save the cleaned Excel file
        $cleanedFileName = uniqid('cleaned_') . '_' . basename($file);
        $cleanedDirectory = 'cleaned/';
        if (!file_exists($cleanedDirectory)) {
            mkdir($cleanedDirectory, 0755, true);
        }

        $cleanedFilePath = $cleanedDirectory . $cleanedFileName;
        IOFactory::createWriter($newSpreadsheet, 'Xlsx')->save($cleanedFilePath);

        // Provide a download link for the cleaned Excel file
        echo '<a href="' . $cleanedFilePath . '" download>Download Cleaned Excel File</a>';
    }

    private function saveCleanedCsvFile($filePath, $headers)
    {
        $stmt = $this->conn->query("SELECT * FROM users");
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if (!empty($rows)) {
            $file = fopen($filePath, 'w');
            
            // Write headers
            fputcsv($file, $headers);

            // Write data
            foreach ($rows as $row) {
                $cleanedRow = array_map([$this, 'cleanAndReplace'], $row);
                fputcsv($file, $cleanedRow);
            }

            fclose($file);
        }
    }

    // Function to clean and replace values
    private function cleanAndReplace($value)
    {
        $excludeValues = ['', 'N/A'];
        $replacementValues = ['' => 'Unknown', 'N/A' => 'Not Applicable'];

        // Remove leading and trailing whitespaces
        $value = trim($value);

        // Check if the value is in the exclude list
        if (in_array($value, $excludeValues)) {
            // Replace with the corresponding value from the replacement list
            $value = $replacementValues[$value];
        }

        // Validate input length or type if necessary

        return $value;
    }
}

এবার excelUploader.html নামক HTML ফাইলটি তৈরি করুন:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Excel Upload System</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container mt-5">
    <h2>Excel Upload System</h2>
    <form id="uploadForm" enctype="multipart/form-data">
        <div class="form-group">
            <label for="excelFile">Choose Excel File</label>
            <input type="file" class="form-control-file" id="excelFile" name="excelFile" accept=".xls, .xlsx" required>
        </div>
        <button type="submit" class="btn btn-primary">Upload</button>
    </form>
    <div id="result"></div>
</div>

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="script.js"></script>

</body>
</html>

এবার script.js নামক JavaScript ফাইলটি তৈরি করুন:

$(document).ready(function () {
    $("#uploadForm").submit(function (e) {
        e.preventDefault();

        let formData = new FormData(this);

        $.ajax({
            url: 'upload.php',
            type: 'POST',
            data: formData,
            contentType: false,
            processData: false,
            success: function (response) {
                $("#result").html(response);
            }
        });
    });
});

এবার db.php নামক ফাইলটি তৈরি করুন:

<?php 
$dsn="mysql:host=localhost;dbname=booking";
$username = "root";
$password = "";

try{
    $db = new PDO($dsn, $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    die("Database  connection failed".$e->getMessage());
}

সর্বশেষ upload.php নামক PHP Backend End Point ফাইলটি তৈরি করুন:

<?php
require_once "vendor/autoload.php"; // Include the Composer autoloader
require_once "db.php"; // include your database connection file
require_once 'ExcelUploader.php';

$uploader = new ExcelUploader($db);

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_FILES["excelFile"])) {
        $result = $uploader->uploadAndInsertData($_FILES["excelFile"]);
        echo $result;
    } else {
        echo "Please select a file to upload.";
    }
}
?>

উপরোক্ত উদাহরণটি পরীক্ষা করার জন্য input.xlsx ফাইলটি কে নিম্নোক্ত ডেটা গুলো দিয়ে সাজিয়ে নিতে পারেন।

Name	Age	City	Mobile	Description
Mamnun	10	Dhaka	1755886699	This is Mamnu's Data
Muhibbullah	N/A	Rajshahi		N/A
Mahmud	5	Khulna	455778899	
Maryam	1	N/A	N/A	Cute girl

ক্লিন করার পর আপনি cleaned_output.xlsx নামে একটি ফাইল পাবেন। যা দেখতে অনেকটা এইরকম হবে।

A	B	C	D	E
Mamnun	10	Dhaka	1755886699	This is Mamnu's Data
Muhibbullah	Not Applicable	Rajshahi	Unknown	Not Applicable
Mahmud	5	Khulna	455778899	Unknown
Maryam	1	Not Applicable	Not Applicable	Cute girl

Clean CSV File Data

একটি CSV ফাইল এর ডেটা গুলোকে in_array() ফাঙ্কশন ব্যবহার করে অপ্রাসঙ্গিক ডেটা গুলো ক্লিন করার জন্য আমরা CsvFileCleaner class তৈরি করব। এবং প্রয়োজনীয় rule প্রয়োগ করে একটি CSV ফাইল clean করতে ব্যবহার করা যেতে পারে যা পরবর্তী প্রক্রিয়াকরণের আগে বাদ দেওয়া বা পরিবর্তন করা উচিত এমন মানগুলি সনাক্ত করতে এবং ফিল্টার আউট করতে ব্যবহার করা হবে।

<?php 
class CsvFileCleaner {
    private $excludedValues;
    private $replacementValues;

    public function __construct($excludedValues = [], $replacementValues = []) {
        $this->excludedValues = $excludedValues;
        $this->replacementValues = $replacementValues;
    }

    public function cleanCsvFile($inputFile, $outputFile) {
        if (($handle = fopen( __DIR__.'/'.$inputFile, "r")) !== false) {
            $outputHandle = fopen( __DIR__.'/'.$outputFile, "w");

            while (($data = fgetcsv($handle)) !== false) {
                $cleanedData = $this->cleanCsvRow($data);
                fputcsv($outputHandle, $cleanedData);
            }

            fclose($handle);
            fclose($outputHandle);
        }
    }

    private function cleanCsvRow($data) {
        foreach ($data as $key => $value) {
            if (in_array($value, $this->excludedValues)) {
                $data[$key] = $this->getReplacementValue($value);
            }
        }

        return $data;
    }

    private function getReplacementValue($value) {
        return $this->replacementValues[$value] ?? $value;
    }
}

// Example usage:
$excludedValues = ['N/A', 'Unknown', 'Not Applicable'];
$replacementValues = ['N/A' => '', 'Unknown' => '', 'Not Applicable' => ''];

$cleaner = new CsvFileCleaner($excludedValues, $replacementValues);

$inputFile = 'input.csv'; // Replace with your input CSV file
$outputFile = 'cleaned_output.csv'; // Replace with your output CSV file

$cleaner->cleanCsvFile($inputFile, $outputFile);

এই উদাহরণে:

  • CsvFileCleaner ক্লাস একটি CSV ফাইল প্রসেস করে, প্রতিটি row পড়ে, এবং বর্জন এবং প্রতিস্থাপনের জন্য in_array() ব্যবহার করে defined cleaning rules এর উপর ভিত্তি করে ডেটা ক্লিন করে।
  • cleanCsvFile method ইনপুট CSV ফাইলটি পড়ে, row গুলি প্রক্রিয়া করে এবং আউটপুট CSV ফাইলে clean করা ডেটা লেখে।
  • ক্লাসটি excludedValues এবং ReplacementValues অ্যারে দিয়ে ইনস্ট্যান্টিয়েট করা হয়েছে, যা আপনাকে বাদ দেওয়া মান এবং তাদের সংশ্লিষ্ট replacement মানগুলি নির্দিষ্ট করতে দেয়।
  • আপনি নির্দিষ্ট মানদণ্ডের উপর ভিত্তি করে unwanted বা erroneous (ভ্রান্ত) ডেটা সনাক্ত এবং ফিল্টার করে CSV ফাইলগুলি clean এবং প্রিপ্রসেস করতে এই ক্লাসটি ব্যবহার করতে পারেন।

উপরের কোডটি প্র্যাকটিস করার জন্য, আপনার input.csv ফাইলটি নিম্নরূপ হতে পারে :

Name,Age,City,Comment
John,Unknown,Paris,N/A
Mary,25,Unknown,Ok
Alice,32,London,valid
Bob,Unknown,Unknown,N/A
Kate,30,Barlin,Not Applicable

৫. Tagging and Categorization:

tagging বা categorization এ জড়িত অ্যাপ্লিকেশনগুলিতে, আপনি ডাটাবেস রেকর্ডের সাথে যুক্ত করার আগে ইউজারের দ্বারা নির্ধারিত tag বা category বিদ্যমান কিনা তা যাচাই করতে in_array() ব্যবহার করতে পারেন।

আসুন একটি ই-কমার্স প্ল্যাটফর্মের সাথে জড়িত একটি বাস্তব উদাহরণ বিবেচনা করা যাক যেখানে ইউজাররা তাদের পছন্দের তালিকায় প্রোডাক্ট যুক্ত করতে পারে এবং আরও ভাল অর্গানাইজেশন এর জন্য custom category গুলির সাথে ট্যাগ করতে পারে৷ এই পরিস্থিতিতে, ইউজাররা অভিজ্ঞতা বাড়ানোর জন্য “Tagging এবং Categorization” ধারণাটি অত্যন্ত গুরুত্বপূর্ণ।

Example: E-commerce Wishlist Management System

Scenario:

একটি ই-কমার্স ওয়েবসাইট কল্পনা করুন যা রেজিস্টার্ড ইউজারদের wishlists তৈরি করতে দেয়। ইউজাররা তাদের পছন্দের প্রোডাক্ট গুলিকে তাদের wishlists এ যোগ করতে পারে এবং সহজেই খুঁজে পেতে এবং পরিচালনা করতে এই পণ্যগুলিতে কাস্টম ট্যাগ বা ক্যাটাগরি নির্ধারণ করতে পারে৷

ক্লাস তৈরির পূর্বে প্রথমে নিম্নোক্ত Table Structure এবং Sample Data import করে নিন :

-- Table structure for 'users'
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

-- Sample data for 'users'
INSERT INTO `users` (`username`, `email`) VALUES
('alice123', 'alice@example.com'),
('bob456', 'bob@example.com');

-- Table structure for 'wishlist'
CREATE TABLE `wishlist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `tags` text NOT NULL,
  PRIMARY KEY (`id`)
);

-- Sample data for 'wishlist'
INSERT INTO `wishlist` (`user_id`, `product_id`, `tags`) VALUES
(1, 101, 'Party Wear, Summer Collection'),
(1, 102, 'Casual, Shoes'),
(2, 103, 'Electronics, Gadgets');

-- Table structure for 'tags'
CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

-- Sample data for 'tags'
INSERT INTO `tags` (`name`) VALUES
('Party Wear'),
('Summer Collection'),
('Casual'),
('Shoes'),
('Electronics'),
('Gadgets');

নীচে tagging এবং categorization সহ wishlists পরিচালনার জন্য একটি সম্পূর্ণ পিএইচপি ক্লাস রয়েছে। এই class এ একটি wishlists পণ্য যোগ করার, তাদের ট্যাগ করা এবং একটি MySQL ডাটাবেসে ট্যাগ পরিচালনা করার মেথড অন্তর্ভুক্ত রয়েছে।

<?php 
class WishlistManager {
    private $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function addProductToWishlist($userId, $productId, $tags) {
        // Check if tags exist, create if not
        $this->verifyAndCreateTags($tags);

        // Associate the product with the user's wishlist and tags
        $query = $this->db->prepare("INSERT INTO wishlist (user_id, product_id, tags) VALUES (:userId, :productId, :tags)");
        $query->bindParam(':userId', $userId);
        $query->bindParam(':productId', $productId);
        $query->bindParam(':tags', implode(',', $tags));
        $query->execute();
    }

    public function getWishlistByUser($userId) {
        // Retrieve the user's wishlist
        $query = $this->db->prepare("SELECT * FROM wishlist WHERE user_id = :userId");
        $query->bindParam(':userId', $userId);
        $query->execute();
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }

    private function verifyAndCreateTags($tags) {
        $existingTags = $this->getTags(); // Store the existing tags in a variable

        foreach ($tags as $tag) {
            // Check if the tag exists
            $tagExists = in_array($tag, $existingTags);

            // If the tag doesn't exist, create it
            if (!$tagExists) {
                $query = $this->db->prepare("INSERT INTO tags (name) VALUES (:tag)");
                $query->bindParam(':tag', $tag);
                $query->execute();
            }
        }
    }

    private function getTags() {
        // Retrieve existing tags from the 'tags' table
        $query = $this->db->prepare("SELECT name FROM tags");
        $query->execute();
        $existingTags = $query->fetchAll(PDO::FETCH_COLUMN);
        return $existingTags;
    }
}

// Example usage:
$db = new PDO("mysql:host=localhost;dbname=eshop", "root", "");
$wishlistManager = new WishlistManager($db);

// Adding a product to the wishlist with custom tags
$wishlistManager->addProductToWishlist(1, 101, ["Party Wear", "Summer Collection"]);

// Retrieving a user's wishlist
$wishlist = $wishlistManager->getWishlistByUser(1);

// Displaying the user's wishlist with tags
foreach ($wishlist as $item) {
    echo "Product ID: " . $item['product_id'] . "\n";
    echo "Tags: " . $item['tags'] . "\n";
    echo "--------------------------------------\n";
}
?>

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply