【发布时间】: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,但也没有运气。
标签: php android mysql android-asynctask httpurlconnection