Android-MySQL Login Connection Error

  • Antworten:25
Bastian Seidemann
  • Forum-Beiträge: 137

27.08.2013, 14:24:28 via Website

Hi Leute,

ich bin kurz vorm verzweifeln.

Ich versuche meine Android App für einen einfachen login via PHP Script auf meine MySQL Datenbank zu verbinden.

Leider kommt es zu Verbindungsproblemen die Ich mir nicht erklären kann.

Hier der Code:

MainActivity:

1package com.example.mysqlconnect10;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStream;
6import java.io.InputStreamReader;
7import java.util.ArrayList;
8
9import org.apache.http.HttpEntity;
10import org.apache.http.HttpResponse;
11import org.apache.http.NameValuePair;
12import org.apache.http.client.HttpClient;
13import org.apache.http.client.entity.UrlEncodedFormEntity;
14import org.apache.http.client.methods.HttpPost;
15import org.apache.http.impl.client.DefaultHttpClient;
16import org.apache.http.message.BasicNameValuePair;
17import org.json.JSONObject;
18
19import android.os.Bundle;
20import android.app.Activity;
21import android.view.Menu;
22import android.view.View;
23import android.view.View.OnClickListener;
24import android.widget.Button;
25import android.widget.EditText;
26import android.widget.Toast;
27
28public class MainActivity extends Activity implements OnClickListener {
29
30 EditText etUser, etPass;
31 Button bLogin;
32
33 String username, password;
34
35 HttpClient httpclient;
36
37 HttpPost httppost;
38
39 ArrayList<NameValuePair> nameValuePairs;
40
41 HttpResponse response;
42
43 HttpEntity entity;
44
45 @Override
46 protected void onCreate(Bundle savedInstanceState) {
47 super.onCreate(savedInstanceState);
48 setContentView(R.layout.activity_main);
49
50 initialise();
51 }
52
53 private void initialise() {
54 // TODO Auto-generated method stub
55
56 etUser = (EditText) findViewById(R.id.etUser);
57 etPass = (EditText) findViewById(R.id.etPass);
58 bLogin = (Button) findViewById(R.id.button1);
59
60 bLogin.setOnClickListener(this);
61
62 }
63
64 @Override
65 public boolean onCreateOptionsMenu(Menu menu) {
66 // Inflate the menu; this adds items to the action bar if it is present.
67 getMenuInflater().inflate(R.menu.main, menu);
68 return true;
69 }
70
71 @Override
72 public void onClick(View arg0) {
73 // TODO Auto-generated method stub
74 try {
75 httpclient = new DefaultHttpClient();
76
77 httppost = new HttpPost("http://192.168.X.X/project/login.php");
78
79 username = etUser.getText().toString();
80 password = etPass.getText().toString();
81
82 } catch (Exception e) {
83
84 e.printStackTrace();
85 Toast.makeText(getBaseContext(), "Problem mit der Deklaration",
86 Toast.LENGTH_SHORT).show();
87 }
88
89 try {
90
91 nameValuePairs = new ArrayList<NameValuePair>();
92
93 nameValuePairs.add(new BasicNameValuePair("user", username));
94 nameValuePairs.add(new BasicNameValuePair("pass", password));
95
96 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
97
98 try {
99 response = httpclient.execute(httppost);
100 } catch (Exception e) {
101 e.printStackTrace();
102 Toast.makeText(getBaseContext(),
103 "Verbindung zur Zieladresse nicht möglich",
104 Toast.LENGTH_SHORT).show();
105 }
106
107 if (response.getStatusLine().getStatusCode() == 200) {
108
109 entity = response.getEntity();
110
111 if (entity != null) {
112 InputStream instream = entity.getContent();
113
114 JSONObject jsonResponse = new JSONObject(
115 convertStreamToString(instream));
116
117 String retUser = jsonResponse.getString("user");
118 String retPass = jsonResponse.getString("pass");
119
120 if (username.equals(retUser) && password.equals(retPass)) {
121
122 Toast.makeText(getBaseContext(), "login success!",
123 Toast.LENGTH_SHORT).show();
124
125 } else {
126
127 Toast.makeText(getBaseContext(), "Invalid login",
128 Toast.LENGTH_SHORT).show();
129 }
130 }
131 }
132 } catch (Exception e) {
133
134 e.printStackTrace();
135
136 Toast.makeText(getBaseContext(), "Connection Error",
137 Toast.LENGTH_SHORT).show();
138 }
139
140 }
141
142 private static String convertStreamToString(InputStream is) {
143 /*
144 * To convert the InputStream to String we use the
145 * BufferedReader.readLine() method. We iterate until the BufferedReader
146 * return null which means there's no more data to read. Each line will
147 * appended to a StringBuilder and returned as String.
148 */
149
150 BufferedReader reader = new BufferedReader(new InputStreamReader(is));
151 StringBuilder sb = new StringBuilder();
152
153 String line = null;
154 try {
155 while ((line = reader.readLine()) != null) {
156 sb.append(line + "\n");
157 }
158 } catch (IOException e) {
159 e.printStackTrace();
160 } finally {
161 try {
162 is.close();
163 } catch (IOException e) {
164 e.printStackTrace();
165 }
166 }
167 return sb.toString();
168
169 }
170
171}

