【问题标题】:my php code to connect with database for android我的 php 代码连接到 android 的数据库
【发布时间】:2019-03-17 22:36:37
【问题描述】:

我试图将我的 android 应用程序与我用于网站的数据库连接起来,但不知何故它不想连接

这是我用于连接的 java 代码

我添加了 Android 清单

 <uses-permission android:name="android.permission.INTERNET"></uses- 
  permission>

background.java


package com.example.myapplication;

import android.app.AlertDialog;
import android.content.Context;
import  android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class backgroundworker extends AsyncTask<String,Void, String> {
Context context;
AlertDialog alertDialog;
backgroundworker(Context ctx){
    context =ctx;
}

@Override
protected String doInBackground(String... params) {
    String type = params[0];
    String login_url = "http://10.0.2.2//android/login.php";
    if (type.equals("login")){
        try {
            String Email = params[1];
            String Password = params[2];
            URL url = new URL(login_url);
            HttpURLConnection httpURLConnection = 
   (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new 
     OutputStreamWriter(outputStream, "UTF-8"));
            String post_data = URLEncoder.encode("Email","UTF- 
     8")+"="+URLEncoder.encode(Email,"UTF-8")+"&"
                    + URLEncoder.encode("Password","UTF- 
     8")+"="+URLEncoder.encode(Password,"UTF-8");
            bufferedWriter.write(post_data);
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new 
      InputStreamReader(inputStream,"iso-8859-1"));
            String result="";
            String line="";
            while((line = bufferedReader.readLine())!=null){
                result += line;
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return result;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    return null;
  }

   @Override
   protected void onPreExecute() {
    alertDialog = new AlertDialog.Builder(context).create();
    alertDialog.setTitle("Login Status");

   }

  @Override
  protected void onPostExecute(String result) {
    alertDialog.setMessage(result);
    alertDialog.show();
  }

  @Override
   protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
     }
   }

login.java


package com.example.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class login extends AppCompatActivity implements View.OnClickListener 
{

Button liButton;
EditText liEmail, liPassword;
TextView liSignup;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    liEmail = (EditText) findViewById(R.id.liEmail);
    liPassword = (EditText) findViewById(R.id.liPassword);
    liButton =(Button) findViewById(R.id.liButton);
    liSignup= (TextView) findViewById(R.id.liSignup);

    liButton.setOnClickListener(this);
    liSignup.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.liButton:
            String Email = liEmail.getText().toString();
            String Password = liPassword.getText().toString();
            String type = "login";
            BackgroundWorker backgroundworker = new BackgroundWorker(this);
            backgroundworker.execute(type, Email, Password);

            break;

        case R.id.liSignup:
            startActivity(new Intent(this, signup.class));
            break;
    }

}
}

这是我的php代码


 <?php

 $conn = mysqli_connect('127.0.0.1','root','','signup');


 ?>

<?php

include('conn.php');

if(!session_id())

session_start();



   if (isset($_POST['Email'])
   and isset($_POST['Password'])
   and !empty($_POST['Email'])
   and !empty($_POST['Password'])){

     $Email = $_POST['Email'];
     $Password= $_POST['Password'];

     $getinfo = "SELECT * FROM users WHERE Email ='$Email' LIMIT 1";
     $res = mysqli_query($conn,$getinfo);
     $row = mysqli_fetch_assoc($res);


     if (mysqli_num_rows($res)>0) {

       $dbPassword = $row['Password'];
       $Password = PASSWORD_VERIFY($Password, $dbPassword);

       if ($Email == $row ['Email'] and $Password == $dbPassword) {

         $id = $row['id'];
         $_SESSION['id'] = $id;

         exit();

       } else{
         echo 'Wrong Email or Password.';
       }


     } else{
      echo 'Wrong Email or Password.';
     }

   }
   ?>

我相信我的 java 代码是正确的,但我不确定如果我的 php 出现问题该怎么办

【问题讨论】:

  • 这个and $Password == $dbPassword 是错误的。你已经password_verified,返回的是一个布尔值,所以应该是and $Password。最好将password_verify() 的返回值重命名为$passwordVerified 之类的东西,以减少混淆...而且您不需要重新检查是否为$Email == $row ['Email'],因为您已经查询过了。
  • 旁注:您对 sql-injection 持开放态度(因为您在查询中直接使用 use-input)!使用准备好的语句!
  • 你也应该在成功时返回一些有意义的东西(也许是一个带有 authtoken 的 json {"success":true} 以重新连接?),并且最好在失败时更改 http 状态标头
  • 好吧,我迷路了,因为我对此很陌生,所以我应该删除 ==$dbpassword 并将 password_verify 中的 $password 更改为 $passwordVerified 并删除 ==$row['Email] ..我不知道作为我的第一个 android 项目,我应该如何处理最后一条评论
  • 关于最后一条评论:google "Sql injection" 并阅读并使用prepared statements!

标签: java php android mysql database


【解决方案1】:

这一行

if ($Email == $row ['Email'] and $Password == $dbPassword) {

是错误的/问题。您已经 password_verified,它返回一个布尔值,所以它应该是。

if ($Email == $row ['Email'] and $Password) {

并且您不需要重新检查 $Email == $row ['Email'],因为您已经查询过了。

因此您可以将代码简化为:

if (mysqli_num_rows($res)>0) {
   $dbPassword = $row['Password'];

   if (PASSWORD_VERIFY($Password, $dbPassword)) {
     $id = $row['id'];
     $_SESSION['id'] = $id;
     exit();

   } else {
   //...

【讨论】:

  • 仍然不会显示回声,这意味着它没有连接
  • "wont show echo"登录成功时不显示任何内容,只显示"Wrong Email or Password." on失败。
  • 它不会显示错误的电子邮件或密码的回显它只显示登录状态
  • 它不会从 php 中回显任何错误密码或电子邮件它只显示来自 android 代码的登录状态
  • 睡了个好觉后,我发现android代码中的问题非常感谢您的帮助和sql注入说明
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多