Android & PHP:使用 PHP 将数据从 Android POST 到 mysql db

Posted

技术标签:

【中文标题】Android & PHP:使用 PHP 将数据从 Android POST 到 mysql db【英文标题】:Android & PHP: POST-ing data from Android to mysql db using PHP 【发布时间】:2018-03-09 13:47:33 【问题描述】:

我需要将登录/注册数据从 android 应用程序传递到本地主机上的 mysql 数据库。我仍在学习过程中,上周有这个问题。我在 Stack Overflow 上阅读了几十页、问题和答案,并尝试了所有方法,但我就是无法让它发挥作用。你能指出我代码中的问题吗,我还是php和JSON的新手。

Android、Activity 和 AsyncTask 类:

package com.example.mario.datadrivenassignmenttwo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class DbManager extends Activity 

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


public void register(View v) 
    EditText uname = (EditText) findViewById(R.id.username);
    EditText pw = (EditText) findViewById(R.id.password);

    String username = uname.getText().toString();
    System.out.println("username is: " + username);
    String password = pw.getText().toString();
    System.out.println("password is: " + password);

    Uploader task = new Uploader();
    task.execute(new String[]  "http://10.0.2.2/user_db/senddata.php", username, password );


public class Uploader extends AsyncTask<String, Void, String> 

    @Override
    protected String doInBackground(String... params) 

        /* 
        String response = "Finished";
        try 
            postHttpContent(params[0],params[1],params[2]);
         catch (IOException e) 
            Log.e("error", e.toString());
        
        return response;
        */

        try 
            String urlParam = params[0];
            String username = params[1];
            String password = params[2];
            String charset = java.nio.charset.StandardCharsets.UTF_8.name();

            String query = String.format("username=%s&password=%s", URLEncoder.encode(username, charset), URLEncoder.encode(password, charset));

            /*
            URLConnection conn = new URL(urlParam).openConnection();
            conn.setDoOutput(true);
            conn.setRequestProperty("Accept-Charset", charset);
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);

            OutputStream output = conn.getOutputStream();
            output.write(query.getBytes(charset));
            output.flush();
            output.close();
            */

            URL url = new URL(urlParam);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
            writer.write(query);
            writer.close();
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) 

                System.out.println("It's ok!");
                System.out.println(query);

             else 

                System.out.println("Error code there");

            

         catch (UnsupportedEncodingException e) 
            e.printStackTrace();
         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        

        return "Finished";
    

    @Override
    protected void onPostExecute(String result) 
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
    



还有我的 PHP:

<?php
// connect to database
$hostname = "localhost";
$username = "root";
$password = "root";
$dbname = "user_db";


$link = new mysqli($hostname, $username, $password, $dbname);

// get the JSONArray the app sends
$contents = file_get_contents('php://input');

$jsonArray = json_decode($contents, true);
$jsonCount = count($jsonArray);

for ($i = 0; $i < $jsonCount; $i++) 
$item = $jsonArray[$i];
$itemUsername = utf8_decode($item['username']);
$itemPassword = utf8_decode($item['password']);
// parse the other json attributes here like the one above

$sql = "INSERT INTO users (username, password) VALUES ('$itemUsername', '$itemPassword')";

if ($link->query($sql) === TRUE) 
    echo "New record created successfully";
 else 
    echo "Error: " . $sql . "<br>" . $link->error;



$link->close();
?>

有很多注释代码,这就是我尝试过的所有代码,还有一些其他代码,但没有任何效果。我还尝试将所有连接和休息放入一个方法中并在 AsyncTask 类中调用该方法,但也失败了。 由于我不懂 PHP,我不确定问题出在我的 Android 代码还是 PHP 文件中。

提前非常感谢。

【问题讨论】:

java.net.URLEncode 将您的字符串返回为 application/x-www-form-urlencoded。您不能将 php://input 与 application/x-www-form 编码一起使用,请尝试 $_POST ,除非您确实需要读取原始数据。由于其编码为 application/x-www-form 那么你的 json_decode 将失败。你可以改变这个>>> for ($i = 0; $i >> foreach ($jsonArray as $item) 但由于它不是 json ,所以没有必要。如果你使用 $_POST 那么 $_POST['username'] 和 $_POST['password'] 应该包含你的变量 @Mystiq。即使应用程序正在运行,我们也需要知道您看到的错误代码。就像发生了什么。如果您正在打印响应日志。 @Tonny Baya 如您在代码中所见,我使用了很少的 system.out 行,并且所有行都正确打印(我的意思是,我使用 system.out 打印的所有变量都是正确的)。我的变量包含来自编辑文本的值。我在流中写入的查询字符串类似于“username=user&password=pass”并且您可以看到如果阻塞在哪里,如果 http 连接正常,它会打印“没关系!”,如果连接不正常,它会打印“错误那里的代码”...如果块打印“没关系!”,表示连接是 http_ok​​ @miknik 我也尝试了 $_POST,但也没有运气。 【参考方案1】:

