代码之家  ›  专栏  ›  技术社区  ›  Dimness

Android和PHP:使用PHP将数据从Android发布到mysql数据库

  •  0
  • Dimness  · 技术社区  · 7 年前

    我需要将登录/注册数据从Android应用程序传递到localhost上的mysql数据库。我仍在学习过程中,上周对此有问题。我读了几十页,问题和;回答堆栈溢出问题,并尝试了所有操作,但我就是无法使其工作。你能告诉我代码中的问题吗,我对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
    // 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();
    ?>
    

    因为我不懂PHP,所以我不确定问题是在我的Android代码还是PHP文件中。

    2 回复  |  直到 7 年前
        1
  •  0
  •   CodeDaily    7 年前

    首先,您需要了解错误代码。通常情况下,400中的错误代码意味着您以某种方式访问了服务器,但您只能访问资源,或者只是因为提供了错误的数据而发出了错误的请求。错误发生在500年代,通常是严重的错误。这表明您的服务器代码有问题。尽管要注意这一点,因为了解这一点很重要。在本地主机上测试时,您需要公开您的IP,以便您的服务器能够处理请求,否则您将无法访问您的本地主机服务器。如果你是一个像Ngrok这样的新手,签出工具将帮助你更快地公开你的IP,这样你就可以完成API。祝你好运干杯!

        2
  •  0
  •   Dimness    7 年前

    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”。