نمونه مثال کار با دیتابیس با استفاده از پلاگین SQLite1.2

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
سلام به همه دوستان یه نمونه مثال کاربردی برای کار با دیتابیس ساختم که قابلیت های زیر رو داره :

- ثبت ، ویرایش ، حذف اطلاعات
- ثبت تصویر در خود دیتابیس
- ثبت فایل کنار دیتابیس
- جستجو براساس فیلد ها و بر اساس بین دو تاریخ
- مشاهده اطلاعات کل
- مشاهده اطلاعت به صورت صفحه بندی شده
- پرینت اطلاعات
- مشاهده اطلاعات قبل از پرینت ( PrintPreview )

پلاگین های استفاده شده :

- SQLite 1.2 ( رایگان نیست و 10 هزارتومن مبلغش هست ) نسخه 1.1 رایگان بوده و میتونید به جای نسخه 1.2 تو این نمونه مثال هم استفاده کنید.
- پلاگین UOListView
- Misc

نمونه مثال بعدی :

ایجاد حساب کاربری و مدیریت ان ( میتونید چندین حساب کاربری ایجاد کنید تا کاربرای مختلف از برنامه با سطح دسترسی استفاده کنند )

دلیل اینکه به صورت فیلم آموزشی کار نکردم این بود که ممکنه استقبال کم باشه و منم نرسم اوکی کنم و نشه ادامه داد ولی به این صورت باشه میتونم نمونه هایی رو درست کنم و برای دوستان معرفی کنم

درضمن سعی میکنم کار با بخش های مختلف دیتابیس رو براتون نمونه درست کنم که خیلی مفید و خوب هست و کمتر کسی تا حالا باهاشون کار کرده

لینک دانلود :

دانلود نمونه

تصاویر :

SampleSQLite.jpg


PrintPreview.jpg


در صورتی که قسمت پرینت قابل مشاهده نبود و نوشته ها ناخونا بود این کار ها رو انجام بدید تا مشکل حل بشه

