欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android和PHP MYSQL交互開發(fā)實(shí)例

 更新時(shí)間:2021年04月20日 09:06:03   作者:ret_from_fork  
這篇文章主要介紹了Android和PHP MYSQL交互開發(fā)實(shí)例,對(duì)此感興趣的同學(xué),可以試一下

總述

簡(jiǎn)單的說,安卓客戶端通過Http向本地服務(wù)器發(fā)出請(qǐng)求,訪問指定的php代碼,服務(wù)器端通過php代碼執(zhí)行數(shù)據(jù)庫(kù)的操作, 返回相應(yīng)的JSON數(shù)據(jù)。服務(wù)器可以理解為運(yùn)行著某些服務(wù)器容器的電腦,比如你的電腦安裝了Apache并保持運(yùn)行,那么電腦就變成了一臺(tái)服務(wù)器,只是這臺(tái)服務(wù)器沒有入網(wǎng),只能本地訪問。安卓客戶端通過HttpURLConnection向服務(wù)器中指定的php文件提交POST或GET請(qǐng)求,服務(wù)器端相應(yīng)php代碼接受來(lái)自客戶端的參數(shù)(如果是帶參傳遞)進(jìn)行數(shù)據(jù)庫(kù)的操作,返回JSON數(shù)據(jù)給客戶端。

下面我以安卓客戶端通過用戶名密碼登陸為例進(jìn)行說明。具體為:客戶端通過POST方法向服務(wù)器提交2個(gè)參數(shù):用戶名(username)和密碼(password)到指定login.php文件(這個(gè)文件寫登陸驗(yàn)證的php代碼),該文件中通過查詢數(shù)據(jù)庫(kù)中是否存在該用戶以及密碼是否正確來(lái)返回客戶端相應(yīng)的JSON數(shù)據(jù)。 既然選擇了PHP+MYSQL,那么使用wamp server套件是比較方便的一種選擇,用過它的朋友都應(yīng)該輕車熟路了。

1.安卓客戶端

安卓客戶端所做的工作有:通過HttpURLConnection向服務(wù)器中指定的login.php文件提交POST或GET請(qǐng)求,服務(wù)器端接受來(lái)自客戶端的參數(shù)執(zhí)行l(wèi)ogin.php文件進(jìn)行數(shù)據(jù)庫(kù)的操作,返回JSON數(shù)據(jù)給客戶端。 這里只貼出代碼部分,至于界面只需要2個(gè)文本編輯框edittext用于輸入用戶名密碼,一個(gè)button登陸按鈕,其id自行設(shè)置即可。 登陸按鈕響應(yīng)函數(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服務(wù)器提交請(qǐng)求的函數(shù),返回?cái)?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", "密碼錯(cuò)誤!");
                        //Toast toast=null;
                        Looper.prepare();
                        Toast.makeText(PhpActivity.this, "密碼錯(cuò)誤!", 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();
    }
});

登陸按鈕響應(yīng)函數(shù)中有個(gè)login()函數(shù),這個(gè)函數(shù)就是完成向服務(wù)器提交申請(qǐng)并獲取服務(wù)器返回json數(shù)據(jù)的功能

//用戶登錄提交post請(qǐng)求
//向服務(wù)器提交數(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,"請(qǐng)輸入賬號(hào)", Toast.LENGTH_LONG).show();
        Looper.loop();
        return 0;
    }
    if(input_pwd==null||input_pwd.length()<=0){
        Looper.prepare();
        Toast.makeText(PhpActivity.this,"請(qǐng)輸入密碼", 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;
}

對(duì)于這個(gè)login()函數(shù)有幾點(diǎn)說明:

1) urlstr="http://192.168.191.1/LBS/login.php"。其中192.168.191.1即本地電腦運(yùn)行的Apache服務(wù)器的地址,這個(gè)地址會(huì)映射到Wamp安裝目錄下的WWW目錄,LBS即為WWW目錄下的文件夾。

一開始我使用android studio自帶模擬器進(jìn)行測(cè)試,網(wǎng)上說是瀏覽器訪問10.0.2.0什么的就能訪問電腦上的本地Apache服務(wù)器,但是沒能成功訪問wamp自帶的apache服務(wù)器。

最后找到一個(gè)極好方法,就是使用真機(jī)測(cè)試,作為服務(wù)器的電腦需要安裝一個(gè)wifi共享軟件(如獵豹wifi),用要測(cè)試的真機(jī)連接該wifi后,手機(jī)瀏覽器訪問http://192.168.191.1,至此服務(wù)器環(huán)境已經(jīng)搭建成功。login.php是放在電腦的apache服務(wù)器下的,比如我的是在D:\wamp\www\LBS文件夾下。

2) HttpURLConnection。本人曾在網(wǎng)上找到過一些安卓網(wǎng)絡(luò)請(qǐng)求的方法,但是大多都已棄用,使用HttpURLConnection是當(dāng)前還未棄用的一種方法,當(dāng)然對(duì)于高手來(lái)說,這就不值一提了。

3) JSONObject。 由于在后面的php代碼中所返回的數(shù)據(jù)為json數(shù)據(jù)類型,所以需要在客戶端進(jìn)行解析,這并不困難,不清楚的可以搜索一下。

4)之前已經(jīng)說過,本人對(duì)安卓一竅不通,所以在測(cè)試時(shí)犯了一個(gè)大忌,就是網(wǎng)絡(luò)訪問不能放在主線程中,否則會(huì)阻塞主線程,造成UI假死等錯(cuò)誤,所以需要單開一個(gè)線程,即 登陸按鈕響應(yīng)函數(shù)中的run方法。

