منبع :gameover.blog.ir
منبع:
http://www.b4x.com/android/forum/threads...rial.8339/
مترجم:
sajjad3011
این آموزش طریقه اتصال بین Android device و remote server رو نشون می ده.
در اینجا قصد اتصال به یک MySQL database رو داریم.
Android به طور مستقیم نمی تونه به database server وصل بشه.
بنابراین نیازه یک simple web service یا سرویس وب ساده بسازیم تا request ما رو به دیتابیس بفرسته و به ما response بده.
مثلا ما یه new database ایجاد کردیم که جمعیت کشور ها رو برامون لیست کنه.
.(در اینجا البته اسم دیتابیس و ... دلخواه هست مثل xxxx یا .... )
دیتابیس ما یه جدول داره به اسم "countries" با سه ستون Name+ID+Population
PHP Script:
web service ما یک اسکریپت php هست که روی سایت سرور قرار میدیم.
روش های ارتباط با این اسکریپت زیاده. مثلا می تونید با ارسال و دریافت پارامترها کار کنید و ... .
می تونیم روی سایت با php یه query بگیریم با دستوای sql و محتوای دیتابیس
رو بریزیم بیرون یا واکشی کنیم توی یک فایل دیگه یا یه صفحه که با php
درخواست می دیم.(مثلا get.php یا...)
البته این سوریس بهتره public نباشه(تنظیمات chmod روی سایت رو طوری تنظیم
کنید که فقط کاربران خاص بتونن بهش دسترسی داشه باشن یا یه سری مسائل ایمنی
و رعایت کنید اگه واستون مهمه)
البته یه راهنما هم هست تا افراد نتونن sql رو inject(تزریق) کنن برای باگ یابی از بانک شما:
PHP: mysql_real_escape_string - Manual
http://php.net/manual/en/function.mysql-...string.php
ما در اینجا از روش query استفاده می کنیم.
php script:
<?
$databasehost = "localhost";
$databasename = "xxxx";
$databaseusername ="xxxx";
$databasepassword = "xxxx";
$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
mysql_select_db($databasename) or die(mysql_error());
mysql_query("SET CHARACTER SET utf8");
$query = file_get_contents("php://input");
$sth = mysql_query($query);
if (mysql_errno()) {
header("HTTP/1.1 500 Internal Server Error");
echo $query.'\n';
echo mysql_error();
}
else
{
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
$rows[] = $r;
}
print json_encode($rows);
}
?>
این اسکریپت با استفاده از داده ها یا پارامتری هایی که با متد POST بهش
ارسال می کنیم یک query از دیتابیس mysql می گیره.یعنی طبق درخواست ما به
بانک وصل میشه و نهایتا نتیجه رو البته با فرمت JSON برگشت میده.
نکته: قسمت مهم کد بالا
$query = file_get_contents("php://input");
هست که محتوای متن ارسالی توسط b4a رو در متغیر $query ذخیره می کنه.
کپی شده از http://gameover.blog.ir
Basic4android code:
![[تصویر: SS-2013-01-29_16.42.32.png]](http://www.b4x.com/basic4android/images/SS-2013-01-29_16.42.32.png)
این کد یک query(یک متغیر رشته ای که شامل بازجست و دستورات SQL هست مثل select * from table1 برای انتخاب تمام ستون ها از جدول) رو send می کنه. و نتیجه ی JSON دیافت شده رو parse(تجزیه) می کنه و نمایش میده روی listView .
قسمت اصلی سورس b4a اینطوری هست :
'Activity module
Sub Process_Globals
Private COUNTRIES_LIST = "countries_list", COUNTRY_POPULATION = "country_population" As String
End Sub
Sub Globals
Type TwoLines (First As String, Second As String)
Dim lblPopulation As Label
Dim ListView1 As ListView
Dim lblCountry As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("1")
FetchCountriesList
End Sub
Sub FetchCountriesList
ProgressDialogShow("Fetching list of countries")
'Gets all the available countries
ExecuteRemoteQuery("SELECT name, id FROM countries ORDER BY id", COUNTRIES_LIST)
End Sub
Sub ListView1_ItemClick (Position As Int, Value As Object)
Dim tl As TwoLines
tl = Value
lblCountry.Text = tl.Second
lblPopulation.Text = "Calling server..."
ExecuteRemoteQuery("SELECT population FROM countries WHERE id='" & tl.First & "'", COUNTRY_POPULATION)
End Sub
Sub ExecuteRemoteQuery(Query As String, JobName As String)
Dim job As HttpJob
job.Initialize(JobName, Me)
job.PostString("http://www.basic4ppc.com/android/countries.php", Query)
End Sub
Sub JobDone(Job As HttpJob)
ProgressDialogHide
If Job.Success Then
Dim res As String
res = Job.GetString
Log("Response from server: " & res)
Dim parser As JSONParser
parser.Initialize(res)
Select Job.JobName
Case COUNTRIES_LIST
Dim COUNTRIES As List
COUNTRIES = parser.NextArray 'returns a list with maps
For i = 0 To COUNTRIES.Size - 1
Dim m As Map
m = COUNTRIES.Get(i)
'We are using a custom type named TwoLines (declared in Sub Globals).
'It allows us to later get the two values when the user presses on an item.
Dim tl As TwoLines
tl.First = m.Get("id")
tl.Second = m.Get("name")
ListView1.AddTwoLines2(tl.First, tl.Second, tl)
Next
Case COUNTRY_POPULATION
Dim l As List
l = parser.NextArray
If l.Size = 0 Then
lblPopulation.Text = "N/A"
Else
Dim m As Map
m = l.Get(0)
lblPopulation.Text = NumberFormat2(m.Get("population"),0, 0, 0, True) & " (K)"
End If
End Select
Else
ToastMessageShow("Error: " & Job.ErrorMessage, True)
End If
Job.Release
End Sub
Sub Activity_Resume
End Sub
در کد فوق اطاعات یا query بهcountries.php ارسال میشه (ما فرض کردیم همون فایل get.php که بالا اوردیم هست. اسمشون رو خودتون یکی کنید و ادرس رو به هاست یا سایت خودتون تغییر بدید و لینک دقیق فایل php)
اینم سورس رایگان که خودم هم تست کردم کاملا کار می کنه:
http://www.mediafire.com/download/gb2b3a2ka1dye8p/MySQL.zip
خرید آموزش b4a فارسی با قیمت کم:
http://gameover.blog.ir/1395/04/03/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A7%D9%85%D9%88%D8%B2%D8%B4-b4a-%D8%B3%D8%A7%D8%AE%D8%AA-%DA%AF%DB%8C%D9%85-%D8%A2%D9%88%D8%B1