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(); //login()為向php伺服器提交請求的函數,返回資料類型為int if (result == 1) { Log.e("log_tag", "登陸成功!"); //Toast toast=null; Looper.prepare(); Toast.makeText(PhpActivity.this, "登陸成功!", Toast.LENGTH_SHORT).show(); Looper.loop(); } else if (result == -2) { Log.e("log_tag", "密碼錯誤!"); //Toast toast=null; Looper.prepare(); Toast.makeText(PhpActivity.this, "密碼錯誤!", Toast.LENGTH_SHORT).show(); Looper.loop(); } else if (result == -1) { Log.e("log_tag", "不存在該使用者!"); //Toast toast=null; Looper.prepare(); Toast.makeText(PhpActivity.this, "不存在該使用者!", Toast.LENGTH_SHORT).show(); Looper.loop(); } } catch (IOException e) { System.out.println(e.getMessage()); } } }).start(); } });
登陸按鈕響應函數中有個login()函數,這個函數就是完成向伺服器提交申請並擷取伺服器返回json資料的功能。
/* *使用者登入提交post請求 * 向伺服器提交資料1.user_id使用者名稱,2.input_pwd密碼 * 返回JSON資料{"status":"1","info":"login success","sex":"0","nicename":""} */ 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(); //往網頁寫入POST資料,和網頁POST方法類似,參數間用‘&’串連 String params="uid="+user_id+'&'+"pwd="+input_pwd; http.setDoOutput(true); http.setRequestMethod("POST"); OutputStream out=http.getOutputStream(); out.write(params.getBytes());//post提交參數 out.flush(); out.close(); //讀取網頁返回的資料 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(http.getInputStream()));//獲得輸入資料流 String line=""; StringBuilder sb=new StringBuilder();//建立輸入緩衝區 while (null!=(line=bufferedReader.readLine())){//結束會讀入一個null值 sb.append(line);//寫緩衝區 } String result= sb.toString();//返回結果 try { /*擷取伺服器返回的JSON資料*/ JSONObject jsonObject= new JSONObject(result); returnResult=jsonObject.getInt("status");//擷取JSON資料中status欄位值 } catch (Exception e) { // TODO: handle exception 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'];//用戶端post過來的使用者名稱$getpwd=$_POST['pwd'];//用戶端post過來的密碼 $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是資料庫連接檔案,代碼如下
<?phperror_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在本例中沒有用到)。如下
上述工作完成後,將用戶端部署到真機上進行測試
輸入使用者名稱密碼,點擊登陸按鈕,結果如下:
4.總結:
本文所講只是php和安卓結合最簡單的一個例子,其實有許多大項目都是採用這種模式,比如新浪微部落格戶端等,感興趣的讀者可以查詢相關的資料資料比如《Android+PHP最佳實務》,再次說明,由於本人也是個菜鳥,從許多前輩們的博文中學到了許多,所以在這裡和大家分享一下自己的學習經驗,所以如果文中有錯誤之處還歡迎大家批評指正。
關鍵源碼
PS:CSDN什麼時候把自家的文字編輯工具做的好用一點。
本文講解了Android+PHP+MYSQL開發簡單一實例,更多相關內容請關注php中文網。
相關推薦:
詳解PHP中的$this用法
Java與PHP之間的關聯
對於php實用經驗的總結