SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)

Blog / SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)

SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল) Detail Page

SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)

SQLite CC++ প্রোগ্রামিং বাংলা টিউটোরিয়াল – সংযোগ, টেবিল তৈরি, ডেটা ম্যানিপুলেশন

SQLite-কে শুধু কমান্ড-লাইন নয়, আপনার নিজের সি বা সি++ প্রোগ্রামের ভিতরেও ব্যবহার করতে পারেন। এটি করার জন্য SQLite একটি সহজ C API সরবরাহ করে, যার মাধ্যমে আপনি ডাটাবেস ফাইল তৈরি, টেবিল তৈরি, ডেটা ইনসার্ট, আপডেট, ডিলিট এবং কোয়েরি করতে পারবেন। এই পর্বে আমরা ধাপে ধাপে শিখব কীভাবে একটি C প্রোগ্রামে SQLite লাইব্রেরি যুক্ত করতে হয়, প্রয়োজনীয় ফাংশনগুলো ব্যবহার করে ডাটাবেস অপারেশন চালাতে হয়, এবং callback ফাংশনের মাধ্যমে SELECT-এর ফলাফল হ্যান্ডেল করতে হয়।


পূর্বপ্রস্তুতি

  • আপনার সিস্টেমে SQLite3 লাইব্রেরি ইন্সটল থাকতে হবে। উবুন্টু/ডেবিয়ানে sudo apt install libsqlite3-dev, ফেডোরায় sudo dnf install sqlite-devel, উইন্ডোজে SQLite ডাউনলোড পেজ থেকে বাইনারি ও হেডার সংগ্রহ করুন।
  • C কম্পাইলার (gcc) বা C++ কম্পাইলার (g++) থাকতে হবে।
  • সাধারণ C প্রোগ্রামিং জ্ঞান (ফাংশন, পয়েন্টার) থাকলে বুঝতে সুবিধা হবে।

ইন্সটল চেক করতে:

bash

gcc --version
sqlite3 --version

১. C/C++ API মূল ফাংশন

SQLite C API-এর তিনটি প্রধান ফাংশন হলো:

  1. sqlite3_open(const char *filename, sqlite3 **ppDb)
    একটি ডাটাবেস ফাইল খোলে (বা তৈরি করে) এবং একটি ডাটাবেস সংযোগ অবজেক্ট রিটার্ন করে। ফাইলের নাম NULL বা ":memory:" দিলে ইন-মেমোরি ডাটাবেস তৈরি হবে, যা শুধুমাত্র সেশন চলাকালে স্থায়ী।
  2. sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *data, char **errmsg)
    এক বা একাধিক SQL স্টেটমেন্ট এক্সিকিউট করার সহজ উপায়। এর মাধ্যমে আমরা CREATE, INSERT, UPDATE, DELETE, SELECT ইত্যাদি চালাতে পারি। SELECT-এর ফলাফল পেতে তৃতীয় আর্গুমেন্টে একটি callback ফাংশন দিতে হয়, যা প্রতিটি রেকর্ডের জন্য ডাকা হবে। শেষ আর্গুমেন্ট error মেসেজ ধরে রাখে।
  3. sqlite3_close(sqlite3*)
    পূর্বে খোলা ডাটাবেস সংযোগ বন্ধ করে। বন্ধ করার আগে সমস্ত প্রস্তুতকৃত স্টেটমেন্ট ফাইনালাইজ করতে হবে, নয়তো SQLITE_BUSY রিটার্ন করবে।

২. ডাটাবেসে সংযোগ

নিচের কোডটি test.db নামে একটি ডাটাবেস খোলে (যদি না থাকে তবে তৈরি করে) এবং সফল হলে মেসেজ দেখিয়ে বন্ধ করে।

c

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;

   rc = sqlite3_open("test.db", &db);

   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

কম্পাইল ও চালান:

bash

gcc test.c -l sqlite3
./a.out

আউটপুট: Opened database successfully

এখন আপনার ডিরেক্টরিতে test.db ফাইল তৈরি হবে। -l sqlite3 ফ্ল্যাগ sqlite3 লাইব্রেরি লিঙ্ক করে। C++ হলে g++ ব্যবহার করুন, কমান্ড একই।


৩. টেবিল তৈরি

একটি callback ফাংশন ডিফাইন করে sqlite3_exec-এর মাধ্যমে CREATE TABLE চালাই।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "CREATE TABLE COMPANY("
         "ID INT PRIMARY KEY     NOT NULL,"
         "NAME           TEXT    NOT NULL,"
         "AGE            INT     NOT NULL,"
         "ADDRESS        CHAR(50),"
         "SALARY         REAL );";

   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

