【php + MySQL + Android】Android端发送post请求访问服务器MySQL,对用户账号密码进行登录验证

前言

自己要做一个Android App,涉及到服务器端,以及Android客户端之间的交互,而网络上的的资源往往是只讲一个方面。所以自己每完成一段工作,会将开发过程记录下来,并供大家参考,相关文章放在专栏

【php + MySQL + Android】

如果你遇到了什么问题,或者有好的建议,欢迎在评论区留言,或者私信我,大家一起交流。

 😹作者也是小白,期待与你一起成长。

------------------------------------------------------------------------独学而无友, 则孤陋而寡闻  


服用须知 🚀🚀🚀

  • 本文中用到的Url链接你也可以用,如果你没有自己的服务器的话
  • 用来验证的账号密码:(这是作者数据库中的内容)

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YuH5pWiZGnniZvniZs=,size_20,color_FFFFFF,t_70,g_se,x_16​ 

 

  •  🚀🚀🚀遇到不懂的一定一定记得看专栏中前面的内容,这个项目是从零开始,连续记录的。没有的代码全在前面。
  •  🚀🚀🚀🚀🚀有任何问题都可以私信我。

目录

前言

功能描述:

预备知识(建议有看不懂的再回来点相应的链接进去学习)

 重难知识点整理:

Json

Toast

Http获取返回有延时

代码


 

 

功能描述:

  1. 手机上输入账号和密码
  2. 将账号和密码发送到服务器
  3. 服务器在MySql中查询输入的账号密码是否存在,并且给手机端返回如下结果:
字符串代表含义
"0"账号密码不在数据库中
"1"账号密码正确
"404"服务器端连接不到数据库

        4.手机端收到返回,根据返回的字符串进行不同的提示。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YuH5pWiZGnniZvniZs=,size_16,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YuH5pWiZGnniZvniZs=,size_16,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YuH5pWiZGnniZvniZs=,size_14,color_FFFFFF,t_70,g_se,x_16

预备知识(建议有看不懂的再回来点相应的链接进去学习)

  • POST常用设置
POST常用设置
方法描述
SetRequestMethod(String)设置连接方式
urlCon.setDoInput(true)设置输入是否允许
urlCon.setDoOutput(true)设置输出是否允许
setRequestProperty(String,String)配置请求属性

 

  • 关于Http的知识

【php + MySQL + Android】一个超简单的Http实践_勇敢di牛牛的博客-CSDN博客一个超简单的Android Http实践。https://blog.csdn.net/niuguobao/article/details/124307587?spm=1001.2014.3001.5502

  •  登录界面UI的代码

【php + MySQL + Android】Android登陆界面设计(1)_勇敢di牛牛的博客-CSDN博客做一个简单的登陆界面。https://blog.csdn.net/niuguobao/article/details/124299640?spm=1001.2014.3001.5502

  • 关于php的知识,以及对Mysql的操作 

【php + MySQL + Android】php对数据库进行操作(1)_勇敢di牛牛的博客-CSDN博客php语言对数据库进行操作。https://blog.csdn.net/niuguobao/article/details/124248858?spm=1001.2014.3001.5502

 重难知识点整理:

  • Json

  • 🚀Json是什么?

答:JavaScript Object Natation, 一种轻量级的数据交换格式, 与XML一样, 
广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性

  • 🚀Android中创建json并且添加内容:
JSONObject json = new JSONObject();
json.put("username",username);
json.put("password",password);
  • 🚀服务器中收到的json字符串
{ "username":"yongganniuniu","password":"123456" }
  • 🚀🚀🚀服务器的php文件对收到json解析(重点中的重点)
  
$res = file_get_contents("php://input");//接受参数post
$josn = json_decode($res, true); //解析
$password = $josn["password"]; //提取账号密码
$username = $josn["username"];
  • Toast

  •  🚀Tost实现:
Toast toast = Toast.makeText(MainActivity.this, tip,Toast.LENGTH_SHORT);
 toast.show(); //只有调用了show方法才会显示
  •  Toast.makeText()各个参数都是干嘛的

Toast:是一个类,主要管理消息的提示。
makeText(),是Toast的一个方法,用来显示信息,分别有三个参数。
🚒第一个参数:是上下文参数,指当前页面显示
🚒第二个参数:是你想要显示的内容。
🚒第三个参数:Toast.LENGTH_LONG是你指你提示消息,显示的时间,这个是稍微长点
                             对应的另一个是ToastLENGTH_SHORT,这个时间短点儿,大概2秒钟。

  • Http获取返回有延时

 执行post请求需要时间,我们的执行是异步多线程,不能在发送post请求后立马做出判断,要等消息返回在执行相关操作。

Android代码