首先您需要了解错误代码。通常 400 中的错误代码意味着您以某种方式访问​​了服务器,但您被限制访问资源,或者只是您通过提供错误数据提出了错误的请求。并且错误在 500 年代,这些通常是严重错误。这表明您的服务器代码存在问题。尽管请注意这一点,因为理解这一点很重要。在本地主机上进行测试时,您需要为您的服务器公开您的 IP 以处理请求,否则您将无法访问您的本地主机服务器。如果您是 Ngrok 之类的新手结帐工具,它将帮助您更快地公开您的 IP,以便您可以完成 API。祝你好运干杯!

【讨论】:

在我的应用程序中我没有收到任何错误,并且我的“if 块”只有在连接为 HTTP_OK 时才会执行,该块每次都会执行。这意味着我的连接很好,我想。【参考方案2】:

我在 10 分钟前想通了。我现在正在发布新代码,它可以工作。

package com.example.korisnik.test;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class DbManager extends Activity 

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


public void register(View v) 
    EditText uname = (EditText) findViewById(R.id.username);
    EditText pw = (EditText) findViewById(R.id.password);

    String username = uname.getText().toString();
    String password = pw.getText().toString();
    System.out.println("Username is: " + username + " ,and password is: " + password);

    Uploader task = new Uploader();
    task.execute(new String[]  "http://10.0.2.2/user_db/senddata.php", username, password );


public class Uploader extends AsyncTask<String, Void, String> 

    @Override
    protected String doInBackground(String... params) 

        String response = null;
        try 
            response += postHttpContent(params[0],params[1],params[2]);
         catch (IOException e) 
            System.out.println("IO Error");
            Log.e("error", e.toString());
         catch (JSONException e) 
            System.out.println("JSON Error");
            e.printStackTrace();
        
        return response;
    

    @Override
    protected void onPostExecute(String result) 
        System.out.println(result);
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
    

    public String postHttpContent(String urlStr, String user, String pass) throws IOException, JSONException 
        String response = "";
        URL url = new URL(urlStr);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setDoOutput(true);
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        httpConn.setRequestMethod("POST");

        JSONObject userdata = new JSONObject();
        userdata.put("username",user);
        userdata.put("password", pass);

        JSONArray data = new JSONArray();
        data.put(userdata);
        System.out.println("Array is: " + data);

        try 
            DataOutputStream localDataOutputStream = new DataOutputStream(httpConn.getOutputStream());
            localDataOutputStream.writeBytes(data.toString());
            localDataOutputStream.flush();
            localDataOutputStream.close();
            System.out.println("Data writting: " + data);
         catch (IOException e) 
            e.printStackTrace();
            System.out.println("Data Output error");
        

        int responseCode = httpConn.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) 
            String line;
            BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
            do 
                line = br.readLine();
                response += line;
             while ((line = br.readLine()) != null);
         else 
            response = "Error ";
            throw new IOException();
        
        return response + " * Uploaded!";
    


我使用 JSONObject 并将用户名和密码的键/值对放入其中。比我把那个 JSONObject 放在 JSONArray 中(我知道它只是一个 JSONObject,我不必把它放在 JSONArray 中,但是因为我的 PHP 代码是为 JSONArray “设计”的,而且我不擅长 PHP,我想将 JSONObject 放入 JSONArray 比更改我不太了解的 PHP 代码更容易。

第二个变化是使用“DataOutputStream”而不是“OutputStreamWriter”。

【讨论】:

以上是关于Android & PHP:使用 PHP 将数据从 Android POST 到 mysql db的主要内容,如果未能解决你的问题,请参考以下文章

Android、PHP和node.js之间的加解密

如何从 php 为 Android 和 Ios 集成视频加密和解密?

php7 AES IOS Android

在 Android/phpMyAdmin 中插入数据库时​​出错

使用多个 & php 上传文件

使用 php 在 android 中使用 websocket 实现聊天