Android和PHP MYSQL交互開發(fā)實例
總述
簡單的說,安卓客戶端通過Http向本地服務器發(fā)出請求,訪問指定的php代碼,服務器端通過php代碼執(zhí)行數(shù)據(jù)庫的操作, 返回相應的JSON數(shù)據(jù)。服務器可以理解為運行著某些服務器容器的電腦,比如你的電腦安裝了Apache并保持運行,那么電腦就變成了一臺服務器,只是這臺服務器沒有入網(wǎng),只能本地訪問。安卓客戶端通過HttpURLConnection向服務器中指定的php文件提交POST或GET請求,服務器端相應php代碼接受來自客戶端的參數(shù)(如果是帶參傳遞)進行數(shù)據(jù)庫的操作,返回JSON數(shù)據(jù)給客戶端。
下面我以安卓客戶端通過用戶名密碼登陸為例進行說明。具體為:客戶端通過POST方法向服務器提交2個參數(shù):用戶名(username)和密碼(password)到指定login.php文件(這個文件寫登陸驗證的php代碼),該文件中通過查詢數(shù)據(jù)庫中是否存在該用戶以及密碼是否正確來返回客戶端相應的JSON數(shù)據(jù)。 既然選擇了PHP+MYSQL,那么使用wamp server套件是比較方便的一種選擇,用過它的朋友都應該輕車熟路了。
1.安卓客戶端
安卓客戶端所做的工作有:通過HttpURLConnection向服務器中指定的login.php文件提交POST或GET請求,服務器端接受來自客戶端的參數(shù)執(zhí)行l(wèi)ogin.php文件進行數(shù)據(jù)庫的操作,返回JSON數(shù)據(jù)給客戶端。 這里只貼出代碼部分,至于界面只需要2個文本編輯框edittext用于輸入用戶名密碼,一個button登陸按鈕,其id自行設(shè)置即可。 登陸按鈕響應函數(shù)如下
loginbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//登陸按鈕監(jiān)聽事件
/* ((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服務器提交請求的函數(shù),返回數(shù)據(jù)類型為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();
}
});
登陸按鈕響應函數(shù)中有個login()函數(shù),這個函數(shù)就是完成向服務器提交申請并獲取服務器返回json數(shù)據(jù)的功能
//用戶登錄提交post請求
//向服務器提交數(shù)據(jù)1.user_id用戶名,2.input_pwd密碼
//返回JSON數(shù)據(jù){"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();
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()函數(shù)有幾點說明:
1) urlstr="http://192.168.191.1/LBS/login.php"。其中192.168.191.1即本地電腦運行的Apache服務器的地址,這個地址會映射到Wamp安裝目錄下的WWW目錄,LBS即為WWW目錄下的文件夾。
一開始我使用android studio自帶模擬器進行測試,網(wǎng)上說是瀏覽器訪問10.0.2.0什么的就能訪問電腦上的本地Apache服務器,但是沒能成功訪問wamp自帶的apache服務器。
最后找到一個極好方法,就是使用真機測試,作為服務器的電腦需要安裝一個wifi共享軟件(如獵豹wifi),用要測試的真機連接該wifi后,手機瀏覽器訪問http://192.168.191.1,至此服務器環(huán)境已經(jīng)搭建成功。login.php是放在電腦的apache服務器下的,比如我的是在D:\wamp\www\LBS文件夾下。
2) HttpURLConnection。本人曾在網(wǎng)上找到過一些安卓網(wǎng)絡請求的方法,但是大多都已棄用,使用HttpURLConnection是當前還未棄用的一種方法,當然對于高手來說,這就不值一提了。
3) JSONObject。 由于在后面的php代碼中所返回的數(shù)據(jù)為json數(shù)據(jù)類型,所以需要在客戶端進行解析,這并不困難,不清楚的可以搜索一下。
4)之前已經(jīng)說過,本人對安卓一竅不通,所以在測試時犯了一個大忌,就是網(wǎng)絡訪問不能放在主線程中,否則會阻塞主線程,造成UI假死等錯誤,所以需要單開一個線程,即 登陸按鈕響應函數(shù)中的run方法。
2.服務器端
login.php在服務器容器中,時刻響應著外部的訪問請求,主要工作是:
1)獲取手機端通過Post請求發(fā)送的用戶名密碼。
2)連接數(shù)據(jù)庫,從數(shù)據(jù)庫中查找是否有與該用戶名密碼一致的記錄,根據(jù)查找結(jié)果返回不同的Json數(shù)據(jù)。
3)Json數(shù)據(jù)是一種有效的客戶端與服務器端的交互方式。
<?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]");/*這里的數(shù)組不需要加單引號*/
$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是數(shù)據(jù)庫連接文件,代碼如下
<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
$conn=mysql_connect("localhost","root","admin") or die("數(shù)據(jù)庫服務器連接錯誤".mysql_error());
mysql_select_db("mylocation",$conn) or die("數(shù)據(jù)庫訪問錯誤".mysql_error());
mysql_query("SET NAMES 'utf8'");
?>
3.MYSQL數(shù)據(jù)庫
至于數(shù)據(jù)庫,可以自行建立,根據(jù)上面php代碼可知,數(shù)據(jù)庫中有一個user表,表中有4個字段,分別是userid,password,nicename,sex.大家可自行建立即可(nicename,sex在本例中沒有用到)。截圖如下

上述工作完成后,將客戶端部署到真機上進行測試
輸入用戶名密碼,點擊登陸按鈕,結(jié)果如下:

4.總結(jié)
本文所講只是php和安卓結(jié)合最簡單的一個例子,其實有許多大項目都是采用這種模式,比如新浪微博客戶端等,感興趣的讀者可以查詢相關(guān)的資料數(shù)據(jù)比如《Android+PHP最佳實踐》,再次說明,由于本人也是個菜鳥,從許多前輩們的博文中學到了許多,所以在這里和大家分享一下自己的學習經(jīng)驗,所以如果文中有錯誤之處還歡迎大家批評指正。
以上就是Android和PHP MYSQL交互開發(fā)實例的詳細內(nèi)容,更多關(guān)于Android和PHP交互的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實現(xiàn)常見的驗證碼輸入框?qū)嵗a
我們在開發(fā)APP的時候經(jīng)常要遇到輸入框,下面這篇文章主要給大家介紹了關(guān)于利用Android如何實現(xiàn)常見的驗證碼輸入框的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學習學習下吧。2017-09-09
Android Jetpack 狠活Lifecycles與LiveData使用詳解
這篇文章主要為大家介紹了Android Jetpack 狠活Lifecycles與LiveData使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Android RecyclerView實現(xiàn)拼團倒計時列表實例代碼
這篇文章主要給大家介紹了關(guān)于Android RecyclerView實現(xiàn)拼團倒計時列表的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09