package com.example.testapp;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends Activity {
    Button btn_login;
    Button btn_register;
    EditText edt_user;
    EditText edt_password;
    //private Handler handler;
    private String res;
    private static final int SUCCESS = 0;
    private static final int FAILURE = 1; //
    private String password= "";
    private String username ="";
    String stringUrl = "http://nnggb.com/test/test.php";
    private Handler mHander = new Handler(Looper.getMainLooper()) {
        @SuppressLint("SetTextI18n")
        public void handleMessage(Message msg) {
            switch(msg.what){
                case SUCCESS:
                    ShowLoginToast(); //提示账号密码是否正确以及服务器是否出现问题
                    break;
                case FAILURE:
                    Toast toast = Toast.makeText(MainActivity.this,"请求失败,请检查网络",Toast.LENGTH_SHORT);
                    toast.show();
                    break;
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_login = findViewById(R.id.bt_login);
        btn_register = findViewById(R.id.bt_register);
        edt_user = findViewById(R.id.edt_user);
        edt_password =findViewById(R.id.edt_password);
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                username = String.valueOf(edt_user.getText()); //获取文本框内容
                password = String.valueOf(edt_password.getText());
                GetURLResByPost();
                //ShowLoginToast(); //千万不能写在这里,这里网络请求还没回来,res是空的
            }
        });
    }
    public void GetURLResByPost(){
        new Thread(new Runnable(){
            public void run(){

                try {
                    JSONObject json = new JSONObject();
                    json.put("username",username);
                    json.put("password",password);
                    Log.i("勇敢id牛牛", String.valueOf(json));
                    URL myurl = new URL(stringUrl);
                    HttpURLConnection urlCon = (HttpURLConnection)myurl.openConnection();
                    urlCon.setConnectTimeout(3000);
                    urlCon.setDoInput(true); //设置允许输入
                    urlCon.setDoOutput(true);//设置输出允许
                    urlCon.setRequestMethod("POST");
                    OutputStreamWriter out = new OutputStreamWriter(urlCon.getOutputStream());
                    //DataOutputStream out = new DataOutputStream(urlCon.getOutputStream());
                    out.write(json.toString());
                    out.flush();
                    out.close();
                    if(urlCon.getResponseCode() == 200){
                        InputStreamReader in = new InputStreamReader(urlCon.getInputStream());
                        BufferedReader buffer = new BufferedReader(in);
//                        String inputLine = null;
//                        StringBuffer pageBuffer = new StringBuffer();
//                        while((inputLine = buffer.readLine()) != null){
//                            pageBuffer.append(inputLine +"\n");
//                        } //上面的写法是接受的数据有多行,我这里只有一个数字。用着个方法会多一个空格。
                        //res = String.valueOf(buffer.read()); //这种写法是错误的
                        res = buffer.readLine();  //只读取第一行
                        mHander.sendEmptyMessage(0);
                        in.close();
                        buffer.close();
                        urlCon.disconnect();
                    }else{
                        mHander.sendEmptyMessage(1);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    mHander.sendEmptyMessage(1);
                } catch (IOException e) {
                    mHander.sendEmptyMessage(1);
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public void ShowLoginToast(){
        String tip = "";
        if (res.equals("0")){ //查询的密码不正确
            tip = "账号或密码不正确";
        }else if(res.equals("1")){
            tip = "登录成功 ";
        }else if(res.equals("404")){
            tip = "服务器端配置错误";
        }
        if (!tip.equals("")){
            Toast toast = Toast.makeText(MainActivity.this, tip,Toast.LENGTH_SHORT);
            toast.show();
        }
    }

}

PHP代码

<?php
header('content-type:text/html;charset=utf-8');
define('servername','localhost');//主机名
define('username', 'ngbtest');//连接数据库的用户名
define('password','174927');//连接数据库密码
define('dbname', 'ngbtest');//数据库名称


//echo "<br>" .username ."<br>". password ."<br>" .dbname ;
// 创建连接
extract($_POST);

$res = file_get_contents("php://input");
$josn = json_decode($res, true);
$password = $josn["password"];
$username = $josn["username"];
$conn = new mysqli(servername, username, password, dbname);
// 检测连接
if ($conn->connect_error) {
    echo "404";
    //die("连接失败: " . $conn->connect_error);
}
$sql="SELECT `username`  FROM `test` WHERE  `username`= '$username' AND `email` = '$password' ";
$res =  $conn->query($sql);

if ($res->num_rows > 0) {
    // 输出数据
    //$row= mysqli_fetch_assoc($res); 
	echo "1";
}else{
    echo "0";
    //$_SESSION['username'] = "xxx";
}

?>

 


🚀看完了还有疑问请私信我,或者评论区留言。

🚀发现错误或者有建议,请评论区留言或私信。

 

  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢di牛牛

你必飞黄腾达,耶稣也拦不住。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值