Android+PHP+MYSQL開發簡單實例
前段時間做了一個安卓項目,需要用到數據庫,之前有寫過一點網頁相關的東西,所以打算用MYSQL+PHP這個黃金搭檔,雖然有點大材小用了。
本人是個貨真價實的菜鳥,對安卓並不瞭解,這個項目純屬是趕鴨子上架,之所以寫這篇博客,是想把我在項目中遇到的各種問題的解決方法分享給大家,希望對大家有所幫助。
接下來我將從三個方面介紹安卓客戶端如何通過PHP與MYSQL數據庫進行交互。
總述
簡單的說,安卓客戶端通過Http向本地服務器發出請求,訪問指定的php代碼,服務器端通過php代碼執行數據庫的操作,
返回相應的JSON數據。服務器可以理解爲運行着某些服務器容器的電腦,比如你的電腦安裝了Apache並保持運行,那麼電腦就變成了一臺服務器,只是這臺服務器沒有入網,只能本地訪問。安卓客戶端通過HttpURLConnection向服務器中指定的php文件提交POST或GET請求,服務器端相應php代碼接受來自客戶端的參數(如果是帶參傳遞)進行數據庫的操作,返回JSON數據給客戶端。
下面我以安卓客戶端通過用戶名密碼登陸爲例進行說明。具體爲:客戶端通過POST方法向服務器提交2個參數:用戶名(username)和密碼(password)到指定login.php文件(這個文件寫登陸驗證的php代碼),該文件中通過查詢數據庫中是否存在該用戶以及密碼是否正確來返回客戶端相應的JSON數據。
既然選擇了PHP+MYSQL,那麼使用wamp server套件是比較方便的一種選擇,用過它的朋友都應該輕車熟路了。
1.安卓客戶端
安卓客戶端所做的工作有:通過HttpURLConnection向服務器中指定的login.php文件提交POST或GET請求,服務器端接受來自客戶端的參數執行login.php文件進行數據庫的操作,返回JSON數據給客戶端。
這裏只貼出代碼部分,至於界面只需要2個文本編輯框edittext用於輸入用戶名密碼,一個button登陸按鈕,其id自行設置即可。
登陸按鈕響應函數如下
- loginbtn.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- ((App)getApplicationContext()).setTextData(et.getText().toString());
- location_x.setText(((App)getApplicationContext()).getTextData());*/
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- int result = login();
-
- if (result == 1) {
- Log.e("log_tag", "登陸成功!");
-
- Looper.prepare();
- Toast.makeText(PhpActivity.this, "登陸成功!", Toast.LENGTH_SHORT).show();
- Looper.loop();
- } else if (result == -2) {
- Log.e("log_tag", "密碼錯誤!");
-
- Looper.prepare();
- Toast.makeText(PhpActivity.this, "密碼錯誤!", Toast.LENGTH_SHORT).show();
- Looper.loop();
- } else if (result == -1) {
- Log.e("log_tag", "不存在該用戶!");
-
- Looper.prepare();
- Toast.makeText(PhpActivity.this, "不存在該用戶!", Toast.LENGTH_SHORT).show();
- Looper.loop();
- }
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- }).start();
- }
- });
登陸按鈕響應函數中有個login()函數,這個函數就是完成向服務器提交申請並獲取服務器返回json數據的功能。
-
-
-
-
-
- private int login() throws IOException {
- int returnResult=0;
-
- String user_id=et.getText().toString();
- String input_pwd=pwd.getText().toString();
- if(user_id==null||user_id.length()<=0){
- Looper.prepare();
- Toast.makeText(PhpActivity.this,"請輸入賬號", Toast.LENGTH_LONG).show();
- Looper.loop();
- return 0;
-
- }
- if(input_pwd==null||input_pwd.length()<=0){
- Looper.prepare();
- Toast.makeText(PhpActivity.this,"請輸入密碼", Toast.LENGTH_LONG).show();
- Looper.loop();
- return 0;
- }
- String urlstr="http://192.168.191.1/LBS/login.php";
-
- URL url = new URL(urlstr);
- HttpURLConnection http= (HttpURLConnection) url.openConnection();
-
- String params="uid="+user_id+'&'+"pwd="+input_pwd;
- http.setDoOutput(true);
- http.setRequestMethod("POST");
- OutputStream out=http.getOutputStream();
- out.write(params.getBytes());
- out.flush();
- out.close();
-
-
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(http.getInputStream()));
- String line="";
- StringBuilder sb=new StringBuilder();
- while (null!=(line=bufferedReader.readLine())){
- sb.append(line);
- }
- String result= sb.toString();
-
- try {
-
- JSONObject jsonObject= new JSONObject(result);
- returnResult=jsonObject.getInt("status");
- } catch (Exception e) {
-
- Log.e("log_tag", "the Error parsing data "+e.toString());
- }
- return returnResult;
- }
對於這個login()函數有幾點說明:
1) urlstr="http://192.168.191.1/LBS/login.php"。其中192.168.191.1即本地電腦運行的Apache服務器的地址,這個地址會映射到Wamp安裝目錄下的WWW目錄,LBS即爲WWW目錄下的文件夾。
一開始我使用android studio自帶模擬器進行測試,網上說是瀏覽器訪問10.0.2.0什麼的就能訪問電腦上的本地Apache服務器,但是沒能成功訪問wamp自帶的apache服務器。
最後找到一個極好方法,就是使用真機測試,作爲服務器的電腦需要安裝一個wifi共享軟件(如獵豹wifi),用要測試的真機連接該wifi後,手機瀏覽器訪問http://192.168.191.1,如果顯示
如下圖則說明手機訪問電腦apache服務器成功,至此服務器環境已經搭建成功。login.php是放在電腦的apache服務器下的,比如我的是在D:\wamp\www\LBS文件夾下。
2) HttpURLConnection。本人曾在網上找到過一些安卓網絡請求的方法,但是大多都已棄用,使用HttpURLConnection是當前還未棄用的一種方法,當然對於高手來說,這就不值一提了。
3) JSONObject。
由於在後面的php代碼中所返回的數據爲json數據類型,所以需要在客戶端進行解析,這並不困難,不清楚的可以搜索一下。
4)之前已經說過,本人對安卓一竅不通,所以在測試時犯了一個大忌,就是網絡訪問不能放在主線程中,否則會阻塞主線程,造成UI假死等錯誤,所以需要單開一個線程,即
登陸按鈕響應函數中的run方法。
2.服務器端
login.php在服務器容器中,時刻響應着外部的訪問請求,主要工作是:
1)獲取手機端通過Post請求發送的用戶名密碼。
2)連接數據庫,從數據庫中查找是否有與該用戶名密碼一致的記錄,根據查找結果返回不同的Json數據。
3)Json數據是一種有效的客戶端與服務器端的交互方式。
- <?php
-
-
-
- include("conn.php");
- mysql_select_db("lbs");
- $getid=$_POST['uid'];
- $getpwd=$_POST['pwd'];
- $sql=mysql_query("SELECT * FROM user WHERE userid ='$getid'");
- $result=mysql_fetch_assoc($sql);
- if(!empty($result)){
-
- if($getpwd==$result['password']){
-
- mysql_query("UPDATE user SET status='1' WHERE id =$result[id]");
- $back['status']="1";
- $back['info']="login success";
- $back['sex']=$result['sex'];
- $back['nicename']=$result['nicename'];
- echo(json_encode($back));
- }else{
- $back['status']="-2";
- $back['info']="password error";
- echo(json_encode($back));
- }
-
- }else{
-
- $back['status']="-1";
- $back['info']="user not exist";
- echo(json_encode($back));
- }
-
- mysql_close();
- ?>
其中conn.php是數據庫連接文件,代碼如下
-
<?php
-
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
-
$conn=mysql_connect("localhost","root","admin") or die("數據庫服務器連接錯誤".mysql_error());
-
mysql_select_db("mylocation",$conn) or die("數據庫訪問錯誤".mysql_error());
-
-
mysql_query("SET NAMES 'utf8'");
-
?>
3.MYSQL數據庫
至於數據庫,可以自行建立,根據上面php代碼可知,數據庫中有一個user表,表中有4個字段,分別是userid,password,nicename,sex.大家可自行建立即可(nicename,sex在本例中沒有用到)。截圖如下
上述工作完成後,將客戶端部署到真機上進行測試
輸入用戶名密碼,點擊登陸按鈕,結果如下: