Ich muss Login/Register-Daten von Android-App zu Mysql-Datenbank auf localhost übergeben. Ich bin immer noch im Lernprozess und habe letzte Woche Probleme damit. Ich lese Dutzende von Seiten, Fragen & Antworten auf Stack Overflow und versuchte alles, aber ich kann es einfach nicht funktionieren. Können Sie mir bitte das Problem in meinem Code zeigen, ich bin immer noch Neuling in Bezug auf PHP und JSON.Android & PHP: POST-Daten von Android zu MySQL db mit PHP
Android, Aktivität & AsyncTask Klasse:
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();
}
}
}
Und mein 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();
?>
Es gibt eine Menge kommentierten Code, das ist alles, was ich versucht habe, und einige auch einen anderen Code, aber nichts funktioniert. Ich habe auch versucht, die gesamte Verbindung und den Rest in eine Methode zu setzen und diese Methode innerhalb der AsyncTask-Klasse aufzurufen, was ebenfalls fehlgeschlagen ist. Da ich PHP nicht kenne, bin ich nicht sicher, ob das Problem in meinem Android-Code oder PHP-Datei ist.
Vielen, vielen Dank im Voraus.
java.net.URLEncode gibt die Zeichenfolge als application/x-www-form-urlencoded Sie können die Eingabe php: // nicht mit der Codierung application/x-www-form verwenden, versuchen Sie stattdessen $ _POST, es sei denn, Sie müssen die Rohdaten wirklich lesen/x-www-form dann wird dein json_decode fehlschlagen Du könntest das ändern >>> für ($ i = 0; $ i <$ jsonCount; $ i ++) { $ item = $ jsonArray [$ i]; zu diesem >>> foreach ($ jsonArray als $ item) {aber da es nicht json ist, gibt es keine Notwendigkeit. Wenn Sie $ _POST verwenden, sollten $ _POST ['username'] und $ _POST ['password'] Ihre Variablen – miknik
@Mystiq enthalten. Wir müssen wissen, ob die App läuft oder nicht, welche Fehlercodes Sie sehen. wie das, was vor sich geht. wenn Sie Protokolle von Antworten drucken. –
@Tonny Baya as Sie können im Code sehen, ich habe einige System.out-Zeilen verwendet, und alle von ihnen drucken korrekt (ich meine, alle Variablen, die ich mit system.out gedruckt habe, sind korrekt). Meine Variablen enthalten Werte von Text bearbeiten. Meine Abfrage Zeichenfolge, die ich im Stream schreibe geht wie "username = user & password = pass" Und Sie können sehen, wenn Block wo, wenn HTTP-Verbindung ist OK, es druckt "Es ist in Ordnung!", Und wenn Verbindung nicht OK ist, druckt es "Fehlercode dort" ... dass, wenn der Block druckt "Es ist in Ordnung!", Was bedeutet, Verbindung ist http_ok – Mystiq