از داخل اسکریپت ScriptPrint کد زیر رو فعال کنید
کد:
RunMBD("<SrcDir>\UTF8.dll","NEW_WINDOW")
بعد فایل زیر رو دانلود و به جای فایل قبلی امبدد کنید
txt.gif
PrintCode.txt (853
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
ایجاد حساب کاربری و مدیریت آن ( ایجاد سطح دسترسی به برنامه )

تو این نمونه مثال ایجاد حساب کاربری و مدیریت آن و دادن سطح دسترسی به کاربران رو آموزش دادم که دارای قابلیت های زیر هست :

- قابلیت ایجاد حساب کاربری ، حذف و ویرایش
- قابلیت جستجو
- قابلیت تعیین سطح دسترسی
- قابلیت ثبت اطلاعات به صورت کد شده ( MD5 )
- قابلیت ورود به سیستم و مشاهده سطح دسترسی

پسورد و نام کاربری ورود به نمونه : admin

پلاگین های استفاده شده :

- SQLite 1.2 ( رایگان نیست و 10 هزارتومن مبلغش هست ) نسخه 1.1 رایگان بوده و میتونید به جای نسخه 1.2 تو این نمونه مثال هم استفاده کنید.
- پلاگین UOListView
- MMBMisc

لینک دانلود :

دانلود نمونه

تصاویر :

1AC.jpg


2AC.jpg


3AC.jpg
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
جستجو به صورت لیست کشویی DropDown

تو این نمونه مثال کار با جستجو به صورت لیست کشویی رو قرار دادم که خیلی از این نمونه جستجو تو پروژه های مختلف میشه استفاده کرد و کار جستجو رو برای کاربران راحت کرد تا پروژه حرفه ای تر جلوه بده. که دارای قابلیت های زیر هست :
- جستجو به صورت لیست کشویی
- قابلیت تشخیص گزینه های تکراری در جستجو ( مثلا ممکنه شما نام خانوادگی "حسینی" رو سرچ کنید و از این نام خانوادگی 2 مورد براتون نشون بده که شما بر روی هر کدوم کلیک کنید اطلاعات مربوط به اون رو میاره ولی اگه در حالت عادی جستجو بشه و دو گزینه بیاره روی هر کدوم کلیک کنید اطلاعات مربوط به اخرین نام خانوادگی رو میاره اگه با نمونه کار کنید دقیق متوجه منطورم خواهید شد )

- و ...

پلاگین های استفاده شده :

- SQLite 1.2 ( رایگان نیست و 10 هزارتومن مبلغش هست ) نسخه 1.1 رایگان بوده و میتونید به جای نسخه 1.2 تو این نمونه مثال هم استفاده کنید.

لینک دانلود :

دانلود نمونه

تصاویر :

Search.jpg
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
از اونجایی که دیدم هیچ استقبالی نشد و حتی تعداد بازدید ها هم کم بود و یک نفر هم بهم پیامی نداد تصمیم گرفتم به صورت رایگان این کار رو دنبال کنم. یاد حرف یکی از دوستای خوبم تو انجمن افتادم که میگفت جامعه بیلدر ...... نه بیخیال نمیخواد ، لازم نیست بگم.

فقط دوستانی که دانلود و از این نمونه ها استفاده میکنن میتونن با ارسال شارژ ایرانسل من رو حمایت کنن. با تشکر

درضمن دوستانی هم که نیاز به خرید پلاگین SQLite 1.2 دارن مبلغش 10 هزارتومن هست و اگه نتونستن به سازنده پلاگین دسترسی داشته باشن و خریداری کنن میتونن به من خبر بدن تا براشون ارسال کنم و هزینشو بدم به سازندش ممنون.

درضمن یادم رفت بگم دوستان تو این تاپیک هیچ پست نا مربوطی رو ارسال نکنن.
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
استفاده از توابع SetDelimiter - DBSize - MD5Data

تو این نمونه مثالی که براتون اماده کردم نحوه کار با 3 تا از توابع کاربردی پلاگین SQLite رو اموزش دادم که خیلی کاربردی میتونن باشن و تو پروژه هاتون میتونین ازشون استفاده کنید.

- تابع به دست اوردن حجم دیتابیسDBSize
- تابع کد کردن اطلاعات به صورت Encode64Data , Decode64Data , MD5 , SH1Data

- تایع Delimiter برای جداسازی رکورد ها و فیلد ها از هم دیگر

توضیحات مختصر در مورد توابع :

با استفاده از تابع اول DBSize میتونید حجم دیتابیس رو بدست بیارید. مثلا ممکنه تو بعضی پروژه هاتون نخوایید دیتابیس از حجم مورد نظر شما بیشتر باشه پس میتونید از این تابع برای شرط گذاشتن و اخطار به کاربر استفاده کنید.

در مورد توابع کد کردن اطلاعات تو اسکریپت ScriptEncodeData به هر 4 روش کدش رو نوشتم فقط MD5 رو فعال گذاشتم.

با استفاده از تابع MD5 و SH1Data میتونید تو پروژه هایی که نیاز به کد کردن اطلاعات دارید استفاده کنید فقط یادتون باشه که بعد از کد کردن قابلیت بازگشت نخواهد بود. بهتره از این روش برای پروژه های ایجاد حساب کاربری استفاده کنید همونطور که قبلا اموزشش رو دادم. برای ذخیره پسورد ها. البته با یه جستجو ساده تو گوگل میتونید کلی اطلاعات در مورد MD5 و SH1Data بدست بیارید که میتونه اطلاعاتتون رو بالاتر ببره.
و با استفاده از توابع Encode64Data , Decode64Data میتونید اطلاعات رو کد کرده و دوباره از این حالت خارج کنید.

با استفاده از تابع Delimiter میتونید تعیین کنید که رکورد ها و فیلد هاش بر اساس کدوم کاراکتر از هم تفکیک بش به صورت پیش فرض اگه استفاده نکنید برای رکورد ها # و برای فیلد ها از | استفاده میشه. ولی اگه از تابع استفاده کنید میتونید خودتون تعیین کنید چه کاراکتر هایی به جای این دو تا باشه.

پلاگین های استفاده شده :

- SQLite 1.2 ( رایگان نیست و 10 هزارتومن مبلغش هست ) نسخه 1.1 رایگان بوده و میتونید به جای نسخه 1.2 تو این نمونه مثال هم استفاده کنید.

لینک دانلود :

دانلود نمونه

تصاویر :

SQLite1.2.jpg
 

محمدمهدی

Well-Known Member
اصلاح یک باگ در نمونه مثال ایجاد حساب کاربری + یک نکته

تو این نمونه مثال ایجاد حساب کاربری و مدیریت آن و دادن سطح دسترسی به کاربران رو آموزش دادم که دارای قابلیت های زیر هست :

- قابلیت ایجاد حساب کاربری ، حذف و ویرایش
- قابلیت جستجو
- قابلیت تعیین سطح دسترسی
- قابلیت ثبت اطلاعات به صورت کد شده ( MD5 )
- قابلیت ورود به سیستم و مشاهده سطح دسترسی

پلاگین های استفاده شده :

- SQLite 1.2 ( رایگان نیست و 10 هزارتومن مبلغش هست ) نسخه 1.1 رایگان بوده و میتونید به جای نسخه 1.2 تو این نمونه مثال هم استفاده کنید.
- پلاگین UOListView
- MMBMisc

لینک دانلود :

دانلود نمونه

تصاویر :

1AC.jpg


2AC.jpg


3AC.jpg



سلام.
ضمن تشکر از جناب حسینی بخاطر گذاشتن این نمونه مثال های بسیار کاربردی و مفید، اجازه می خوام که در مورد یک باگ تقریبا تاثیر گذار که در نمونه ی حساب کاربری مشاهده کردم، (بدون تغییر اصل نمونه) یه توضیحی اینجا برای دوستان عرض کنم.

به صورت خلاصه برای اصلاح باگ، شما باید بعد از دانلود مثال از سایت آقای حسینی و بازکردن پروژه، در صفحه ی اول (ورود به صفحه ی اصلی) اسکریپت SearchUser رو پیدا کنید و به جای کد های موجود، کد زیر رو داخل اون کپی کنید :

کد:
[B]
** Here we need "=" instead of "Like" because the username should be exactly what we want.
SQLSearch_Query$='SELECT User,UG FROM Acount WHERE User = \''+UserNameBox$+'\';'

[/B]
PluginSet("PlugInSQL","SQLSearch_Query$")
PluginRun("PlugInSQL","Query")
PluginGet("PlugInSQL","ResultUser$")
PluginGet("PlugInSQL","RowsUser")
If (RowsUser>0) Then
  For i=1 To RowsUser
    recordUser$[i]=GetArrayItem(ResultUser$,'#',i)
    recordUser$[i]=recordUser$[i]+'|'
    For j=1 To 2
      fieldUser$[j]=GetArrayItem(recordUser$[i],'|',j)
    Next j
  Next i
Else
  text$='نام کابري وارد شده اشتباه ميباشد'
  flag=48+0+0+0+0
  param$=text$+','+CHAR(flag)
  empty$=''
  LoadText("EditBox-UserName","empty$")
End
If (RowsUser>0) Then
  PluginSet("PlugInSQL","PasswordBox$")
  PluginRun("PlugInSQL","MD5Data")
  PluginGet("PlugInSQL","EncryptPass$")

[B]
** Here we need SELECT "User" instead of SELECT "Password" because the password should be exactly same for the user.
  SQLSearch_Query$='SELECT User FROM Acount WHERE Password = \''+EncryptPass$+'\';'

[/B]
  PluginSet("PlugInSQL","SQLSearch_Query$")
  PluginRun("PlugInSQL","Query")
  PluginGet("PlugInSQL","Result1User$")
  PluginGet("PlugInSQL","Rows1User")
[B]

** And here we should add more compare for sure is the password for the user?
  t$=UserNameBox$+'#'
  If (Rows1User>0 & Result1User$=t$) Then
[/B]

    For i=1 To Rows1User
      record1User$[i]=GetArrayItem(Result1User$,'#',i)
      record1User$[i]=record1User$[i]+'|'
      For j=1 To 1
        field1User$[j]=GetArrayItem(record1User$[i],'|',j)
      Next j
    Next i
    RunScript("Dastreci")
    Page("Home")
  Else
    text$='پسورد وارد شده اشتباه ميباشد'
    flag=48+0+0+0+0
    param$=text$+','+CHAR(flag)
    MessageEx("پيغام","param$")
    empty$=''
    LoadText("EditBox-Password","empty$")
  End
End

[B]** Thanks from Mr.Hoseini and god bless you all.[/B]


* کد های برجسته ای که کامنت گذاری شده اند تغییر کرده است.

در این کد جدید 3 جا اصلاح شده که عرض می کنم :
1. بهتر هست (یا باید بگم لازم هست) که برای کار های امنیتی به جای عبارت «Like» در دستور SQL ی که استفاده شده از عبارت «=»(مساوی) استفاده بشه که نام های مشابه رو Select نکنیم.
2. با کد قبلی، اگر 2 پسورد یکسان داشته باشیم و هر نام کاربری وارد کنیم برنامه قبولش می کنه و این درست نیست. اشتباه اونجایی بوده که باید پسورد با یوزر تطابق پیدا میکرده نه اینکه فقط وجودش بررسی بشه.
3. حالا باید شرط ورودمون رو 2 چیز مرکب قرار بدیم که میشه همون کامنت سوم.

- فقط یک نکته هم باید رعایت بشه که در موقع ایجاد حساب کابری باید نگذارید که حسابی با نام دقیقا مشابه با سایر حساب ها ایجاد بشه که برنامه دچار اشکال میشه و برای این قضیه یا باید ستون مربوط به نام کاربری رو uniqe در نظر بگیرید و یا خودتون در ام ام بی برای نبودش جستجو کنید.

* نکته ی آخر اینکه آقا محمود نگفتن که همون اول با چه یوزر و پسوردی وارد نرم افزار بشید. که عرض می کنم:
اگر sqlite browser ندارید می تونید همون اول کار فقط صفحه ی 3 ی مثال رو اجرا کنید و یوزر های موجود رو پسوردشون رو تغییر بدید و همچنین اون HotSopt رو حذف کنید تا بتونید یه حساب جدید هم بسازید.

ما که خودمون مثل ایشون مثال خوب نساختیم، حداقلشه که توی بررسی و توسعه ی این مثال ها، کاری که از دستمون بر میاد انجام بدیم.
موفق باشید.
 
آخرین ویرایش:

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
1. بهتر هست (یا باید بگم لازم هست) که برای کار های امنیتی به جای عبارت «Like» در دستور SQL ی که استفاده شده از عبارت «=»(مساوی) استفاده بشه که نام های مشابه رو Select نکنیم.
2. با کد قبلی، اگر 2 پسورد یکسان داشته باشیم و هر نام کاربری وارد کنیم برنامه قبولش می کنه و این درست نیست. اشتباه اونجایی بوده که باید پسورد با یوزر تطابق پیدا میکرده نه اینکه فقط وجودش بررسی بشه.
3. حالا باید شرط ورودمون رو 2 چیز مرکب قرار بدیم که میشه همون کامنت سوم.
مرسی محمد جان که حداقل تو یکی اومدی بعد این همه مدت بعد دانلود یه تستی کردی و ایرادات رو گفتی منم انقد عجله ای درست میکنم و کوئری ها رو هم چون قبلا تو نمون های قبلی نوشتم کپی میکنم و فقط امشون رو تغییر میدم واسه این تست نمیکنم مشکل پیش میاد . در کل حل کردم ایرادات رو و پیوست مجدد کردم تو سایتم با تغییرات جدید

فقط مهدی جان متوجه نشدن چرا این کد رو نوشتی
کد:
[B]  t$=UserNameBox$+'#'
  If (Rows1User>0 & Result1User$=t$) Then[/B]

فقط یک نکته هم باید رعایت بشه که در موقع ایجاد حساب کابری باید نگذارید که حسابی با نام دقیقا مشابه با سایر حساب ها ایجاد بشه که برنامه دچار اشکال میشه و برای این قضیه یا باید ستون مربوط به نام کاربری رو uniqe در نظر بگیرید و یا خودتون در ام ام بی برای نبودش جستجو کنید.
این مورد تو نمونه مثال هست

کد:
همچنین اون  HotSopt رو حذف کنید تا بتونید یه حساب جدید هم بسازید.
من یادم رفته بود اون رو Hide کنم این رو برای این گذاشتم تا وقتی روی نام کاربری admin کلیک شد نشه این رو تغییر داد یجور به عنوان پسورد مادر در نظر گرفتمش

در کل مرسی چاکریم
 

محمدمهدی

Well-Known Member
خواهش می کنم. لطف داری.

فقط مهدی جان متوجه نشدن چرا این کد رو نوشتی
کد:
[B]  t$=UserNameBox$+'#'
  If (Rows1User>0 & Result1User$=t$) Then[/B]
ببینید الان کد SQL قبلی ما به ما نتیجه ی وجود یه پسورد رو به همراه اسم یوزرش میده. اما آیا معلوم هست که این یوزر همون یوزری هست که کاربر اون رو در Field یوزر وارد کرده؟
در اینجا این هم بررسی میشه که اگر این پسورد برای این یوزر نبود داخل نریم و اون خط قبلیش صرفا برای اینه که Result پلاگین همراه با Separator اون هست و من خواستم خیلی خلاصه جواب بگیرم.

این مورد تو نمونه مثال هست
بله ولی فقط در حالت ایجاد هست و وقتی نام رو ویرایش کنیم دوباره پیش میاد و متوجه میشیم که اصلا Table به صورت Unique برای اون ستون طراحی نشده که در نهایت از طرف دیتابیس نذاره که این اتفاق بیافته.
ببینید شکلش به این صورت میشه :
HowUnique.png
تصویر : SqLiteBrowser

من یادم رفته بود اون رو Hide کنم این رو برای این گذاشتم تا وقتی روی نام کاربری admin کلیک شد نشه این رو تغییر داد یجور به عنوان پسورد مادر در نظر گرفتمش
بله، ولی خب جلوی زدن Tab رو که نمیگیره؟ مثلا شاید بهتر بود تبدیل به متن ساده میشد. البته در جایگاه یه مثال بسیار هم خوب هست.
 
آخرین ویرایش:
  • Like
Reactions: 9up

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
در اینجا این هم بررسی میشه که اگر این پسورد برای این یوزر نبود داخل نریم و اون خط قبلیش صرفا برای اینه که Result پلاگین همراه با Separator اون هست و من خواستم خیلی خلاصه جواب بگیرم.
میشد از کوئری هم استفاده کرد من همین کار رو کردم
کد:
SQLSearch_Query$='SELECT Password FROM Acount WHERE Password = \''+EncryptPass$+'\' AND User = \''+fieldUser$[1]+'\';'
بله ولی فقط در حالت ایجاد هست و وقتی نام رو ویرایش کنیم دوباره پیش میاد و متوجه میشیم که اصلا Table به صورت Unique برای اون ستون طراحی نشده که در نهایت از طرف دیتابیس نذاره که این اتفاق بیافته.
درسته ولی چون این گزینه تو برنامه SQLiteBrowser نیست و خیلی از کاربر ها هم آشنایی کافی ندارن پس همون بهتر که این عملیات از طریق خود مثال ما انجام بشه. ولی توضیحات شما هم بجا هست ممنون

بله، ولی خب جلوی زدن Tab رو که نمیگیره؟ مثلا شاید بهتر بود تبدیل به متن ساده میشد. البته در جایگاه یه مثال بسیار هم خوب هست.
خب این ضعف بیلدر هست دیگه شما حساب کنید اگه سی شارپ بود این عملیات خیلی بهتر و راحتر انجام میشد یا مثلا از پلاگین کتیبه استفاده میشد
 

محمدمهدی

Well-Known Member
میشد از کوئری هم استفاده کرد من همین کار رو کردم
بله میشه، در این نمونه ای که حالا اصلاح شد بهتره و راه های دیگه و بهتری هم هست. فقط من خواستم با کمترین تغییر و خیلی سریع باگ رو حل کنم، اگر نه با ساختار اسکریپت صد در صد موافق نیستم چون مثلا نیازی دیده نمیشه که یه حلقه وجود داشته باشه اگر از «=» استفاده بشه. ضمن اینکه اگر هم حلقه وجود داشته باشه این کد مجددا ممکنه اشتباه بکنه و داخل بشه. یعنی به نظرم باید دقیقا همون عبارات قبلی استفاده بشه :
کد:
  SQLSearch_Query$='SELECT Password FROM Acount WHERE Password = \''+EncryptPass$+'\' AND User = \''+[B]UserNameBox$[/B]+'\';'


درسته ولی چون این گزینه تو برنامه SQLiteBrowser نیست و خیلی از کاربر ها هم آشنایی کافی ندارن پس همون بهتر که این عملیات از طریق خود مثال ما انجام بشه. ولی توضیحات شما هم بجا هست ممنون
لطف دارید. این بسته به صلاح دید خودتونه. اما در SQLiteBrowser این وِیژگی وجود داره و تصویری که گذاشتم از همون هست :
ببینید شکلش به این صورت میشه :
attachment.php

تصویر : SqLiteBrowser
شما از چه نسخه ای استفاده می کنید؟
ضمن اینکه هم بهتره از طریق خود مثال انجام بشه، و هم اینکه اصولا Table باید به این شکل هم Unique باشه و هم برای جلوگیری از باگ های احتمالی Default Value برای وجود Admin هم تعریف بشه و اینکه بنده قسمت ویرایش رو عرض کردم، ببینید :
Bug ScreenShot.jpg
فکر می کنید باگ خود مثال کجاست؟
به نظرم اگر مثال هم باگ داشته باشه خیلی راحت تر به نظر میرسه که Table اصولی باشه. ولی خب روش شما هم روشی هم هست و فقط روشی که به نظر بنده میرسه یه مقدار متفاوته. که روش شما البته بنا به اقتضا کافی و خوب به نظر میرسه.


خب این ضعف بیلدر هست دیگه شما حساب کنید اگه سی شارپ بود این عملیات خیلی بهتر و راحتر انجام میشد یا مثلا از پلاگین کتیبه استفاده میشد
بیلدر که ضعف زیاد داره و اینکه نمیشه داستان Tab رو کاملا کنترل کرد هم یه مشکله. بنده هم همین رو گفتم که با توجه به این مشکل شاید برای admin راه هایی که گفته شد کار رو راحت تر می کرد.

ممنون!
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
من از نسخه 1.3 استفاده میکنم که این قابلیت رو نداشت. منم خودم دیگه زیاد با بیلدر در رابطه با دیتابیس و ... کمتر کار میکنم و خیلی وقته رفتم سراغ سی شارپ و SQLServer و ... واسه این دیگه زیاد توجه نمیکنم.
باز مرسی محمد مهدی عزیز
 

MahmoodM30

مدیر <A href="http://forum.majidonline.com/forums/
استفاده از تابع DBAttribute

سلام امروز براتون نحوه استفاده از تابع DBAttribute رو توضیح میدم که میتونه مفید باشه و تو پروژه هاتون بتونید استفاده کنید از این قابلیت ها :

- قابلیت Hide کردن دیتابیس
- قابلیت ReadOnly کردن دیتابیس

کد مربوطه :

کد:
/*
1:Hidden Switch
2:Read-Only Switch
3:System File Switch
4:Make Normal Switch
*/
**-----------------------------
Switch = 1
PluginSet("PlugInSQLite","Switch")
DBPath$ = '<SrcDir>\Database.db'
PluginSet("PlugInSQLite","DBPath$")
PluginRun("PlugInSQLite","SetDBAttribute")
PluginGet("PlugInSQLite","Status")
Message("","Status")

برای انجام هر بخش عدد مورد نظرش رو میتونید به Switch بفرستید که تو نمونه من عدد 1 رو فرستادم و این کار باعث میشه دیتابیس Hidden بشه و برای باز گردوندن به حالت اول میتونید عدد 4 رو به Switch ارسال کنید همین.
 

m20a

Member
سلام . میدونم این تاپیک خیلی قدیمیه ولی من به این نمونه ها نیاز دارم. آیا میشه دوباره آپلودش کنین؟
 

جدیدترین ارسال ها

بالا