Manifest:

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.example.mysqlconnect10"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk
8 android:minSdkVersion="8"
9 android:targetSdkVersion="17" />
10 <uses-permission android:name="android.permission.INTERNET"/>
11 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
12
13 <application
14 android:allowBackup="true"
15 android:icon="@drawable/ic_launcher"
16 android:label="@string/app_name"
17 android:theme="@style/AppTheme" >
18 <activity
19 android:name="com.example.mysqlconnect10.MainActivity"
20 android:label="@string/app_name" >
21 <intent-filter>
22 <action android:name="android.intent.action.MAIN" />
23
24 <category android:name="android.intent.category.LAUNCHER" />
25 </intent-filter>
26 </activity>
27 </application>
28
29</manifest>

PHP Script:

1<?php
2
3
4$username = $_POST=['username'];
5$password = $_POST=['password'];
6
7$db_host="localhost";
8$user = "root";
9$pswd = "";
10$db = "mobiledb";
11
12
13$conn = mysql_connect($db_host, $user, $pswd);
14mysql_select_db($db, $conn);
15
16$query = 'SELECT * FROM androidlogin WHERE user = "$username" AND pass = "$password"';
17
18$result = mysql_query($query) or die ('unable');
19
20$num = mysql_num_rows($result);
21
22if($num == 1)
23{
24 while($list=mysql_fetch_assoc($result)){
25
26 $output = $list;
27
28 echo json_encode($output);
29
30
31 }
32 mysql_close();
33
34 echo "Login succ";
35
36}
37else
38{
39
40echo "Login failed";
41}
42
43
44
45?>


Das ganze läuft auf einen Error: Die Exception "Verbindung zur Zieladresse nicht möglich" greift.


Das PHP Script liefert im Test ohne die App die richtigen Daten zurück. Somit sollte es an der App liegen.

Weiß jemand warum?

