رفتن به مطلب

سورس دیتابیس آنلاین به زبان بیسیک فور اندروید


ارسال‌های توصیه شده

db_online_answer.jpg

این سورس به درد برنامه نویسان b4a میخورد که میخواهند با دیتابیس آنلاین کار کنند و اپلیکیشن های فروشگاهی و برنامه هایی مثل این ها که مربوط به دیتابیس آنلاین است، بنویسند. ( به همراه فایل های PHP )

ویژگی ها:

*چهار عمل اصلی به دیتابیس ( نمایش، ورود، حذف، آپدیت اطلاعات )

*استفاده از کاستوم لیست ویو

*ثبت نام و لاگین به دیتابیس

*توضیح فارسی خط های مهم در برنامه

*جستجوی آنلاین در دیتابیس

*نمایش عکس از دیتابیس آنلاین

+ فایل های PHP

دوستانی که سورس را تهیه میکنن به این نکته توجه کنند که این یک اپلیکیشن فروشگاهی نیست که بعد از دانلود اجرا کنید و صاحب یک فروشگاه شوید، بلکه فقط یک سورس پایه به زبان basic4android برای ساختن برنامه هایی با دیتابیس آنلاین است.

تهیه و تنظیم

مرتضی صباغی

MR.B4A

https://t.me/programmingwithb4a

https://eitaa.com/mortezasabaghi

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ریگانشم میشه این 

 


بخش ۱: ساختار دیتابیس MySQL

ابتدا یک دیتابیس در MySQL (مثلاً با phpMyAdmin) به نام b4a_app_db ایجاد کنید و سپس جدول زیر را در آن بسازید:

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(100) NOT NULL,
 `password` varchar(255) NOT NULL,
 `fullname` varchar(200) NOT NULL,
 `profile_image` varchar(500) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

  • id: کلید اصلی و شمارنده خودکار.

  • username و password: برای احراز هویت (توصیه می‌شود پسوردها در یک پروژه واقعی هش شوند).

  • profile_image: مسیر فایل تصویر پروفایل کاربر که روی سرور آپلود می‌شود.


بخش ۲: فایل‌های PHP (سمت سرور - API)

تمامی فایل‌های PHP را در پوشه‌ای مانند htdocs/b4a_api/ در سرور محلی (مثل XAMPP) یا هاست آنلاین خود قرار دهید -1.

نکته مهم امنیتی: در تمام مثال‌های زیر، برای سادگی، از پسورد به صورت Plain Text استفاده شده است. در پروژه‌های واقعی، حتماً از توابع هش کننده مانند password_hash() و password_verify() در PHP استفاده کنید.

۱. فایل پیکربندی دیتابیس (config.php)
این فایل برای اتصال به دیتابیس در تمام فایل‌های دیگر Require می‌شود.

 
 
<?php
// config.php
$host = 'localhost'; // آدرس سرور
$dbname = 'b4a_app_db'; // نام دیتابیس
$username = 'root'; // نام کاربری دیتابیس
$password = ''; // پسورد دیتابیس (در XAMPP پیش‌فرض خالی است)

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    // تنظیم PDO برای نمایش خطاها
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    // در صورت خطا در اتصال، یک آرایه JSON برگردانید
    echo json_encode(['error' => 'Connection failed: ' . $e->getMessage()]);
    exit;
}
?>

 

۲. فایل ثبت نام (register.php)
این فایل اطلاعات ثبت نام را از B4A دریافت کرده و کاربر جدیدی در دیتابیس ایجاد می‌کند.

<?php
// register.php
require_once 'config.php';
header('Content-Type: application/json');

// دریافت داده‌های ارسال شده توسط B4A (با متد POST)
// برای آپلود تصویر، از $_FILES استفاده می‌کنیم
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? ''; // در پروژه واقعی: هش شود
$fullname = $_POST['fullname'] ?? '';

// بررسی تکراری نبودن نام کاربری
$checkStmt = $pdo->prepare("SELECT id FROM users WHERE username = ?");
$checkStmt->execute([$username]);
if ($checkStmt->fetch()) {
    echo json_encode(['status' => 'error', 'message' => 'Username already exists!']);
    exit;
}

// پردازش آپلود تصویر
$imagePath = null;
if (isset($_FILES['profile_image']) && $_FILES['profile_image']['error'] == 0) {
    $uploadDir = 'uploads/';
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0777, true); // ساخت پوشه اگر وجود نداشت
    }
    $imagePath = $uploadDir . time() . '_' . basename($_FILES['profile_image']['name']);
    move_uploaded_file($_FILES['profile_image']['tmp_name'], $imagePath);
}

