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的主要内容,如果未能解决你的问题,请参考以下文章
如何从 php 为 Android 和 Ios 集成视频加密和解密?