Danke schon einmal :(

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.068

27.08.2013, 14:35:51 via Website

Ist der Port am Zielsystem offen?
Lauscht MySQL auf dem Port oder nur auf dem Socket?
Ist der MySQL-User für externe IPs eingerichtet?
Hat der User für alle Zugriffsarten das gleiche Passwort?

BTW: Ich hoffe nicht, Du nutzt wirklich root ohne Passwort...

Die Tatsache, dass ich paranoid bin, heißt noch lange nicht, sie seien nicht hinter mir her!

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

27.08.2013, 15:17:59 via Website

Hi und soweit danke.

@Impjor: Wo setze ich im Code den entsprechenden AsyncTask?

@Ralph: Wie prüfe ich die einzelnen Punkte?

Ich wäre euch sehr dankbar für eine Erläuterung.

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 16:55:39 via Website

Hallo.

Wenn du mal Googlen würdest, wüsstest du wie wo was wegen AsyncTask.

Hier ist sogar für "doofe" ein beispiel dabei::D
http://developer.android.com/reference/android/os/AsyncTask.html

Und wie @impjor sagte: LogCat bitte...



LG

— geändert am 27.08.2013, 16:57:21

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

28.08.2013, 12:55:31 via Website

Auch wenn etwas spät hier nun der LogCat:

108-28 12:51:00.930: I/global(4644): call createSocket() return a new socket.
208-28 12:51:00.935: W/System.err(4644): android.os.NetworkOnMainThreadException
308-28 12:51:00.935: W/System.err(4644): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java)
408-28 12:51:00.935: W/System.err(4644): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java)
508-28 12:51:00.935: W/System.err(4644): at libcore.io.IoBridge.connectErrno(IoBridge.java)
608-28 12:51:00.935: W/System.err(4644): at libcore.io.IoBridge.connect(IoBridge.java)
708-28 12:51:00.940: W/System.err(4644): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java)
808-28 12:51:00.940: W/System.err(4644): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java)
908-28 12:51:00.940: W/System.err(4644): at java.net.Socket.connect(Socket.java)
1008-28 12:51:00.940: W/System.err(4644): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java)
1108-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java)
1208-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java)
1308-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java)
1408-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java)
1508-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java)
1608-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java)
1708-28 12:51:00.940: W/System.err(4644): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java)
1808-28 12:51:00.945: W/System.err(4644): at com.example.mysqlconnect10.MainActivity.onClick(MainActivity.java:104)
1908-28 12:51:00.945: W/System.err(4644): at android.view.View.performClick(View.java)
2008-28 12:51:00.945: W/System.err(4644): at android.view.View$PerformClick.run(View.java)
2108-28 12:51:00.945: W/System.err(4644): at android.os.Handler.handleCallback(Handler.java)
2208-28 12:51:00.945: W/System.err(4644): at android.os.Handler.dispatchMessage(Handler.java)
2308-28 12:51:00.945: W/System.err(4644): at android.os.Looper.loop(Looper.java)
2408-28 12:51:00.945: W/System.err(4644): at android.app.ActivityThread.main(ActivityThread.java)
2508-28 12:51:00.945: W/System.err(4644): at java.lang.reflect.Method.invokeNative(Native Method)
2608-28 12:51:00.945: W/System.err(4644): at java.lang.reflect.Method.invoke(Method.java)
2708-28 12:51:00.945: W/System.err(4644): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
2808-28 12:51:00.945: W/System.err(4644): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
2908-28 12:51:00.950: W/System.err(4644): at dalvik.system.NativeStart.main(Native Method)
3008-28 12:51:00.955: W/System.err(4644): java.lang.NullPointerException
3108-28 12:51:00.955: W/System.err(4644): at com.example.mysqlconnect10.MainActivity.onClick(MainActivity.java:112)
3208-28 12:51:00.955: W/System.err(4644): at android.view.View.performClick(View.java)
3308-28 12:51:00.955: W/System.err(4644): at android.view.View$PerformClick.run(View.java)
3408-28 12:51:00.960: W/System.err(4644): at android.os.Handler.handleCallback(Handler.java)
3508-28 12:51:00.960: W/System.err(4644): at android.os.Handler.dispatchMessage(Handler.java)
3608-28 12:51:00.960: W/System.err(4644): at android.os.Looper.loop(Looper.java)
3708-28 12:51:00.960: W/System.err(4644): at android.app.ActivityThread.main(ActivityThread.java)
3808-28 12:51:00.960: W/System.err(4644): at java.lang.reflect.Method.invokeNative(Native Method)
3908-28 12:51:00.960: W/System.err(4644): at java.lang.reflect.Method.invoke(Method.java)
4008-28 12:51:00.960: W/System.err(4644): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
4108-28 12:51:00.960: W/System.err(4644): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
4208-28 12:51:00.960: W/System.err(4644): at dalvik.system.NativeStart.main(Native Method)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.068

28.08.2013, 13:03:07 via Website

Bastian Seidemann
@Ralph: Wie prüfe ich die einzelnen Punkte?

Das zu erklären, würde hier jetzt ein bisschen weit führen. Das sind in erster Linie MySQL-Basics. Aber natürlich kann es auch die Firewall der MySQL-Maschine betreffen.

Die Tatsache, dass ich paranoid bin, heißt noch lange nicht, sie seien nicht hinter mir her!

Antworten
impjor
  • Forum-Beiträge: 1.793

28.08.2013, 13:27:34 via App

Wie gesagt, NetworkOnMainThreadException. Schau mal hier im Forum, zwei drei Threads vor deinem hatte jemand das selbe Problem und die Lösung gepostet!

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
impjor
  • Forum-Beiträge: 1.793

28.08.2013, 13:30:27 via App

Hier der Thread:
https://www.nextpit.de/de/android/forum/thread/567919/Probleme-beim-auslesen-einer-Webseite

Einfach alles von onClick in die doInBackground des AsyncTask.
Wichtig: In der doInBackground kannst du keine Views ändern, dass machst du in der onPost... Methode. Beide Methoden werden automatisch aufgerufen, wenn du new DeinAsynctask().execute(); machst.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

28.08.2013, 15:00:35 via Website

Mit dem AsyncTask bleibt der Logcat leer.

