2017-09-27 4 views
0

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.

+0

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

+0

@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. –

+0

@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

Antwort

0

Ich habe es vor 10 Minuten herausgefunden. Ich poste jetzt neuen Code und es funktioniert.

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!"; 
    } 
} 
} 

Ich verwendete JSONObject und legte Schlüssel/Wert-Paare von Benutzername und Passwort in es. Dann habe ich dieses JSONObject in JSONArray eingefügt (ich weiß, es ist nur ein JSONObject, und ich musste es nicht in JSONArray einfügen, aber da mein PHP-Code für JSONArray "entworfen" ist und ich nicht gut mit PHP bin, dachte ich es ist einfacher, JSONObject in JSONArray zu setzen, als PHP-Code zu ändern, die ich nicht verstehe sehr gut.

Zweite Änderung „Dataoutputstream“ statt „Output“ verwendet.

0

Zuerst müssen Sie die Fehlercodes verstehen. Normalerweise bedeuten Fehlercodes in den 400ern, dass Sie den Server irgendwie treffen, aber Sie sind auf den Zugriff auf Ressourcen beschränkt oder Sie haben einfach nur eine falsche Anfrage gestellt, indem Sie falsche Daten zur Verfügung gestellt haben. Und Fehler sind in den 500ern, das sind normalerweise schwerwiegende Fehler. Dies deutet darauf hin, dass ein Problem mit Ihrem Servercode vorliegt. Beachten Sie dies, da es wichtig zu verstehen ist. Wenn Sie auf einem lokalen Host testen, müssen Sie Ihre IP-Adresse für Ihren Server verfügbar machen, um Anfragen bearbeiten zu können. Andernfalls können Sie Ihren lokalen Host-Server nicht erreichen. Wenn Sie ein Newbie-Checkout-Tool wie Ngrok sind, werden Sie Ihre IP schneller verfügbar machen, so dass Sie die API fertig bekommen können. Goodluck Prost!

+0

In meiner App bekomme ich keinen Fehler, und mein "if block", der nur ausgeführt wird, wenn die Verbindung HTTP_OK ist, wird immer ausgeführt. Das heißt meine Verbindung ist gut, nehme ich an. – Mystiq