কম্পাইল ও চালালে test.db-তে COMPANY টেবিল তৈরি হবে। callback ফাংশন এখানে শুধু প্রিন্ট করবে (যদি কোনো আউটপুট থাকে), কিন্তু CREATE TABLE কোনো রেকর্ড রিটার্ন করে না, তাই callback ডাকা হবে না।


৪. INSERT অপারেশন

একাধিক INSERT একত্রে চালানো যায়, সেমিকোলন দিয়ে পৃথক করে।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   for(int i=0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 ); "
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

এটি COMPANY টেবিলে চারটি রেকর্ড যোগ করবে।


৫. SELECT অপারেশন ও callback ফাংশন

SELECT স্টেটমেন্টের ফলাফল পেতে callback ফাংশন ব্যবহার বাধ্যতামূলক। SQLite প্রতিটি রেকর্ডের জন্য এই callback কল করে। নিচের উদাহরণে আমরা SELECT * FROM COMPANY চালাই এবং প্রতিটি সারির কলাম ও মান প্রিন্ট করি।

c

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

static int callback(void *data, int argc, char **argv, char **azColName) {
   fprintf(stderr, "%s: ", (const char*)data);
   for(int i=0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";

   rc = sqlite3_open("test.db", &db);
   if( rc ) {
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return(0);
   }

   sql = "SELECT * from COMPANY";
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

আউটপুট:

text

Callback function called: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
...

callback ফাংশনের প্যারামিটার:

  • void *data: user-defined ডাটা, যা sqlite3_exec-এর চতুর্থ আর্গুমেন্ট থেকে আসে।
  • int argc: ওই সারিতে কলাম সংখ্যা।
  • char **argv: কলামগুলোর মান (স্ট্রিং)।
  • char **azColName: কলামগুলোর নাম।

callback ফাংশন 0 রিটার্ন করলে পরবর্তী সারির জন্য আবার ডাকা হয়; অশূন্য রিটার্ন করলে প্রক্রিয়া বন্ধ হয়।


৬. UPDATE ও DELETE অপারেশন

আপডেট ও ডিলিট অপারেশনও sqlite3_exec দিয়েই সম্পন্ন হয়। নিচের উদাহরণে UPDATE এবং সাথে সাথে SELECT দেখানো হয়েছে।

c

// UPDATE
sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; "
      "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

c

// DELETE
sql = "DELETE from COMPANY where ID=2; "
      "SELECT * from COMPANY";
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

একই কাঠামো ব্যবহার করে আপনি জটিল SQL চালাতে পারবেন। error হ্যান্ডেলিং-এ sqlite3_free(zErrMsg) করতে ভুলবেন না, নাহলে মেমরি লিক হতে পারে।


৭. ডিরেক্টরি স্ট্রাকচার ও ফাইল

আপনার প্রজেক্ট ফোল্ডারে নিম্নোক্ত ফাইলগুলো থাকবে:

text

project-folder/
├── test.c        (C সোর্স ফাইল)
├── a.out         (কম্পাইল্ড এক্সিকিউটেবল)
└── test.db       (SQLite ডাটাবেস ফাইল)

প্রয়োজনীয় প্যাকেজ:

  • উবুন্টু/ডেবিয়ান: libsqlite3-dev
  • ফেডোরা: sqlite-devel
  • উইন্ডোজ: SQLite ডাউনলোড থেকে sqlite3.hsqlite3.dllsqlite3.def সংগ্রহ করে MinGW বা Visual Studio প্রজেক্টে সংযুক্ত করুন।

কম্পাইল কমান্ড: gcc -o myapp test.c -lsqlite3


৮. গুরুত্বপূর্ণ টিপস

  • কলব্যাক ছাড়া SELECT: কেবলমাত্র INSERT/UPDATE/DELETE-র জন্য callback NULL দেওয়া যায়; SELECT-র জন্য callback দিতেই হবে। যদি callback না দেন, তবে SELECT-এর ফলাফল পাবেন না, কিন্তু প্রোগ্রাম চলবে।
  • মেমরি ম্যানেজমেন্ট: sqlite3_exec-এ error পেলে zErrMsg কে sqlite3_free() দিয়ে ফ্রি করতে হবে।
  • প্রিপেয়ার্ড স্টেটমেন্ট: প্যারামিটারাইজড কোয়েরির জন্য sqlite3_prepare_v2sqlite3_bind_*sqlite3_step ব্যবহার করতে পারেন, যা SQL Injection প্রতিরোধ করে। আমরা শুধু প্রাথমিক API কভার করেছি।
  • স্ট্রিং কনক্যাটেনেশন: C-তে SQL স্ট্রিং বানাতে "..." ও "..." পাশাপাশি লিখে জোড়া যায় (উপরের উদাহরণের মতো), এটি কম্পাইল টাইমে এক হয়ে যায়।
  • একাধিক কমান্ড: সেমিকোলন দিয়ে একাধিক SQL কমান্ড একসাথে চালানো যায়, যেমন INSERT একাধিক। তবে প্রতিটি স্টেটমেন্টের সাফল্য আলাদা; একটি ব্যর্থ হলে sqlite3_exec থেমে যাবে।
  • রিটার্ন কোড চেক: সবসময় rc != SQLITE_OK চেক করে error হ্যান্ডেল করুন। SQLITE_OK-র মান 0।

৯. সম্পূর্ণ অনুশীলন

উপরের কোডগুলো একটি ফাইলে ক্রমান্বয়ে লিখে পরীক্ষা করে দেখতে পারেন। নিচে একটি পূর্ণাঙ্গ প্রোগ্রামের স্কেলিটন দেওয়া হলো যা টেবিল তৈরি, ডেটা ঢোকানো, সিলেক্ট, আপডেট ও ডিলিট করে:

c

#include <stdio.h>
#include <sqlite3.h>

static int callback(void *data, int argc, char **argv, char **azColName) {
    for (int i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main() {
    sqlite3 *db;
    char *errMsg = 0;
    int rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    // Create table
    const char *sql_create = "CREATE TABLE IF NOT EXISTS COMPANY(...);";
    rc = sqlite3_exec(db, sql_create, NULL, 0, &errMsg);
    // Handle error...

    // Insert
    const char *sql_insert = "INSERT INTO COMPANY ...";
    rc = sqlite3_exec(db, sql_insert, NULL, 0, &errMsg);

    // Select
    const char *sql_select = "SELECT * FROM COMPANY;";
    rc = sqlite3_exec(db, sql_select, callback, 0, &errMsg);

    sqlite3_close(db);
    return 0;
}

পরবর্তী পর্বে

আমরা শিখব SQLite জাভা প্রোগ্রামিং – জাভা প্রোগ্রামে JDBC বা Android-এ SQLite ব্যবহারের পদ্ধতি।

লেখকের কথা: C/C++ দিয়ে SQLite-কে নিজের অ্যাপ্লিকেশনে জুড়ে দেওয়া এখন আর কঠিন নয়। বাংলায় এই টিউটোরিয়াল সিরিজ এগিয়ে নিতে আপনার মূল্যবান মতামত ও শেয়ার আমাদের উৎসাহিত করে। পোস্টটি ভালো লাগলে বন্ধুদের জানাতে ভুলবেন না! সম্পূর্ণ সিরিজের আপডেট পেতে ToLearnTeam.com সাবস্ক্রাইব করুন। কোনো প্রশ্ন থাকলে কমেন্টে জানান – আমরা উত্তর দিতে প্রস্তুত!



SQLite Full Course

  1. SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
  2. SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
  3. SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
  4. SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
  5. SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
  6. SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
  7. SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
  8. SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
  9. SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
  10. SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
  11. SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
  12. SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
  13. SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
  14. SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
  15. SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
  16. SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  17. SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
  18. SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
  19. SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
  20. SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
  21. SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
  22. SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
  23. SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
  24. SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
  25. SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
  26. SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
  27. SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
  28. SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
  29. SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
  30. SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
  31. SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
  32. SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
  33. SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
  34. SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
  35. SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
  36. SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
  37. SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
  38. SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
  39. SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
  40. SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
  41. SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
  42. SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
  43. SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
  44. SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
  45. SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
  46. SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
  47. SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
  48. SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
  49. SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
  50. SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)

Leave a Reply

Welcome to To Learn Team, a dynamic educational platform where knowledge meets collaboration. Designed for students, educators, and lifelong learners, we provide a curated hub of interactive study groups, expert tutorials, and comprehensive resources across diverse subjects. We believe that learning is most powerful when done together. By uniting a global community, we transform curiosity into confidence and individual aspirations into shared achievements. Join the To Learn Team today—elevate your intellect and grow with us!

Get In Touch

Address

Dhaka, Bangladesh

Email

abir43tee@gmail.com

Phone

+880 1711427737

Quick Search