Aber eine ausgabe oder ein Toast wie im Programm festgelegt erscheint auch nicht.

Der Code:

1package com.example.mysqlconnect10;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStream;
6import java.io.InputStreamReader;
7import java.util.ArrayList;
8
9import org.apache.http.HttpEntity;
10import org.apache.http.HttpResponse;
11import org.apache.http.NameValuePair;
12import org.apache.http.client.HttpClient;
13import org.apache.http.client.entity.UrlEncodedFormEntity;
14import org.apache.http.client.methods.HttpPost;
15import org.apache.http.impl.client.DefaultHttpClient;
16import org.apache.http.message.BasicNameValuePair;
17import org.json.JSONObject;
18
19import android.os.AsyncTask;
20import android.os.Bundle;
21import android.app.Activity;
22import android.view.Menu;
23import android.view.View;
24import android.view.View.OnClickListener;
25import android.widget.Button;
26import android.widget.EditText;
27import android.widget.Toast;
28
29public class MainActivity extends Activity implements OnClickListener {
30
31 EditText etUser, etPass;
32 Button bLogin;
33
34 String username, password;
35
36 HttpClient httpclient;
37
38 HttpPost httppost;
39
40 ArrayList<NameValuePair> nameValuePairs;
41
42 HttpResponse response;
43
44 HttpEntity entity;
45
46 @Override
47 protected void onCreate(Bundle savedInstanceState) {
48 super.onCreate(savedInstanceState);
49 setContentView(R.layout.activity_main);
50
51 initialise();
52 }
53
54 private void initialise() {
55 // TODO Auto-generated method stub
56
57 etUser = (EditText) findViewById(R.id.etUser);
58 etPass = (EditText) findViewById(R.id.etPass);
59 bLogin = (Button) findViewById(R.id.button1);
60
61 bLogin.setOnClickListener(this);
62
63 }
64
65 @Override
66 public boolean onCreateOptionsMenu(Menu menu) {
67 // Inflate the menu; this adds items to the action bar if it is present.
68 getMenuInflater().inflate(R.menu.main, menu);
69 return true;
70 }
71
72 @Override
73 public void onClick(View arg0) {
74 // TODO Auto-generated method stub
75
76 new ConnectTask();
77
78 }
79
80 private static String convertStreamToString(InputStream is) {
81 /*
82 * To convert the InputStream to String we use the
83 * BufferedReader.readLine() method. We iterate until the BufferedReader
84 * return null which means there's no more data to read. Each line will
85 * appended to a StringBuilder and returned as String.
86 */
87
88 BufferedReader reader = new BufferedReader(new InputStreamReader(is));
89 StringBuilder sb = new StringBuilder();
90
91 String line = null;
92 try {
93 while ((line = reader.readLine()) != null) {
94 sb.append(line + "\n");
95 }
96 } catch (IOException e) {
97 e.printStackTrace();
98 } finally {
99 try {
100 is.close();
101 } catch (IOException e) {
102 e.printStackTrace();
103 }
104 }
105 return sb.toString();
106
107 }
108
109 public class ConnectTask extends AsyncTask<String, Void, String> {
110
111 @Override
112 protected String doInBackground(String... arg0) {
113
114 try {
115 httpclient = new DefaultHttpClient();
116
117 httppost = new HttpPost(
118 "http://192.168.2.137/project/login.php");
119
120 username = etUser.getText().toString();
121 password = etPass.getText().toString();
122
123 } catch (Exception e) {
124
125 e.printStackTrace();
126 Toast.makeText(getBaseContext(), "Problem mit der Deklaration",
127 Toast.LENGTH_SHORT).show();
128 }
129
130 try {
131
132 nameValuePairs = new ArrayList<NameValuePair>();
133
134 nameValuePairs.add(new BasicNameValuePair("user", username));
135 nameValuePairs.add(new BasicNameValuePair("pass", password));
136
137 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
138
139 try {
140 response = httpclient.execute(httppost);
141 } catch (Exception e) {
142 e.printStackTrace();
143 Toast.makeText(getBaseContext(),
144 "Verbindung zur Zieladresse nicht möglich",
145 Toast.LENGTH_SHORT).show();
146 }
147
148 if (response.getStatusLine().getStatusCode() == 200) {
149
150 entity = response.getEntity();
151
152 if (entity != null) {
153 InputStream instream = entity.getContent();
154
155 JSONObject jsonResponse = new JSONObject(
156 convertStreamToString(instream));
157
158 String retUser = jsonResponse.getString("user");
159 String retPass = jsonResponse.getString("pass");
160
161 if (username.equals(retUser)
162 && password.equals(retPass)) {
163
164 Toast.makeText(getBaseContext(), "login success!",
165 Toast.LENGTH_SHORT).show();
166
167 } else {
168
169 Toast.makeText(getBaseContext(), "Invalid login",
170 Toast.LENGTH_SHORT).show();
171 }
172 }
173 }
174 } catch (Exception e) {
175
176 e.printStackTrace();
177
178 Toast.makeText(getBaseContext(), "Connection Error",
179 Toast.LENGTH_SHORT).show();
180 }
181
182 // TODO Auto-generated method stub
183 return null;
184 }
185
186 }
187
188}

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

