با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. اگر شما یک وب سایت نوشته شده با PHP و MYSQL در اختیار دارید و قصد دارید که اپلیکیشن اندرویدی خود را با کدهای PHP و MYSQL در وب سایت خود مرتبط کنید، اندروید به شما این اجازه را می دهد. به طوریکه می توانید داده هایی را از اپلیکیشن خود به وب سایت ارسال کرده و یا در MYSQL وب خود ذخیره کنید. این قابلیت کاربردهای فراوانی دارد، که رایج ترین آن ارتباط اپلیکیشن با پایگاه داده MYSQL در وب سایت با استفاده از کدهای php و دریافت اطلاعات لازم از دیتابیس برای نمایش به کاربر در اپلیکیشن موبایل است. در این مبحث با چگونگی استفاده از PHP و MYSQL در برنامه نویسی اندروید پرداخته ایم.
دیتابیس MYSQL با استفاده از یک script به راحتی ایجاد می شود.
برای این منظور از دستور CREATE DATABASE به صورت زیر استفاده کنید:
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password"); $sql="CREATE DATABASE my_db"; if (mysqli_query($con,$sql)) { echo "Database my_db created successfully"; } ?> |
بعد از ایجاد دیتابیس ، وقت آن است که جداول را در دیتابیس خود ایجاد کنید.
برای این منظور باید از دستور CREATE TABLE برای ایجاد جداول استفاده کرد:
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password","my_db"); $sql="CREATE TABLE table1(Username CHAR(30),Password CHAR(30),Role CHAR(30))"; if (mysqli_query($con,$sql)) { echo "Table have been created successfully"; } ?> |
بعد از ایجاد دیتابیس و جداول ، وقت آن است که داده های مورد نظر را در جداول دیتابیس خود درج کنید.
برای درج داده ها در جداول می توان از دستور Insert Into به صورت زیر استفاده کرد:
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password","my_db"); $sql="INSERT INTO table1 (FirstName, LastName, Age) VALUES ('admin', 'admin','adminstrator')"; if (mysqli_query($con,$sql)) { echo "Values have been inserted successfully"; } ?> |
پی اچ پی همچنین برای رایت رکورد از پایگاه داده mysql پس از ایجاد آن استفاده می شود.
برای واکشی کردن رکورد برخی از اطلاعات باید به صفحه PHP ارسال شود که چه رکوردی باید دریافت شود.
اولین متد برای ارسال اطلاعات متدGET است که با دستور $_GET تعریف می شود.
متغیرها در url منتقل می شوند و ضبط می شود.
ساختار این کار به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php $con=mysqli_connect("example.com","username","password","database name"); if (mysqli_connect_errno($con)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $username = $_GET['username']; $password = $_GET['password']; $result = mysqli_query($con,"SELECT Role FROM table1 where Username='$username' and Password='$password'"); $row = mysqli_fetch_array($result); $data = $row[0]; if($data){ echo $data; } mysqli_close($con); ?> |
متد دوم POST است که برای استفاده از آن کافیست از دستور $_POST به جای $_GET استفاده کنید.
وقتی از Post استفاده می کنیم متغیرها در آدرس URL ارسال نمی شوند.
دو روش برای اتصال به MYSQL با صفحه ی PHP وجود دارد.
اولین روش متد Get است که در آن باید از کلاس های HttpGet و HttpClient برای اتصال استفاده کرد.
ساختار آن به صورت زیر است:
1 2 3 4 | URL url = new URL(link); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI(link)); |
سپس شما نیاز به فراخوانی execute از کلاس HttpClient برای دریافت در قالب یک آبجکت HttpResponse دارید.
سپس باید streams را برای دریافت داده ها باز کنید:
1 2 3 | HttpResponse response = client.execute(request); BufferedReader in = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); |
در متد POST از کلاس های URLEncoder,URLConnection استفاده می شود.
urlencoder اطلاعات متغیرهای ارسالی را رمزگذاری می کند. ساختار آن به صورت زیر است:
1 2 3 4 5 6 | URL url = new URL(link); String data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8"); data += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8"); URLConnection conn = url.openConnection(); |
آخرین چیزی که باید انجام دهید این است که این اطلاعات را به لینک ارسال کنید.
پس از نوشتن، باید stream را باز کرده تا داده ی پاسخ داده شده را دریافت کنید.
1 2 3 4 | OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); |
مثال زیر نمونه ای کامل از اتصال برنامه اندروید شما با پایگاه داده MYSQL از طریق صفحه پی اچ پی است.
این مثال برنامه ای ایجاد می کند که به شما اجازه می دهد با استفاده از متد GET و POST عمل login را انجام دهید.
در این مثال یک پایگاه داده با نام temp در ۰۰۰webhost.com ایجاد شده است.
در آن پایگاه داده، یک جدول با نام table1 ایجاد شده که این جدول دارای سه فیلد (نام کاربری، رمز عبور، نقش) است.
صفحه PHP زیر پارامترها را با متد POST دریافت می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php $con=mysqli_connect("mysql10.000webhost.com","username","password","db_name"); if (mysqli_connect_errno($con)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $username = $_POST['username']; $password = $_POST['password']; $result = mysqli_query($con,"SELECT Role FROM table1 where Username='$username' and Password='$password'"); $row = mysqli_fetch_array($result); $data = $row[0]; if($data){ echo $data; } mysqli_close($con); ?> |
برای تست این برنامه شما به یک دستگاه اندروید واقعی که اینترنت wi-fi آن وصل باشد نیاز دارید.
مراحل انجام کار:
مراحل | توضیحات |
---|---|
۱ | ما از اندروید استدیو برای ایجاد یک اپلیکیشن استفاده کرده و نام آن را PHPMYSQL قرار می دهیم، همچنین این برنامه زیر پکیج com.example.phpmysql قرار می گیرد. |
۲ | به فایل src/MainActivity.java کد Activity لازم را اضافه کنید. |
۳ | فایل src/SiginActivity.java را برای قرار دادن کدهای PHPMYSQL در آن، ایجاد کنید. |
۴ | طراحی مناسب با این برنامه را به res/layout/activity_main اضافه کنید. |
۵ | کومپوننت های رشته ای لازم را به فایل res/values/string.xml اضافه کنید. |
۶ | به فایل AndroidManifest.xml مجوزهای لازم را اضافه کنید. |
۷ | برنامه را اجرا کنید تا دستگاه اندروید شما نتیجه را نمایش دهد. |
محتوای فایل src/com.example.phpmysql/MainActivity.java به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | package com.example.phpmysql; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private EditText usernameField,passwordField; private TextView status,role,method; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); usernameField = (EditText)findViewById(R.id.editText1); passwordField = (EditText)findViewById(R.id.editText2); status = (TextView)findViewById(R.id.textView6); role = (TextView)findViewById(R.id.textView7); method = (TextView)findViewById(R.id.textView9); } public void login(View view){ String username = usernameField.getText().toString(); String password = passwordField.getText().toString(); method.setText("Get Method"); new SigninActivity(this,status,role,0).execute(username,password); } public void loginPost(View view){ String username = usernameField.getText().toString(); String password = passwordField.getText().toString(); method.setText("Post Method"); new SigninActivity(this,status,role,1).execute(username,password); } } |
محتوای فایل src/com.example.phpmysql/SigninActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | package com.example.phpmysql; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.content.Context; import android.os.AsyncTask; import android.widget.TextView; public class SigninActivity extends AsyncTask{ private TextView statusField,roleField; private Context context; private int byGetOrPost = 0; //flag 0 means get and 1 means post.(By default it is get.) public SigninActivity(Context context,TextView statusField,TextView roleField,int flag) { this.context = context; this.statusField = statusField; this.roleField = roleField; byGetOrPost = flag; } protected void onPreExecute(){ } @Override protected String doInBackground(String... arg0) { if(byGetOrPost == 0){ //means by Get Method try{ String username = (String)arg0[0]; String password = (String)arg0[1]; String link = "http://myphpmysqlweb.hostei.com/login.php?username="+username+"& password="+password; URL url = new URL(link); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI(link)); HttpResponse response = client.execute(request); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line=""; while ((line = in.readLine()) != null) { sb.append(line); break; } in.close(); return sb.toString(); } catch(Exception e){ return new String("Exception: " + e.getMessage()); } } else{ try{ String username = (String)arg0[0]; String password = (String)arg0[1]; String link="http://myphpmysqlweb.hostei.com/loginpost.php"; String data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8"); data += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8"); URL url = new URL(link); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); wr.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder sb = new StringBuilder(); String line = null; // Read Server Response while((line = reader.readLine()) != null) { sb.append(line); break; } return sb.toString(); } catch(Exception e){ return new String("Exception: " + e.getMessage()); } } } @Override protected void onPostExecute(String result){ this.statusField.setText("Login Successful"); this.roleField.setText(result); } } |
محتوای زیر را به build.gradle اضافه کرده و پروژه را مجددا build کنید:
1 2 3 | android { useLibrary 'org.apache.http.legacy' } |
محتوای فایل activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/editText1" android:layout_below="@+id/editText1" android:layout_marginTop="25dp" android:ems="10" android:inputType="textPassword" > </EditText> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="44dp" android:ems="10" > <requestFocus android:layout_width="wrap_content" /> </EditText> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/editText1" android:layout_alignParentLeft="true" android:text="@string/Username" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="@string/App" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView5" android:layout_alignLeft="@+id/textView6" android:text="@string/Role" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView6" android:layout_marginTop="27dp" android:layout_toLeftOf="@+id/editText1" android:text="@string/LoginRole" /> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textView6" android:layout_alignLeft="@+id/textView5" android:layout_marginBottom="27dp" android:text="@string/method" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView8" android:layout_below="@+id/button1" android:layout_marginTop="86dp" android:text="@string/LoginStatus" /> <TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/textView4" android:layout_centerHorizontal="true" android:text="@string/Status" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <TextView android:id="@+id/textView9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView8" android:layout_alignLeft="@+id/textView6" android:text="@string/Choose" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/textView6" android:onClick="loginPost" android:text="@string/LoginPost" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button2" android:layout_alignBottom="@+id/button2" android:layout_alignLeft="@+id/textView2" android:onClick="login" android:text="@string/LoginGet" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText2" android:layout_alignBottom="@+id/editText2" android:layout_alignParentLeft="true" android:text="@string/Password" /> </RelativeLayout> |
محتوای فایل رشته ای Strings.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">PHPMYSQL</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="Username">Username</string> <string name="Password">Password</string> <string name="LoginGet">Login - Get</string> <string name="LoginPost">Login - Post</string> <string name="App">Login Application</string> <string name="LoginStatus">Login Status</string> <string name="LoginRole">Login Role</string> <string name="Status">Not login</string> <string name="Role">Not assigned</string> <string name="method">Login Method</string> <string name="Choose">Choose Method</string> </resources> |
محتوای فایل AndroidManifest.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.phpmysql" > <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.phpmysql.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
سپس پنجره ای برای انتخاب شبیه ساز اندروید یا دستگاه موبایلی که به سیستم متصل کرده اید ظاهر می شود:
از پنجره ی فوق دستگاه موبایل خود را انتخاب نمائید تا صفحه زیر را مشاهده کنید:
حالا باید نام کاربری و رمز عبور را در فیلدهای مربوطه همانند شکل زیر، وارد کنید:
حالا دکمه Get را فشار دهید و چند ثانیه صبر کنید و پاسخ دریافت خواهد شد و به شما نشان داده خواهد شد.
در این مورد، پاسخ ROLE است که در مورد مدیر به عنوان نام کاربری و رمز عبور قبلا تنظیم شده است.
اینبار روی POST فشار دهید تا نتیجه را مشاهده کنید:
در اغلب موارد برای ایجاد و توسعه اپلیکیشن اندرویدی خود نیاز دارید که قابلیت اتصال اپلیکیشن به وب سایت و تبادل داده با وب سایت را نیز به اپلیکیشن خود اضافه کنید، برای این منظور شما می توانید از کدها و دستورات PHP و MYSQL در برنامه نویسی اندروید خود، به صورتی که گفته شد، استفاده کنید.
در بخش بعدی شما را با نوار پیشرفت Circle در اندروید آشنا می کنیم.
بهروز
سلام
آیا توسط php در اندروید میتوان یک برنامه اندروید اپلیکیشن طراحی کرد؟ که با پسوند apk قابلیت نصب در اندروید رو داشته باشه؟
اگر خیر پس لزوم تفکیک مقوله php اندروید چی هست؟
خب چه در محیط اندروید و چه در محیط ویندوز کد نویسی در یک ویرایشگر انجام میشه و توسط یک مرورگر وب هم با کمک آپاچی میتوان برنامه را مشاهده کرد! فرقی هم نداره که در ویندوز باشیم یا در اندروید
صادق
سلام. برنامه های اندرویدی رو با زبان های مختلفی می نویسن که جاوا و کاتلین زبان های اصلی هستند. زبان php جز اون زبان ها نیست و نمیشه با اون اپلیکیشن اندرویدی نوشت. اینجا ما از php به عنوان یک واسط بین برنامه اندرویدی و پایگاه داده mysql استفاده کردیم. درواقع php و mysql میشن سمت سرور و برنامه اندروید میشه سمت کلاینت. درضمن کدنویسی اندروید در محیط اندروید انجام نمیشه بلکه در محیط سیستم های عامل ویندوز یا لینوکس یا مک انجام میشه.
ببینید اینطوری براتون بگم که نوشتن برنامه اندرویدی یا هر برنامه دیگه ای در داخل محیط اندروید غیر ممکن نیست. دلیل اینکه ما از ویندوز یا لینوکس استفاده می کنیم اینه که این سیستم عامل ها از نوع دسکتاپ (pc یا لپتاپ) هستند و معمولا دارای قدرت سخت افزاری بیشتر و همچنین از کیبورد پشتیبانی می کنه (و دلایل دیگه مثل بزرگ بودن صفحه نمایش. در کل راحتی). حالا فرض کنیم گوشی اندروید ما هم قوی باشه و هم دارای کیبورد. برای نوشتن اپلیکیشن نیاز به یک برنامه IDE مثل اندروید استودیو داریم. ساخت این نوع IDE ها پیچیده و هزینه بره و شرکتی مثل گوگل نمیاد برای تعداد خیلی کمی از کاربر ها این کار رو انجام بده.
TMS5
👍🏻