2.服務(wù)器端

login.php在服務(wù)器容器中,時(shí)刻響應(yīng)著外部的訪問請(qǐng)求,主要工作是:

1)獲取手機(jī)端通過Post請(qǐng)求發(fā)送的用戶名密碼。

2)連接數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)中查找是否有與該用戶名密碼一致的記錄,根據(jù)查找結(jié)果返回不同的Json數(shù)據(jù)。

3)Json數(shù)據(jù)是一種有效的客戶端與服務(wù)器端的交互方式。 

<?php  
/*
*用戶登錄,服務(wù)器進(jìn)行的處理
*/
	include("conn.php");
    mysql_select_db("lbs");  
	$getid=$_POST['uid'];//客戶端post過來(lái)的用戶名
	$getpwd=$_POST['pwd'];//客戶端post過來(lái)的密碼
    $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ù)組不需要加單引號(hào)*/
			$back['status']="1";
			$back['info']="login success";
			$back['sex']=$result['sex'];
			$back['nicename']=$result['nicename'];
			echo(json_encode($back)); 
		}else{/*密碼錯(cuò)誤*/
			$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ù)庫(kù)連接文件,代碼如下

<?php
	error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
     $conn=mysql_connect("localhost","root","admin") or die("數(shù)據(jù)庫(kù)服務(wù)器連接錯(cuò)誤".mysql_error());
     mysql_select_db("mylocation",$conn) or die("數(shù)據(jù)庫(kù)訪問錯(cuò)誤".mysql_error());
     
	 mysql_query("SET NAMES 'utf8'");
?>

3.MYSQL數(shù)據(jù)庫(kù)

至于數(shù)據(jù)庫(kù),可以自行建立,根據(jù)上面php代碼可知,數(shù)據(jù)庫(kù)中有一個(gè)user表,表中有4個(gè)字段,分別是userid,password,nicename,sex.大家可自行建立即可(nicename,sex在本例中沒有用到)。截圖如下

上述工作完成后,將客戶端部署到真機(jī)上進(jìn)行測(cè)試

輸入用戶名密碼,點(diǎn)擊登陸按鈕,結(jié)果如下:

4.總結(jié)

本文所講只是php和安卓結(jié)合最簡(jiǎn)單的一個(gè)例子,其實(shí)有許多大項(xiàng)目都是采用這種模式,比如新浪微博客戶端等,感興趣的讀者可以查詢相關(guān)的資料數(shù)據(jù)比如《Android+PHP最佳實(shí)踐》,再次說明,由于本人也是個(gè)菜鳥,從許多前輩們的博文中學(xué)到了許多,所以在這里和大家分享一下自己的學(xué)習(xí)經(jīng)驗(yàn),所以如果文中有錯(cuò)誤之處還歡迎大家批評(píng)指正。 

以上就是Android和PHP MYSQL交互開發(fā)實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于Android和PHP交互的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車功能

    Android實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)二級(jí)列表購(gòu)物車功能 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • android原生JSON解析實(shí)例

    android原生JSON解析實(shí)例

    通過實(shí)例給大家詳細(xì)分析一下關(guān)于android開發(fā)原生JSON解析的問題。
    2017-11-11
  • Android實(shí)現(xiàn)常見的驗(yàn)證碼輸入框?qū)嵗a

    Android實(shí)現(xiàn)常見的驗(yàn)證碼輸入框?qū)嵗a

    我們?cè)陂_發(fā)APP的時(shí)候經(jīng)常要遇到輸入框,下面這篇文章主要給大家介紹了關(guān)于利用Android如何實(shí)現(xiàn)常見的驗(yàn)證碼輸入框的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • Android Jetpack 狠活Lifecycles與LiveData使用詳解

    Android Jetpack 狠活Lifecycles與LiveData使用詳解

    這篇文章主要為大家介紹了Android Jetpack 狠活Lifecycles與LiveData使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android開發(fā)之文件操作模式深入理解

    Android開發(fā)之文件操作模式深入理解

    本文將介紹Android開發(fā)之文件操作模式,需要了解的朋友可以參考下
    2012-12-12
  • Android實(shí)現(xiàn)滑動(dòng)側(cè)邊欄

    Android實(shí)現(xiàn)滑動(dòng)側(cè)邊欄

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)滑動(dòng)側(cè)邊欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android RecyclerView實(shí)現(xiàn)拼團(tuán)倒計(jì)時(shí)列表實(shí)例代碼

    Android RecyclerView實(shí)現(xiàn)拼團(tuán)倒計(jì)時(shí)列表實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Android RecyclerView實(shí)現(xiàn)拼團(tuán)倒計(jì)時(shí)列表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 深入分析安卓(Android)中的注解

    深入分析安卓(Android)中的注解

    注解是我們經(jīng)常接觸的技術(shù),Java有注解,Android也有注解,本文將試圖介紹Android中的注解,以及ButterKnife和Otto這些基于注解的庫(kù)的一些工作原理.下面一起來(lái)看看。
    2016-08-08
  • Android開發(fā)改變字體顏色方法

    Android開發(fā)改變字體顏色方法

    用以下方法基本上可以解決大多數(shù)字體顏色設(shè)置問題,先發(fā)一篇,后續(xù)繼續(xù)發(fā)一篇高級(jí)的,通過用戶選擇的方式,改變字體顏色。
    2015-05-05
  • Android實(shí)現(xiàn)用戶圓形頭像和模糊背景

    Android實(shí)現(xiàn)用戶圓形頭像和模糊背景

    這篇文章主要介紹了Android實(shí)現(xiàn)用戶圓形頭像和模糊背景 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論