28.08.2013, 15:12:40 via Website

Hatte beim Aufruf des Async Tasks das ".execute();" vergessen

jetzt folgender Logcat:

108-28 15:02:20.396: E/(13148): file /data/data/com.nvidia.NvCPLSvc/files/driverlist.txt: not found!
208-28 15:02:20.396: I/(13148): Attempting to load EGL implementation /system/lib//egl/libEGL_tegra_impl
308-28 15:02:20.581: I/(13148): Loaded EGL implementation /system/lib//egl/libEGL_tegra_impl
408-28 15:02:20.781: I/(13148): Loading GLESv2 implementation /system/lib//egl/libGLESv2_tegra_impl
508-28 15:02:33.836: I/global(13148): call createSocket() return a new socket.
608-28 15:02:34.041: W/System.err(13148): org.json.JSONException: Value Login of type java.lang.String cannot be converted to JSONObject
708-28 15:02:34.046: W/System.err(13148): at org.json.JSON.typeMismatch(JSON.java)
808-28 15:02:34.046: W/System.err(13148): at org.json.JSONObject.<init>(JSONObject.java)
908-28 15:02:34.046: W/System.err(13148): at org.json.JSONObject.<init>(JSONObject.java)
1008-28 15:02:34.051: W/System.err(13148): at com.example.mysqlconnect10.MainActivity$ConnectTask.doInBackground(MainActivity.java:155)
1108-28 15:02:34.051: W/System.err(13148): at com.example.mysqlconnect10.MainActivity$ConnectTask.doInBackground(MainActivity.java:1)
1208-28 15:02:34.056: W/System.err(13148): at android.os.AsyncTask$2.call(AsyncTask.java)
1308-28 15:02:34.056: W/System.err(13148): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java)
1408-28 15:02:34.056: W/System.err(13148): at java.util.concurrent.FutureTask.run(FutureTask.java)
1508-28 15:02:34.056: W/System.err(13148): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
1608-28 15:02:34.056: W/System.err(13148): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
1708-28 15:02:34.056: W/System.err(13148): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
1808-28 15:02:34.056: W/System.err(13148): at java.lang.Thread.run(Thread.java)
1908-28 15:02:34.061: W/dalvikvm(13148): threadid=11: thread exiting with uncaught exception (group=0x414554d0)
2008-28 15:02:34.066: E/AndroidRuntime(13148): FATAL EXCEPTION: AsyncTask #1
2108-28 15:02:34.066: E/AndroidRuntime(13148): java.lang.RuntimeException: An error occured while executing doInBackground()
2208-28 15:02:34.066: E/AndroidRuntime(13148): at android.os.AsyncTask$3.done(AsyncTask.java)
2308-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java)
2408-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.FutureTask.setException(FutureTask.java)
2508-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java)
2608-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.FutureTask.run(FutureTask.java)
2708-28 15:02:34.066: E/AndroidRuntime(13148): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
2808-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
2908-28 15:02:34.066: E/AndroidRuntime(13148): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
3008-28 15:02:34.066: E/AndroidRuntime(13148): at java.lang.Thread.run(Thread.java)
3108-28 15:02:34.066: E/AndroidRuntime(13148): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
3208-28 15:02:34.066: E/AndroidRuntime(13148): at android.os.Handler.<init>(Handler.java)
3308-28 15:02:34.066: E/AndroidRuntime(13148): at android.widget.Toast$TN.<init>(Toast.java)
3408-28 15:02:34.066: E/AndroidRuntime(13148): at android.widget.Toast.<init>(Toast.java)
3508-28 15:02:34.066: E/AndroidRuntime(13148): at android.widget.Toast.makeText(Toast.java)
3608-28 15:02:34.066: E/AndroidRuntime(13148): at com.example.mysqlconnect10.MainActivity$ConnectTask.doInBackground(MainActivity.java:178)
3708-28 15:02:34.066: E/AndroidRuntime(13148): at com.example.mysqlconnect10.MainActivity$ConnectTask.doInBackground(MainActivity.java:1)
3808-28 15:02:34.066: E/AndroidRuntime(13148): at android.os.AsyncTask$2.call(AsyncTask.java)
3908-28 15:02:34.066: E/AndroidRuntime(13148): ... 6 more
4008-28 15:02:34.701: W/IInputConnectionWrapper(13148): showStatusIcon on inactive InputConnection
4108-28 15:02:34.701: W/IInputConnectionWrapper(13148): InputConnection = com.android.internal.widget.EditableInputConnection@41830158, active client = false

