آموزش ارتباط با سرور آنلاین در B4A – قسمت هشتم(جستجو)
سلام
با یک قسمت دیگه از سری آموزش های ارتباط با دیتابیس آنلاین در بیسیک فور اندروید در خدمتتون هستیم؛ در این بخش از آموزش به درخواست کاربران میپردازیم به جستجوی متن در دیتابیس آنلاین، در ادامه همراه بپرسم باشید.
دربرخی از برنامه هایی که دارای دیتابیس آنلاین هستند، مثل دیوار یا دیجیکالا، حتما دیده اید که وقتی نام یک کالا را وارد میکنید، خود برنامه چند پیشنهاد در رابطه با نام وارد شده را میدهد، در این مقاله آموزشی میخوایم به چگونگی انجام کار بپردازیم.
آموزش:
سمت سرور(PHP)
- ابتدا کدهای سمت سرور به زبان PHP مینویسیم:
یک دیتابیس به نام my_serach در سمت سرور ساختیم که دارای یک جدول به نام tbl_user است؛ در این جدول دو فیلد name و lastname داریم.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ |
<?php $conn=new PDO('mysql:host=localhost;dbname=my_serach;charset=utf8','root',''); $name = $_POST['name']; $data=$conn->query("SELECT * FROM tbl_test WHERE name LIKE '%name%'"); $array=array(); while($row=$data->fetch()) { array_push($array,array('name' => $row['name'])); } echo json_encode($array); $conn=null; ?> |
در تکه کدهای بالا در خط ۳ اطلاعات مربوط به دیتابیس قرار دارد، در خط ۴ مقدار ارسال شده از سمت بیسیک را درون متغیر name$ ذخیره کردیم؛ در خط ۶ نیز کوئری جستجو را نوشتیم و نتیجه ی اطلاعات را به صورت جیسون دریافت و در بیسیک فور اندروید این اطلاعات را نمایش میدهیم.
برای درک بهتر کدهای سمت سرور، آموزش PHP در سایت را مطالعه کنید.
سمت کلاینت(B4A)
- ابتدا کتابخانه های JSON و HttpUtils2 را در برنامه خود فعال کنید.
- سپس آن ها را تعریف میکنیم:
۱ ۲ |
Dim job_show As HttpJob Dim j_p As JSONParser |
در اینجا دلخواه میتوانید عمل کنید.
من توی این آموزش داخل یک لیست ویو نتیجه سرچ را نمایش دادم، شما میتوانید آن را داخل چیز دیگری و حتی در رویداد دیگری بنویسید.
مثلا میتوانید در رویداد textChange جعبه متنتون بنویسید و نتیجه را داخل یک لیست کشویی نمایش بدید یا … .
- سپس نیاز لیست ویو(برای نمایش اطلاعات)، یک ادیت تکست(برای وارد کردن متن) و یک دکمه(که عملیات جستجو را انجام دهد) نیاز داریم، که بدین شکل تعریف می کنیم:
۱ ۲ ۳ |
Private lst_items As ListView Private btn_send As Button Private txt_name As EditText |
- سپس کتابخانه HttpUtils2 را Initialize میکنیم:
۱ |
job_show.Initialize("job_show",Me) |
- در Sub مربوط به HttpJob کدهای زیر را مینویسیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ |
Public Sub jobdone(job As HttpJob) If job.Success=True Then j_p.Initialize(job.GetString) Dim list As List= j_p.NextArray For i=۰ To list.Size-۱ Dim map_title As Map=list.Get(i) lst_items.AddSingleLine( map_title.Get("name")) Next Else ToastMessageShow("خطا در برقراری ارتباط با سرور",False) End If job_show.Release End Sub |
در این ساب نتیجه برگشت داده میشود. من در دیتابیس چندتا نام مختلف تعریف کردم، و گفتم که فیلد name را بخوان و داخل لیست ویو نمایش بده.
- سپس در رویداد کلیک دکمه، کدهای زیر را مینویسیم:
۱ ۲ ۳ ۴ |
Sub btn_send_Click job_show.PostString("yoursite/search.php","name="&txt_name.Text) ToastMessageShow("send",False) End Sub |
در خط دو، آدرس فایل PHP سمت سرور که کدهای جستجو را نوشتیم قرار دادیم و پارامتر name را بهش پاس دادیم(پارامتر name که در اینجا ارسال کردیم در سمت سرور در متغیر name$ ذخیره کردیم).
اگر در دیتابیس برای مثال این نام ها را داشته باشید: ahmad,morteza,zahra,sadegh وقتی کلمه a را جستجو کنید، در تمام فیلدها جستجو میکنه و هر فیلدی که کلمه a توش وجود داشته باشه نمایش داده میشه.
درک این آموزش نیازمند دیدن آموزش های ارتباط با دیتابیس آنلاین می باشد که در قبلا قرار داده شده، برای مشاهده آموزش ها کلیک کنید.
در پایان سورس را میتوانید دانلود کنید.
موفق باشید.
دیدگاه ( 4 )
سلام. اولا از تلاش و زحمت های شما بسیار سپاسگزارم.
دوم اینکه از سایت شما دانش زیادی گرفتم برای بیسیک فور اندروید. جستجو در دیتابیس انلاین هم از سایت شما دیدم.
پرسش من این است که ایا ممکن است کدهایی که در ساب «jobdone» نوشته می شود همه در قسمت رویداد مثلا در زیر باتن کلیک نوشته شود یا خیر. من جستجو در ادیت تکس انجام می دهم. می خواهم اطلاعاتی که از دیتابیس گرفته می شود در یک لیست ویویی سفارشی نمایش دهم. در ساب جاب کمی سخت است چون در اپلیکیشن من چندین قسمت سرچ انجام می شود. اگر در زیر هر باتن کلیک عملی شود راحت تر مدیریت می کنم. کاش می توانستید راهنمایی کنید.
(برای راهنمایی بگویم که مثلا پست استرینگ را در قسمت باتن کلیک انجام می دهیم و در ساب جاب فقط می گوییم اگر موفق بود یک تست مسیج نشان بده. اما برای جستجو در دیتابیس انلاین شما همه کدهای اصلی را برده اید در ساب جاب.)
برای پرسیدن سوالات از بخش پرسش و پاسخ سایت استفاده کنید.
سلام
ممنون از تلاش های شما
در ادامه بحث جستجوی انلاین، الان یک مشکلی هست که در دیتبایس سلول ها و یا همان خانه هایی که نال هستند را هم در ستون لیست ویو نشان می دهد. یعنی یک لیبل خالی نشان می شد. ایا ممکن است بفرمایید با چه دستوری می توان گفت نال ها را نادیده بگیرد؟
سلام
تو کوئری که در سمت سرور می نویسید، فقط اون فیلدهایی رو که میخواید نمایش بدید برگردونید، مثلا شما فقط فیلد name,lastname رو میخوای نمایش بدی، دیگه نیاز نیست از کوئری زیر استفاده کنی:
بجاش از کوئری زیر استفاده میکنی:
اینطوری کوئری بهینه تر میشه(چون فقط اون فیلدهایی که میخوای رو select میکنی) و هم مقادیری که null هستند، انتخاب نمیشن
سلام و سپاس
فک کنم که یک مشکلی هست. هر چه توی دیتابیس هست رو میاره. یعنی سلکت نمی کنه. همه خانه های پر رو نشون میده از اول تا اخر دیتابیس . هیچ سلکتی نمی کنه. ملاحظه کنید لطفا
اگه همه ی رکوردها رو Select میکنه(IS NOt NULL) رو از کوئری حذف کنید
شما چه کاری میخواید انجام بدید؟ و در دیتابیس چرا باید داده null داشته باشید؟ داده ی null دارید یا string(رشته ی خالی)؟
چه فیلد هایی رو از دیتابیس میخواید نشون کاربر بدید؟
من یک دیتابیس دارم که چهار تا ستون داره
نام ، نام خانوادگی، نام پدر، نام استان
می خواهم وقتی اسم محمد را سرچ می کنم، ابتدا هر کسی که نامش محمد است را به همراه سه ستون دیگرش یعنی نام پدر و خانوادگی و نام استان را نشان دهد. و سپس در ادامه همین جستجو پس از لیست کردن اسامی محمد در ادامه همین لیست ویوو، از میان نام خانوادگی ها هم بگردد و هر کسی محمد یا محمدی دارد را هم نشان دهد. اما چون بعضی از افراد نام شهرشان در لیست نیست، می خواهم بگویم لیبل خالی نمایش ندهد و فقط سه لیبل نام، نام خانوادگی نام پدر را نمایش دهد. یا اگر نام پدر کسی نبود ،لیبل خالی را نمایش ندهد. هر اطلاعاتی که از این شخص پر شده نشان دهد و خالی ها را حذف کند و لیبل خالی روی لیست ویوو نگذارد.
این کل درخواست من هست برای جستجو.
برای تاکید بگویم اگر مثلا در لیست دو نفر محمد و دو نفر محمدی هستند ابتدا دو محمد و دیگر اطلاعاتشان نمایش داده شود و پس از ان هر چیزی که شبیه محمد است و در نام خانوادگی شان است هم در همین یکبار سرچ اورده شود. در کدهای بیسیک من انجام داده ام اما در کدهای پی اچ پی برای سرچ انلاین نتوانستم . ممنون
سلام جناب مرتضی
ممنون اما اما
کار نمی کنه. همه ش می نویسه «خطا در برقرای ارتباط با سرور»
من خیلی تغییرات دیگه هم انجام دادم نشد. پی اچ پی رو هم دستکاری کردم نشد
تازه. به نظر میرسه شما امتحان نکردید این سورس رو. می دونم دانشش رو دارید اما مثلا
For i= To list.Size–۱
اینجا یه دونه ۰ نیاز هست که نگذاشتید من سه ساعت کارکردم روی این سورس شما . نشد که نشد
من اپلیکیش ساختم قبلا و اطلاعات اجمالی دارم یعنی قبلا از پی اچ پی استفاده کردم هر تغییراتی دادم نشد.
خواهشا درستش کن ببین چیزی کم نگذاشتی توی کدها. یا طرف بیسیک یا طرف سرور
ممنون
سلام
مدیر جان ممنون. من مشکل رو پیدا کردم. مشکل اینه که ان چیزی که شما اینجا نوشتید با چیزی که در سورس پیوستی نوشتید یکی دو جا تفاوت داره. علامت دالر در خط ۱۱ فایل پی اچ پی حذف شده که من بالاخره در فایل پیوستی پیداش کردم.
لطفا پست قبلی من رو حذف کنید که غلط انداز نباشه. کدها در مجموع درست هست
اما یک سوال/
اگر ما بخواهیم به غیر از نام، نام خوانوادگی رو هم در لیست ویو نشون بدیم چی؟ یعنی ستون دوم که نام خانوداگی است چطور نمایش داده شود. ممنون
سلام.
عزیز، کار سختش همین برقراری ارتباط با سرور و جستجو هست.
حالا این چیزایی که شما میگید، جزئیاته دیگه.
مثلا میتونید از متد addtowlines لیست ویو استفاده کنید و نتیجه جستجو رو توی یک متغیر بریزی و داخل لیست ویو نشون بدی.
اینطوری
فایل php ت رو هم اینطوری تغییر بده
من براساس سورس خودمون اینارو نوشتم.
سلام جلال جان
در رابطه با این که گفتید، در کد ۰ فراموش شده که گذاشته بشه، ۰ وجود داره شما باید روی کدهادوبار کلیک کنید تا کدها رو بتونید کپی و به صورت درست مشاهده کنید، در واقع این مشکل از سایت هست که رفع میکنم.
و من الان سورس رو مجدد امتحان کردم؛ تصویر زیر را ببینید:
مشکل دقیقت رو بگو با هم بررسی میکنیم تا به نتیجه برسیم، از این کدها داری جداگونه استفاده میکنی یا به کدهای قبلی خودت اضافه کردی؟