// درج اطلاعات در دیتابیس
$insertStmt = $pdo->prepare("INSERT INTO users (username, password, fullname, profile_image) VALUES (?, ?, ?, ?)");
if ($insertStmt->execute([$username, $password, $fullname, $imagePath])) {
    echo json_encode(['status' => 'success', 'message' => 'Registration successful!']);
} else {
    echo json_encode(['status' => 'error', 'message' => 'Registration failed!']);
}
?>

۳. فایل لاگین (login.php)
این فایل نام کاربری و رمز عبور را بررسی کرده و در صورت موفقیت، اطلاعات کاربر را برمی‌گرداند.

 
 
<?php
// login.php
require_once 'config.php';
header('Content-Type: application/json');

$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? ''; // در پروژه واقعی: verify hash

$stmt = $pdo->prepare("SELECT id, username, fullname, profile_image FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    // لاگین موفق
    echo json_encode(['status' => 'success', 'data' => $user]);
} else {
    // لاگین ناموفق
    echo json_encode(['status' => 'error', 'message' => 'Invalid username or password!']);
}
?>

 

۴. فایل نمایش کاربران (get_users.php)
این فایل لیست تمام کاربران (برای نمایش در Custom List View) به همراه لینک تصویرشان را برمی‌گرداند. از این فایل برای جستجو نیز استفاده می‌کنیم.

 
<?php
// get_users.php
require_once 'config.php';
header('Content-Type: application/json');

$search = $_GET['search'] ?? ''; // دریافت عبارت جستجو از B4A

$sql = "SELECT id, username, fullname, profile_image FROM users";
if (!empty($search)) {
    // اگر عبارت جستجو وجود داشت، هیتلر کن
    $sql .= " WHERE username LIKE :search OR fullname LIKE :search";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(['search' => '%' . $search . '%']);
} else {
    // در غیر این صورت همه کاربران را برگردان
    $stmt = $pdo->query($sql);
}

$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($users);
?>

 

۵. فایل حذف کاربر (delete_user.php)
یک کاربر را بر اساس id دریافتی حذف می‌کند.

 
<?php
// delete_user.php
require_once 'config.php';
header('Content-Type: application/json');

$input = json_decode(file_get_contents('php://input'), true);
$userId = $input['id'] ?? 0;

if ($userId) {
    $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
    if ($stmt->execute([$userId])) {
        echo json_encode(['status' => 'success', 'message' => 'User deleted successfully!']);
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Delete failed!']);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'Invalid user ID!']);
}
?>

 

۶. فایل به‌روزرسانی کاربر (update_user.php)
اطلاعات یک کاربر موجود را ویرایش می‌کند.

 
<?php
// update_user.php
require_once 'config.php';
header('Content-Type: application/json');

$userId = $_POST['id'] ?? 0;
$fullname = $_POST['fullname'] ?? '';

if ($userId && $fullname) {
    // بررسی آپلود تصویر جدید
    $imageSql = '';
    $params = [':fullname' => $fullname, ':id' => $userId];

    if (isset($_FILES['profile_image']) && $_FILES['profile_image']['error'] == 0) {
        $uploadDir = 'uploads/';
        $imagePath = $uploadDir . time() . '_' . basename($_FILES['profile_image']['name']);
        move_uploaded_file($_FILES['profile_image']['tmp_name'], $imagePath);
        $imageSql = ", profile_image = :profile_image";
        $params[':profile_image'] = $imagePath;
    }

    $sql = "UPDATE users SET fullname = :fullname $imageSql WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    if ($stmt->execute($params)) {
        echo json_encode(['status' => 'success', 'message' => 'User updated successfully!']);
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Update failed!']);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'Invalid data!']);
}
?>

 


بخش ۳: برنامه B4A

در این بخش، کدهای سمت B4A را توضیح می‌دهیم.

۱. تنظیمات Manifest
برای دسترسی به اینترنت، خط زیر را به فایل Manifest.txt اضافه کنید -1:

text
Copy
 
Download
 
CreateResourceFromFile(Macro, Core.Network)

۲. طراحی Layoutها
شما به چند Layout نیاز دارید:

  • layout_login: شامل دو EditText برای نام کاربری و رمز عبور، و یک دکمه "ورود". همچنین یک دکمه "ثبت نام" برای انتقال به صفحه ثبت نام.

  • layout_register: شامل EditText برای نام کاربری، رمز عبور، نام کامل، یک دکمه برای انتخاب تصویر و یک دکمه "ثبت نام".

  • layout_main: شامل یک EditText برای جستجو (با قابلیت جستجوی آنلاین)، یک دکمه "خروج" و یک Custom List View (از مسیر: Basic4android -> Views -> CustomListView) برای نمایش لیست کاربران.

۳. کد نویسی B4A

 
' Activity اصلی برای مدیریت کاربران
Sub Process_Globals
    ' در اینجا متغیرهایی که بین تمام Activityها مشترک هستند تعریف می‌شوند
    Public httpJob As HttpJob
    Public UserId As Int ' برای نگهداری ID کاربر لاگین کرده (در این مثال ساده)
End Sub

Sub Globals
    ' متغیرهای مربوط به Activity اصلی (Main)
    Private CLV As CustomListView
    Private SearchBox As EditText
    Private BtnLogout As Button
    Private PanelNoData As Panel
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("layout_main")
    httpJob.Initialize("HttpJob", Me)

    ' --- توضیح: تنظیم جستجو با تایپ کاربر ---
    SearchBox.AddTextChangedListener(New TextWatcher)
    ' --- بارگذاری اولیه لیست کاربران ---
    LoadAllUsers("")
End Sub

Sub Activity_Resume
    ' هر بار که Activity نمایان می‌شود، لیست را تازه کن (مثلاً بعد از ثبت نام)
    LoadAllUsers("")
End Sub

' --- توضیح: تابع جستجوی آنلاین ---
Sub SearchBox_TextChanged (Old As String, New As String)
    If New.Length > 2 Or New.Length = 0 Then ' اگر بیش از 2 حرف تایپ شد یا خالی بود، جستجو کن
        LoadAllUsers(New)
    End If
End Sub

' --- توضیح: دریافت لیست کاربران از سرور (با قابلیت جستجو) ---
Sub LoadAllUsers(SearchTerm As String)
    ' نمایش یک ProgressBar یا پیام لودینگ
    PanelNoData.Visible = False
    CLV.Clear

    Dim URL As String = "http://your-server-address/b4a_api/get_users.php?search=" & SearchTerm
    httpJob.Download(URL) ' درخواست GET به سرور
    httpJob.Tag = "get_users"
End Sub

' --- توضیح: رویداد موفقیت یا شکست Job ---
Sub JobDone (Job As HttpJob)
    If Job.Success Then
        Select Job.Tag
            Case "get_users"
                ' پردازش لیست کاربران دریافت شده
                Dim parser As JSONParser
                parser.Initialize(Job.GetString)
                Dim users As List = parser.NextArray ' دریافت آرایه JSON
                
                If users.Size > 0 Then
                    For i = 0 To users.Size - 1
                        Dim map As Map = users.Get(i)
                        Dim id As Int = map.Get("id")
                        Dim username As String = map.Get("username")
                        Dim fullname As String = map.Get("fullname")
                        Dim imageUrl As String = map.Get("profile_image")
                        
                        ' --- توضیح: پر کردن Custom List View ---
                        CLV.Add(CreateListItem(username, fullname, imageUrl), 70dip, id)
                    Next
                Else
                    PanelNoData.Visible = True ' نمایش پیغام "کاربری یافت نشد"
                End If
                
            Case "delete_user"
                ' پردازش نتیجه حذف
                Dim res As String = Job.GetString
                Log("Delete Result: " & res)
                LoadAllUsers("") ' پس از حذف، لیست را تازه کن
                
            Case "register", "update"
                ' پردازش نتیجه ثبت نام یا ویرایش
                ' ...
        End Select
    Else
        ' خطا در ارتباط با سرور
        ToastMessageShow("خطا در ارتباط با سرور: " & Job.ErrorMessage, True)
    End If
    Job.Release
End Sub

' --- توضیح: تابع کمکی برای ساخت آیتم لیست ---
Sub CreateListItem(UserName As String, FullName As String, ImageUrl As String) As Panel
    Dim p As Panel
    p.Initialize("")
    p.LoadLayout("layout_list_item") ' یک Layout ساده شامل ImageView و دو Label
    
    ' مقداردهی Viewها
    Dim lblUser As Label = p.GetView(0) ' فرض می‌کنیم اولین View، Label نام کاربری است
    Dim lblName As Label = p.GetView(1) ' دومین View، Label نام کامل
    Dim imgView As ImageView = p.GetView(2) ' سومین View، ImageView
    
    lblUser.Text = UserName
    lblName.Text = FullName
    
    ' --- توضیح: نمایش عکس از دیتابیس آنلاین ---
    If ImageUrl <> "" And ImageUrl <> "null" Then
        ' دانلود تصویر (می‌توان از کتابخانه‌های کش مانند Picasso یا DiskCache استفاده کرد)
        Dim imgJob As HttpJob
        imgJob.Initialize("imgJob", Me)
        imgJob.Download("http://your-server-address/b4a_api/" & ImageUrl)
        imgJob.Tag = imgView ' آدرس ImageView را در Tag Job ذخیره می‌کنیم
    Else
        imgView.Bitmap = LoadBitmap(File.DirAssets, "default_user.png") ' تصویر پیش‌فرض
    End If
    
    Return p
End Sub

' --- توضیح: دریافت تصویر و قرار دادن آن در ImageView مربوطه ---
Sub JobDone_Image(Job As HttpJob)
    If Job.Success Then
        Dim imgView As ImageView = Job.Tag
        imgView.SetBitmap(Job.GetBitmap) ' تصویر دانلود شده را نمایش بده
    Else
        Log("خطا در دانلود تصویر: " & Job.ErrorMessage)
    End If
    Job.Release
End Sub

' --- توضیح: رویداد کلیک روی آیتم‌های لیست (برای ویرایش یا حذف) ---
Sub CLV_ItemClick (Index As Int, Value As Object)
    Dim UserId As Int = Value ' مقدار UserId که در Add ذخیره کردیم
    ' نمایش یک Dialog با گزینه‌های ویرایش و حذف
    ' برای حذف:
    ' SendDeleteRequest(UserId)
    ' برای ویرایش، کاربر را به Activity ویرایش منتقل کنید
    ' StartActivity(EditProfile) و UserId را به آن پاس دهید
End Sub

' --- توضیح: درخواست حذف کاربر به سرور ---
Sub SendDeleteRequest(UserId As Int)
    Dim j As HttpJob
    j.Initialize("HttpJob", Me)
    j.Tag = "delete_user"
    ' ارسال درخواست POST با JSON
    j.PostString("http://your-server-address/b4a_api/delete_user.php", CreateJsonDelete(UserId))
    j.GetRequest.SetContentType("application/json")
End Sub

' تابع کمکی برای ساخت JSON حذف
Sub CreateJsonDelete(UserId As Int) As String
    Dim m As Map
    m.Initialize
    m.Put("id", UserId)
    Dim jg As JSONGenerator
    jg.Initialize(m)
    Return jg.ToString
End Sub

 

۴. توضیحات خطوط مهم برنامه B4A:

  • httpJob.Initialize("HttpJob", Me): شیء HttpJob را برای ارتباط با سرور راه‌اندازی می‌کند -1.

  • SearchBox.AddTextChangedListener(...): یک Listener به جعبه متن جستجو اضافه می‌کند تا با هر بار تایپ کاربر، تابع SearchBox_TextChanged فراخوانی شود و درخواست جستجو به سرور ارسال گردد.

  • CLV.Add(...): در این خط، یک آیتم جدید به Custom List View اضافه می‌شود. تابع CreateListItem یک Panel شامل طرح آیتم را برمی‌گرداند. ارتفاع 70dip و Value که در اینجا id کاربر است، در رویداد کلیک قابل دسترسی خواهد بود.

  • LoadBitmap(File.DirAssets, "default_user.png"): اگر کاربر تصویری نداشته باشد، یک تصویر پیش‌فرض از پوشه Files برنامه بارگذاری می‌کند.

  • Sub CLV_ItemClick (Index As Int, Value As Object): این رویداد زمانی رخ می‌دهد که کاربر روی یکی از آیتم‌های لیست کلیک کند. پارامتر Value همان مقداری است که هنگام فراخوانی CLV.Add به عنوان آرگومان سوم پاس داده شده بود (در اینجا id کاربر).


جمع‌بندی و نکات تکمیلی

  • امنیت: در مثال‌های PHP، رمز عبور به صورت متن ساده ذخیره و ارسال می‌شود. این کار بسیار خطرناک است. حتماً از کتابخانه BCrypt در B4A برای هش کردن رمز قبل از ارسال و از password_hash() و password_verify() در PHP استفاده کنید -3.

  • تصاویر: در این مثال، تصاویر به صورت جداگانه و با یک HttpJob دیگر دانلود می‌شوند. برای کارایی بهتر و کاهش مصرف پهنای باند، استفاده از کتابخانه‌های کش مانند DiskCache یا Picasso برای B4A توصیه می‌شود.

  • سشن و Token: برای لاگین ماندن کاربر و افزایش امنیت، پس از لاگین موفق، سرور می‌تواند یک Token (مانند JWT) تولید کرده و به برنامه برگرداند. سپس برنامه این Token را در تمام درخواست‌های بعدی (مثلاً در Header) ارسال کند -3.

  • ویرایش اطلاعات: می‌توانید یک Activity جدید بسازید و پس از کلیک روی گزینه ویرایش در Custom List View، UserId را به آن Activity ارسال کنید تا اطلاعات کاربر از سرور دریافت و در فرم ویرایش نمایش داده شود.

  • نکات PHP: در فایل‌های PHP، به جای mysql_* (که منسوخ شده) از PDO استفاده شده است که امنیت و انعطاف بیشتری دارد -3.

این ساختار، یک پایه محکم برای پروژه‌های آینده شما فراهم می‌کند و می‌توانید به راحتی ماژول‌های دیگر را به آن اضافه کنید. موفق باشید!

 
لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...