Antworten
impjor
  • Forum-Beiträge: 1.793

28.08.2013, 19:53:09 via Website

org.json.JSONException: Value Login of type java.lang.String cannot be converted to JSONObject
708-28 15:02:34.046: W/System.err(13148): at org.json.JSON.typeMismatch(JSON.java)
808-28 15:02:34.046: W/System.err(13148): at org.json.JSONObject.<init>(JSONObject.java)
908-28 15:02:34.046: W/System.err(13148): at org.json.JSONObject.<init>(JSONObject.java)
1008-28 15:02:34.051: W/System.err(13148): at com.example.mysqlconnect10.MainActivity$ConnectTask.doInBackground(MainActivity.java:155)

Das würde ich mir mal genauer ansehen!

Bist du sicher, dass dein String korekt formatiert ist und ein JSON-Objekt enthält?

LG

— geändert am 28.08.2013, 19:54:25

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

28.08.2013, 21:17:21 via Website

Hi,

Nützt dir die Übergabe aus dem PHP File bei Abfrage etwas?

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

28.08.2013, 22:02:51 via Website

Das bin ich eben nicht :(

deswegen hoffe ich auf schnelle Erleuchtung.

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

01.09.2013, 18:11:34 via Website

Da bin ich mal wieder :)

Ich habe das ganze von ganz hinten neu afgerollt und es klappt fast alles.

Es hapert an der letzten Umsetzung.

Ich versuche es möglichst genau zu erklären:

Hier die PHP:

1<?php
2
3
4$username = $_POST=['username'];
5$password = $_POST=['password'];
6
7$db_host="localhost";
8$user = "root";
9$pswd = "";
10$db = "mobiledb";
11
12
13$conn = mysql_connect($db_host, $user, $pswd);
14mysql_select_db($db, $conn);
15
16$query = 'SELECT * FROM androidlogin WHERE user = "$username" AND pass = "$password"';
17
18$result = mysql_query($query) or die ('unable');
19
20$num = mysql_num_rows($result);
21
22if($num == 1)
23{
24 while($list=mysql_fetch_assoc($result)){
25
26 $output = $list;
27
28 echo json_encode($output);
29
30
31 }
32 mysql_close();
33
34
35
36}
37else
38{
39
40echo "Login failed";
41e
42
43}
44
45
46
47?>


wenn ich im Query Befehl $username und $ password durch direkten Text ersetze (also den unverschlüsselten usernamen und pw) bekomme ich einen json String zurück:

{"id":"1","user":"basti","pass":"test123"}

Diesen kann ich dann in der App verarbeiten.

Wenn ich jedoch in der PHP die Variablen lasse bekomme ich nur ein Login Failed zurück.

Hier der Code:

