von mySQL Datenbank -> PHP -> App (App stürtz ab)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • von mySQL Datenbank -> PHP -> App (App stürtz ab)

    hallo an alle die dies lesen, ich bin gerade an einem Projekt um ein paar Daten in einer App graphisch und als Text darzustellen, nicht mehr und nicht weniger. Angefangen habe ich es erstmal mit einer Variable aus meiner Datenbank von dem Anbieter www.000webhost.comversucht. Aus Tutorials hab ich versucht mal zuerst eine PHP Datei zu schreiben( die ich unten nochmals einpflegen werde) die auf dem gleichen Server liegt. Das PHP Skript funktioniert soweit hab’s schon mal ohne App getestet. Die App ruft auf Button druck eine separate classe auf die die Informationen über die PHP Datei bekommt und in ein TextView ausgibt(sollte ich später noch ändern). Doch beim drücken des Button stürzt die App ab und ich hab leider keinen Schimmer wieso.
    schonmal vielen Dank für eure hilfe.

    PHP-Quellcode: PHP Datei

    1. <?php
    2. $reportingLevel = -1; //0 für alle PHP Fehler und Warungen ausblenden, -1 für alle anzeigen
    3. error_reporting($reportingLevel);
    4. //Sicherheitsabfrage ob der Authentifizierungscode mit übergeben wurde.
    5. //Wenn der Code nicht übergeben wurde wird die gesamte Prozedure abgebrochen.
    6. checkAuthCode();
    7. //Datenbankverbindung aufbauen
    8. $connection = getDBConnection();
    9. function getDBConnection(){
    10. $db_name = "dbname";
    11. $mysql_username = "dbusername";
    12. $mysql_password = "Password";
    13. $server_name = "localhost";
    14. $fehler1 = "Fehler 1: Fehler beim aufbauen der Datenbankverbindung!";
    15. $link = mysqli_connect($server_name, $mysql_username, $mysql_password, $db_name );
    16. if($link)
    17. {
    18. //echo "connection success";
    19. }
    20. else{
    21. //echo "connection not succsess";
    22. }
    23. if (!$link) {
    24. die('Verbindung schlug fehl: ' . mysqli_error());
    25. }
    26. /* check connection */
    27. if (mysqli_connect_errno()) {
    28. die($fehler1);
    29. }
    30. return $link;
    31. }
    32. //getAllEntrys($connection);
    33. $method = $_POST['method'];
    34. echo $method;
    35. if ($method == 'allEntrys'){
    36. getAllEntrys($connection);
    37. }
    38. //Lesen der Daten aus der MySQL Datenbank mit PHP
    39. function getAllEntrys($connection){
    40. $sqlStmt = "SELECT * FROM teat1;";
    41. $result = mysqli_query($connection,$sqlStmt);
    42. $data = array();
    43. if ($result = $connection->query($sqlStmt)) {
    44. while ($row = $result->fetch_assoc()) {
    45. $testwert = $row["testwert"];
    46. array_push($data,array("testwert"=> $testwert));
    47. }
    48. $result->free();
    49. }
    50. closeConnection($connection);
    51. foreach ($data as $d){
    52. echo $d["testwert"];
    53. echo "|";
    54. }
    55. }
    56. function checkAuthCode(){
    57. $fehler0 = "Fehler 0: Keine erfolgreiche Authentifizierung!";
    58. if (isset($_POST['authkey']) AND isset($_POST['method'])){
    59. $authkey = $_POST['authkey'];
    60. if ($authkey != 'key'){
    61. die($authkey);
    62. }
    63. } else {
    64. die(var_dump($_POST));
    65. }
    66. }
    67. function closeConnection($connection){
    68. mysqli_close($connection);
    69. }
    70. ?>
    Alles anzeigen

    Java-Quellcode: Classe zum lesen der Daten aus mySQL

    1. package ActivityDataSource_Pack;
    2. import android.os.AsyncTask;
    3. import android.util.Log;
    4. import android.widget.TextView;
    5. import java.io.BufferedReader;
    6. import java.io.IOException;
    7. import java.io.InputStreamReader;
    8. import java.io.OutputStreamWriter;
    9. import java.net.URL;
    10. import java.net.URLConnection;
    11. import java.net.URLEncoder;
    12. /**
    13. * Created by Agando on 21.12.2017.
    14. */
    15. public class ActivityDataSource extends AsyncTask<String, Void, String> {
    16. public static final String AUTHKEY = "key";
    17. public static final String POST_PARAM_KEYVALUE_SEPARATOR = "=";
    18. public static final String POST_PARAM_SEPARATOR = "&";
    19. private static final String DESTINATION_METHOD = "allEntrys";
    20. private TextView textView;
    21. private URLConnection conn;
    22. public ActivityDataSource(TextView textView) {
    23. this.textView = textView;
    24. }
    25. @Override
    26. protected String doInBackground(String... params) {
    27. try {
    28. openConnection();
    29. return readResult();
    30. } catch (IOException e) {
    31. e.printStackTrace();
    32. }
    33. return null;
    34. }
    35. /**
    36. * Öffnet eine Verbindung {@link URLConnection}.
    37. * @throws IOException
    38. */
    39. private void openConnection() throws IOException{
    40. //StringBuffer für das zusammensetzen der URL
    41. StringBuilder dataBuffer = new StringBuilder();
    42. dataBuffer.append(URLEncoder.encode("authkey", "UTF-8"));
    43. dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);
    44. dataBuffer.append(URLEncoder.encode(AUTHKEY, "UTF-8"));
    45. dataBuffer.append(POST_PARAM_SEPARATOR);
    46. dataBuffer.append(URLEncoder.encode("method", "UTF-8"));
    47. dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);
    48. dataBuffer.append(URLEncoder.encode(DESTINATION_METHOD, "UTF-8"));
    49. //Adresse der PHP Schnittstelle für die Verbindung zur MySQL Datenbank
    50. URL url = new URL("https://Name.000webhostapp.com/conny2.0.php");
    51. conn = url.openConnection();
    52. conn.setDoOutput(true);
    53. OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    54. wr.write(dataBuffer.toString());
    55. wr.flush();
    56. }
    57. /**
    58. * Ließt das Ergebnis aus der geöffneten Verbindung.
    59. * @return liefert ein String mit dem gelesenen Werten.
    60. * @throws IOException
    61. */
    62. private String readResult()throws IOException{
    63. String result = null;
    64. //Lesen der Rückgabewerte vom Server
    65. BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    66. StringBuilder sb = new StringBuilder();
    67. String line = null;
    68. //Solange Daten bereitstehen werden diese gelesen.
    69. while ((line = reader.readLine()) != null) {
    70. sb.append(line);
    71. }
    72. return sb.toString();
    73. }
    74. @Override
    75. protected void onPostExecute(String result) {
    76. if(!isBlank(result)) {
    77. this.textView.setText(result);
    78. }
    79. }
    80. private boolean isBlank(String value){
    81. return value == null || value.trim().isEmpty();
    82. }
    83. }
    Alles anzeigen
  • Hallo, wo in welcher Methode stürzt es ab? gibt es keine Fehlermeldung dazu.
    " URL url = new URL("https://Name.000webhostapp.com/conny2.0.php") " ist die Url Richtig denn im Borwser bekomme ich da Fehler.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • erstmal danke für die schnelle Antwort. Habs gerade getestet leider das selbe Problem.
    Bei was ich mir auch noch nicht sicher bin ist der Aufruf der classe, vieleicht hab ich da einen Fehler Gemacht.

    Java-Quellcode: Aufruf in der MainActivity

    1. Button lesenBtn = (Button) findViewById(R.id.button2);
    2. lesenBtn.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. new ActivityDataSource(textView).execute("Entrys");
    6. Log.d("String", "onClick: ");// nur zum prüfen der Button Funktion
    7. }
    8. });
  • einen Thread startet man mit .start() mit execute(...) sollte es auch gehen.
    Aber du hast den Konstruktor der Kasse überladen und nutzt somit nicht den auto generierten Konstruktor, da müsstest du die super Kalsse auch aufrufen.

    public ActivityDataSource(TextView textView) {
    super();
    this.textView = textView;
    }
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • okay ich hab an der Stelle das super(); eingefügt leider immer noch das selbe Problem. Vieleicht hilft das bei der Problemlösung ich hab den code wie unten auskommentiert, danach stürtze es nicht ab natürlich lief es auch nicht.

    Java-Quellcode: auskommentierter code

    1. protected String doInBackground(String... params) {
    2. /*
    3. try {
    4. openConnection();
    5. // return "testwert";
    6. return readResult();
    7. } catch (IOException e) {
    8. e.printStackTrace();
    9. }
    10. */
    11. return null;
    12. }
    Alles anzeigen
  • So jetzt wird in der doInBackground garnichts mehr ausgeführ. Damit weißt du auch das der Fehler bei deiner URL Connection liegt.
    Hier ein Beispiel für den aufbau der Conektion. Habe den Task als innere Klasse erstellt ist aber bei externner das gleiche.


    Java-Quellcode

    1. package de.joerg.myapplication;
    2. import android.os.AsyncTask;
    3. import android.os.Bundle;
    4. import android.support.v7.app.AppCompatActivity;
    5. import android.widget.ImageView;
    6. import android.widget.TextView;
    7. import java.io.BufferedInputStream;
    8. import java.io.ByteArrayOutputStream;
    9. import java.io.IOException;
    10. import java.io.InputStream;
    11. import java.net.HttpURLConnection;
    12. import java.net.URL;
    13. import java.util.concurrent.ExecutionException;
    14. public class MainActivity extends AppCompatActivity {
    15. private static final String TAG = MainActivity.class.getSimpleName();
    16. ImageView downloadImg;
    17. String exampleUrl ="https://thomassch91.000webhostapp.com/conny2.0.php" ;
    18. @Override
    19. protected void onCreate(Bundle savedInstanceState) {
    20. super.onCreate(savedInstanceState);
    21. setContentView(R.layout.main);
    22. String result ="";
    23. ImageDownloader task = new ImageDownloader();
    24. try {
    25. result= task.execute(exampleUrl).get();
    26. } catch (InterruptedException e) {
    27. e.printStackTrace();
    28. } catch (ExecutionException e) {
    29. e.printStackTrace();
    30. }
    31. updateOutput(result);
    32. }
    33. private void updateOutput(String text) {
    34. TextView mainTextView = (TextView) findViewById(R.id.mainTextView);
    35. mainTextView.setText(mainTextView.getText() + "\n\n" + text);
    36. }
    37. public class ImageDownloader extends AsyncTask<String, Void, String> {
    38. @Override
    39. protected String doInBackground(String... urls) {
    40. String result = "";
    41. HttpURLConnection urlConnection = null;
    42. try {
    43. // URL requestedUrl = new URL(exampleUrl);
    44. URL requestedUrl = new URL(urls[0]);
    45. urlConnection = (HttpURLConnection) requestedUrl.openConnection();
    46. urlConnection.setRequestMethod("GET");
    47. urlConnection.setConnectTimeout(1500);
    48. urlConnection.setReadTimeout(1500);
    49. int responseCode = urlConnection.getResponseCode();
    50. result = readFully(urlConnection.getInputStream());
    51. } catch (Exception ex) {
    52. result = ex.toString();
    53. } finally {
    54. if (urlConnection != null) {
    55. urlConnection.disconnect();
    56. }
    57. }
    58. return result;
    59. }
    60. public String readFully(InputStream inputStream) throws IOException {
    61. if(inputStream == null) {
    62. return "";
    63. }
    64. BufferedInputStream bufferedInputStream = null;
    65. ByteArrayOutputStream byteArrayOutputStream = null;
    66. try {
    67. bufferedInputStream = new BufferedInputStream(inputStream);
    68. byteArrayOutputStream = new ByteArrayOutputStream();
    69. final byte[] buffer = new byte[1024];
    70. int available = 0;
    71. while ((available = bufferedInputStream.read(buffer)) >= 0) {
    72. byteArrayOutputStream.write(buffer, 0, available);
    73. }
    74. return byteArrayOutputStream.toString();
    75. } finally {
    76. if(bufferedInputStream != null) {
    77. bufferedInputStream.close();
    78. }
    79. }
    80. }
    81. }
    82. }
    Alles anzeigen
    main.xml

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="fill_parent"
    4. android:layout_height="fill_parent"
    5. android:background="@android:drawable/screen_background_light">
    6. <ScrollView
    7. android:id="@+id/mainTextScroller"
    8. android:layout_width="fill_parent"
    9. android:layout_height="fill_parent"
    10. android:fillViewport="true"
    11. android:scrollbarAlwaysDrawVerticalTrack="true"
    12. android:scrollbars="vertical">
    13. <TextView
    14. android:id="@+id/mainTextView"
    15. android:layout_width="fill_parent"
    16. android:layout_height="fill_parent"
    17. android:layout_weight="1.0"
    18. android:background="@android:drawable/editbox_background"
    19. android:text=""
    20. android:textColor="#000"
    21. android:textSize="10dp" />
    22. </ScrollView>
    23. </LinearLayout>
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • dieses mal stürtzte es nicht ab, das ist schon mal gut nur bekomme ich als result :
    "Permission denied (missing INTERNET permission?)"
    ich habe aber
    <uses-permission android:name="android.permission.INTERNET" />und <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />schon im AndroidManifest reingeschrieben. Mit dem Emulierten Smartphone komme ich normalerweise ins Internet.
  • Habe es doch nun schon öffters geschrieben das sich die Premission ab API 23 geändert haben, und es nicht mehr reicht nur die Premission in der Manifest Datei zu setzen.
    developer.android.com/guide/to…ssion-sdk-23-element.html
    androidhive.info/2016/11/andro…ow-m-runtime-permissions/

    setze zum test die SDK Version auf 22 "compileSdkVersion 22"

    Quellcode: build.gradle (app)

    1. apply plugin: 'com.android.application'
    2. android {
    3. compileSdkVersion 22
    4. buildToolsVersion '26.0.2'
    5. defaultConfig {
    6. minSdkVersion 22
    7. targetSdkVersion 22
    8. versionCode 1
    9. versionName "1.0"
    10. }
    11. buildTypes {
    12. release {
    13. minifyEnabled false
    14. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    15. }
    16. }
    17. sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/2'] } }
    18. }
    19. dependencies {
    20. compile fileTree(dir: 'libs', include: ['*.jar'])
    21. testCompile 'junit:junit:4.12'
    22. compile 'com.android.support:appcompat-v7:22.2.+'
    23. compile 'com.android.support:design:22.2.+'
    24. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • wieso soll eine google lösung nicht elegant sein?
    Dies bezieht sich auf das Thema Premisson und nicht allgemein.
    Googgel hätte es auch dem Programmierer einfacher machen können. Android weiss welche Premission im Manifest gesetzt sind wenn diese nun in der App gebraucht werden kann es doch selber um erlaubnis fragen. Bei nein vom User wird eine Exception geworfen. So etwas wäre elegant.
    Ein Feedback auf Tipps ist auch schön. :P