1package com.example.login;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStream;
6import java.io.InputStreamReader;
7import java.util.ArrayList;
8import java.util.List;
9
10import org.apache.http.HttpEntity;
11import org.apache.http.HttpResponse;
12import org.apache.http.NameValuePair;
13import org.apache.http.client.HttpClient;
14import org.apache.http.client.entity.UrlEncodedFormEntity;
15import org.apache.http.client.methods.HttpPost;
16import org.apache.http.impl.client.DefaultHttpClient;
17import org.apache.http.message.BasicNameValuePair;
18import org.json.JSONException;
19import org.json.JSONObject;
20
21import android.os.AsyncTask;
22import android.os.Bundle;
23import android.app.Activity;
24import android.app.ProgressDialog;
25import android.util.Log;
26import android.view.Menu;
27import android.view.View;
28import android.view.View.OnClickListener;
29import android.widget.Button;
30import android.widget.EditText;
31import android.widget.TextView;
32
33
34public class MainActivity extends Activity implements OnClickListener {
35
36 Button b1;
37 public List<NameValuePair> werte = new ArrayList<NameValuePair>(2);
38 TextView tx;
39 EditText us,pw;
40
41 @Override
42 protected void onCreate(Bundle savedInstanceState) {
43 super.onCreate(savedInstanceState);
44 setContentView(R.layout.activity_main);
45
46 Button b1 = (Button) findViewById(R.id.button1);
47
48 b1.setOnClickListener(this);
49
50 tx = (TextView) findViewById(R.id.textView1);
51
52 us = (EditText)findViewById(R.id.user);
53 pw = (EditText)findViewById(R.id.pass);
54
55 }
56
57 @Override
58 public boolean onCreateOptionsMenu(Menu menu) {
59 // Inflate the menu; this adds items to the action bar if it is present.
60 getMenuInflater().inflate(R.menu.main, menu);
61 return true;
62 }
63
64 @Override
65 public void onClick(View arg0) {
66
67 new HttpConnect().execute();
68 }
69
70 private class HttpConnect extends AsyncTask<Void, Void, Void> {
71
72 protected void onPreExecute(){
73
74 super.onPreExecute();
75 ProgressDialog pDialog = new ProgressDialog(MainActivity.this);
76 pDialog.setMessage("Verbindungsversuch...");
77 pDialog.setCancelable(true);
78 pDialog.show();
79
80 }
81
82 @Override
83 protected Void doInBackground(Void... arg0) {
84
85 HttpClient client = new DefaultHttpClient();
86
87 HttpPost post = new HttpPost("http://192.168.0.8/project/login.php");
88
89 try {
90
91 String username = us.getText().toString();
92 String password = pw.getText().toString();
93
94 werte.add(new BasicNameValuePair("username", username));
95 werte.add(new BasicNameValuePair("password", password));
96 post.setEntity(new UrlEncodedFormEntity(werte));
97
98 HttpResponse antwort = client.execute(post);
99
100 HttpEntity entity = antwort.getEntity();
101
102 InputStream is = entity.getContent();
103
104 final String result = inputStreamToString(is);
105
106 try{
107
108
109 JSONObject obj = new JSONObject(result);
110
111 String usernam = obj.getString("user");
112 String passwor = obj.getString("pass");
113 String output = usernam + " und " + passwor;
114
115 }catch(JSONException e){
116 Log.e("Log_Tag", "JSONFILEDERROR: " + e.toString());
117 }
118
119 runOnUiThread(new Runnable() {
120
121 @Override
122 public void run() {
123 // TODO Auto-generated method stub
124
125 //Toast.makeText(getBaseContext(), "ok", Toast.LENGTH_SHORT).show();
126
127
128 try{
129 /*
130
131
132
133 TextView ty = (TextView)findViewById(R.id.textView2);
134 ty.setText(usernam);
135
136 TextView tz = (TextView)findViewById(R.id.textView3);
137 tz.setText(passwor);
138
139 */
140
141 tx.setText(result);
142 }
143 catch(Exception e){
144 Log.e("Log_Tag", "parse error: " + e.toString());
145 }
146 }
147 });
148
149
150 }catch (Exception e) {
151 Log.e("log_tag", "Fehler: " + e.toString());
152 }
153
154 return null;
155 }
156
157
158
159 }
160
161 public static String inputStreamToString(InputStream is) {
162
163 String line = "";
164 StringBuilder total = new StringBuilder();
165
166 BufferedReader rd = new BufferedReader(new InputStreamReader(is));
167
168 try {
169 while ((line = rd.readLine()) != null) {
170
171 total.append(line);
172 }
173 } catch (IOException e) {
174
175 Log.e("log_tag", "Error while: " + e.toString());
176 }
177
178 return total.toString();
179
180 }
181
182}

Der Logcat sagt:

109-01 18:14:45.010: E/Log_Tag(14753): JSONFILEDERROR: org.json.JSONException: Value Login of type java.lang.String cannot be converted to JSONObject

Kann sich das jemand erklären?

Vielen Dank bis hierher :)

— geändert am 01.09.2013, 18:16:01

Antworten
impjor
  • Forum-Beiträge: 1.793

01.09.2013, 20:42:59 via App

Wenn php natürlich "Login failed" zurück liefert, kann das nicht in ein JSONObject konvertiert werden, oder? :)
Die Frage ist also, warum Login failed kommt. Da fällt mir auf:

$username = $_POST=["username"];

Was hat das zweite Gleich da zusuchen??

Gruß

Tante Edith sagt: Es wird noch schlimmer: In deinem SQL-Statement steht '... username = "$username" ...', das geht aber nur, wenn du den String in doppelte Anführungszeichen setzt, sonst so :
' ... username = " '.$username.' " ...' (Leerzeichen nur zur ÜÜbersicht.

LG

— geändert am 01.09.2013, 20:46:57

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

01.09.2013, 22:35:38 via Website

Vielen Dank für die Antwort.

Es liegt sicher am PHP:

Aber es geht immer noch nicht

Code PHP:

1<?php
2
3
4$username = $_POST["'username'"];
5$password = $_POST["'password'"];
6
7$db_host="localhost";
8$user = "root";
9$pswd = "";
10$db = "mobiledb";
11
12
13$conn = mysql_connect($db_host, $user, $pswd);
14mysql_select_db($db, $conn);
15
16$query = 'SELECT * FROM androidlogin WHERE user = "'$username'" AND pass = "'$password'"';
17
18$result = mysql_query($query) or die ('unable');
19
20$num = mysql_num_rows($result);
21
22if($num == 1)
23{
24 while($list=mysql_fetch_assoc($result)){
25
26 $output = $list;
27
28 echo json_encode($output);
29
30
31 }
32 mysql_close();
33
34
35
36}
37else
38{
39
40echo "Login failed";
41
42
43}
44
45
46
47?>

Logcat:

109-01 22:32:10.030: I/info(2752): Result: [<br /><font size='1'><table class='xdebug-error xe-parse-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'><tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Parse error: syntax error, unexpected '$username' (T_VARIABLE) in C:\wamp\www\project\login.php on line <i>16</i></th></tr></table></font>]
209-01 22:32:10.030: E/Log_Tag(2752): JSONFILEDERROR: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

Antworten
Andy N.
  • Forum-Beiträge: 3.112

02.09.2013, 08:00:21 via Website

Ruf doch einfach mal die URL über einen Browser ab, dann siehst Du auch was raus kommt. Dann siehst Du auch Deinen Fehler, wenn Du Dich der Logcatausgabe so verweigerst :wink:

Dann solltest Du die SQL-Abfrage anschauen. Hier ist de Fehler, nebenbei sollte so eine Abfrage nicht aussehen.

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

02.09.2013, 08:09:43 via Website

Aber wie soll ich im Browser die Login Daten übergeben?

Wie sollte die Abfrage aussehen?

LG

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

02.09.2013, 08:33:58 via Website

Er gibt mir den Fehler beim direkten Aufruf der login.php:

Parse error: syntax error, unexpected '$username' (T_VARIABLE) in C:\wamp\www\project\login.php on line 16

Antworten
Andy N.
  • Forum-Beiträge: 3.112

02.09.2013, 08:39:38 via Website

Weil es den Parameter '$username' auch nicht gibt. Warum die doppelten Anführungszeichen?

Antworten
Bastian Seidemann
  • Forum-Beiträge: 137

02.09.2013, 08:45:26 via Website

Andy N.
Weil es den Parameter '$username' auch nicht gibt. Warum die doppelten Anführungszeichen?

Jetzt steh ich ganz auf dem Schlauch.

Hilf mir bitte auf die Sprünge, was muss ich wo ersetzen.

:o

Antworten
impjor
  • Forum-Beiträge: 1.793

02.09.2013, 13:12:36 via Website

Sorry, aber hast du meinen/Andys Beitrag überhaupt gelesen?

Bastian Seidemann
1<?php
2
3
4$username = $_POST["'username'"];
5$password = $_POST["'password'"];

Was machen da die einzelnen Anführungszeichen?

1$query = 'SELECT * FROM androidlogin WHERE user = "'$username'" AND pass = "'$password'"';

Hier auch keine wirkliche Verbesserung:

impjor
In deinem SQL-Statement steht '... username = "$username" ...', [... das geht so:]
' ... username = "'.$username.'" ...'

Um das ganze noch mal zu verdeutlichen:

Du hast den String username = " dieser ist dann zuende (') und die Variable ($username) wird mit dem String verknüpft (.).
In Java würde das so aussehen:
1func("username = '"+username+"'");
Statt dess Plus wird in PHP der Punkt verwendet.

LG

— geändert am 02.09.2013, 13:15:55

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten