login mit php/mysql

  • 23 Antworten
  • Neuester Beitrag
Diskutiere login mit php/mysql im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Z

zauber3r

Erfahrenes Mitglied
hi,

ich bin nach dem link vorgegangen:
Android PHP/MYSQL Tutorial
ein fehler ist enthalten

Es erscheint immer, egal ob es den login gibt oder nicht "login succesful" wie ändere ich das?

ich würde gerne eine andere activity aufrufen, aber nur wenn der login erfolgreich was.
@Override protected void onPostExecute(String result){ this.statusField.setText("Login Successful"); this.roleField.setText(result); }
 
markus.tullius

markus.tullius

Experte
Mit einer if - Abfrage. ;)

Lass dir einfach ein String zurück liefern, ob der Login geklappt hat.
 
Z

zauber3r

Erfahrenes Mitglied
soweit war ich auch schon ^^

kurzes beispiel? bin noch extremer anfänger in java....

welche prozedur soll den string denn liefern?
 
markus.tullius

markus.tullius

Experte
Code:
BufferedReader reader = new BufferedReader (new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
 // Read Server Response 

while((line = reader.readLine()) != null) { 
    sb.append(line);
    break; 
} 
return sb.toString();
In deinem Beispiel gibt es obige Code (2x). Hier wird die Antwort des Server (Response) zu einem String zusammen gesetzt. sb.toString liefert dir die Antwort dann als String.
 
Z

zauber3r

Erfahrenes Mitglied
vllt bin ich zu ungeduldig, aber ich verstehe es nicht.

wie gesagt ich bin sehr sehr neu dabei und arbeite mich gerade intensiv ein.

wie kann ich zb die antwort debuggen die der server mir gibt?
 
Z

zauber3r

Erfahrenes Mitglied
hi,
ich habe probleme mit dem verständnis wie funktionen werte zurück geben.

sprich dieser code:
Code:
             while((line = reader.readLine()) != null)
             {
                sb.append(line);
                break;
                
             }
erstellt ein array mit der serverantwort oder?

in meinem falle ist das nur ein wert, wie übergebe ich den zurück um ihn in der mainactivity weiter nutzen zu können?

Code:
package com.example.phpmysql;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class SigninActivity  extends AsyncTask<String,Void,String>{

   private TextView statusField,roleField;
   private Context context;
   private int byGetOrPost = 0; 
   //flag 0 means get and 1 means post.(By default it is get.)
   public SigninActivity(Context context,TextView statusField, TextView roleField,int flag) {
      this.context = context;
      this.statusField = statusField;
      this.roleField = roleField;
      byGetOrPost = flag;
   }

   protected void onPreExecute(){

   }
   @Override
   protected String doInBackground(String... arg0) {
      if(byGetOrPost == 0){ //means by Get Method
         try{
            String username = (String)arg0[0];
            String password = (String)arg0[1];
            String link = "http://hevilp.no-ip.org/login.php?username="+username+"&password="+password;
            URL url = new URL(link);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(link));
            HttpResponse response = client.execute(request);
            BufferedReader in = new BufferedReader
           (new InputStreamReader(response.getEntity().getContent()));

           StringBuffer sb = new StringBuffer("");
           String line="";
           while ((line = in.readLine()) != null) {
              sb.append(line);
              break;
            }
            in.close();
            return sb.toString();
      }catch(Exception e){
         return new String("Exception: " + e.getMessage());
      }
      }
      else{
          try{
             String username = (String)arg0[0];
             String password = (String)arg0[1];
             String link="http://hevilp.no-ip.org/loginpost.php";
             String data  = URLEncoder.encode("username", "UTF-8") 
             + "=" + URLEncoder.encode(username, "UTF-8");
             data += "&" + URLEncoder.encode("password", "UTF-8") 
             + "=" + URLEncoder.encode(password, "UTF-8");
             URL url = new URL(link);
             URLConnection conn = url.openConnection(); 
             conn.setDoOutput(true); 
             OutputStreamWriter wr = new OutputStreamWriter
             (conn.getOutputStream()); 
             wr.write( data ); 
             wr.flush(); 
             BufferedReader reader = new BufferedReader
             (new InputStreamReader(conn.getInputStream()));
             StringBuilder sb = new StringBuilder();
             String line = null;
             // Read Server Response
             while((line = reader.readLine()) != null)
             {
                sb.append(line);
                break;
                
             } 
             return sb.toString();
          } catch(Exception e){
             return new String("Exception: " + e.getMessage());
          }
          
       }
    }
    @Override
    protected void onPostExecute(String result){
       
  }
 }
 
markus.tullius

markus.tullius

Experte
Hi,

der return wert von doInBackground(String... arg0) wird an die Methode onPostExecute(String result) übergeben.

Sprich das Argument result hat den gleichen Wert wie dein return Wert.

In onPostExecute(String result) kannst du das Ergebnis deiner Loginabfrage verarbeiten.


AsyncTask | Android Developers
 
Z

zauber3r

Erfahrenes Mitglied
danke sehr!

ich möchte nach diesem check, die nächste activity starten,
es soll also ein neues layout auf gehen und eine neue activity gestartet werden.

Code:
if (result == "0"){
          Intent nextScreen = new Intent(getApplicationContext(), KstmenuActivity.class);
          setContentView(R.layout.activity_kstmenu);
          startActivity(nextScreen);
          this.finish();
das funktioniert aber nicht aus der SigninActivity, ich denke weil er aus der Main nichts geerbt hat.

wie muss ich nun vorgehen? den wert an die main übergeben und dort den if-test durchführen?
 
D

dthiess

Ambitioniertes Mitglied
Hast du die zweite Activity auch im Manifest eingetragen?
 
Z

zauber3r

Erfahrenes Mitglied
Ja hab ich, von einem normalen Button in der Main kann ich es ja aufrufen..

Hätte nie gedacht das ein einfacher login Prozess sich als so schwierig herausstellt.

Java ist schon sehr eigen
 
Z

zauber3r

Erfahrenes Mitglied
hier mein code erstmal ohne if-prüfung:

Code:
    protected void onPostExecute(String result){     
        //Neues Intent anlegen
         Intent nextScreen = new Intent(getApplicationContext(), KstmenuActivity.class);
         setContentView(R.layout.activity_kstmenu);
         //Intent starten und zur zweiten Activity wechseln
         startActivity(nextScreen);
       }
  }
und es kommt
Code:
Description    Resource    Path    Location    Type
The method getApplicationContext() is undefined for the type SigninActivity    SigninActivity.java    /phpmysql/src/com/example/phpmysql    line 106    Java Problem
The method setContentView(int) is undefined for the type SigninActivity    SigninActivity.java    /phpmysql/src/com/example/phpmysql    line 107    Java Problem
The method startActivity(Intent) is undefined for the type SigninActivity    SigninActivity.java    /phpmysql/src/com/example/phpmysql    line 109    Java Problem
 
Z

Zoopa

Stammgast
Derjenige, der das Tutorial geschrieben hat, hat auch nicht allzu viel überlegt, als er einen AsyncTask als SigninActivity bezeichnet hat. Es ist natürlich keine Activity, deshalb gibt es deine Methoden nicht.

Aber im Tutorial wird dem AsyncTask der Kontext mitgegeben, du kannst also den verwenden:

Code:
public class SigninActivity  extends AsyncTask<String,Void,String>{
  ...
  [B]private Context context;[/B]
  ...
}
Daher kannst du im AsyncTask einfach so weitermachen:

Code:
//Neues Intent anlegen
Intent nextScreen = new Intent([B]context[/B], KstmenuActivity.class);

//Das ist unnötig, kannst du weglassen
//setContentView(R.layout.activity_kstmenu);

//Intent starten und zur zweiten Activity wechseln
[B]context[/B].startActivity(nextScreen);
P.S.: nur weil du nicht alles verstehst, was abläuft, ist das noch lange kein Problem von Java :winki:
 
R

RED-BARON

Fortgeschrittenes Mitglied
zauber3r schrieb:
hi,
ich bin nach dem link vorgegangen:
Android PHP/MYSQL Tutorial
ein fehler ist enthalten
Vielleicht ist nur ein Fehler enthalten. Das Problem ist bei solchen
Tutorials, dass Anfänger der Illusion verfallen, diese würden immer
alles richtig zeigen.

Für eine belastbare Produktivumgebung ist weder die Datenbank
noch der Android-Code in dieser Form geeignet.
 
Z

zauber3r

Erfahrenes Mitglied
Tja, irgendwo muss ich anfangen... Sonst kann ich meine Idee nicht umsetzen. Mir nen app Programmierer zu nehmen ist einfach zu risikoreich... Bzw evtl die Sache nicht wert. Deshalb hangel ich mich so durch
 
R

RED-BARON

Fortgeschrittenes Mitglied
- INDEX auf Column `name`
- Passwort als Hash mit z.B. der MYSQL-Funktion 'SHA1', in DB ablegen.
- überall prepared-Statements verwenden:
"SELECT Role FROM table1 where Username=? and Password=?"
Nicht wie gezeigt wird, "Username='$username' and Password='$password'"

- für Android z.B.
MessageDigest digester = MessageDigest.getInstance("SHA1");
String passwordHash = bytesToHex(digester.digest(password.getBytes()));


Code:
[LEFT][B][COLOR=#7f0055]final[/COLOR][/B] [B][COLOR=#7f0055]private[/COLOR][/B] [B][COLOR=#7f0055]static[/COLOR][/B] [B][COLOR=#7f0055]char[/COLOR][/B][] [I][COLOR=#0000c0]hexArray[/COLOR][/I] = [COLOR=#2a00ff]"0123456789abcdef"[/COLOR].toCharArray();
[B][COLOR=#7f0055]private[/COLOR][/B] [B][COLOR=#7f0055]static[/COLOR][/B] String bytesToHex([B][COLOR=#7f0055]byte[/COLOR][/B][] bytes) {
[B][COLOR=#7f0055]char[/COLOR][/B][] hexChars = [B][COLOR=#7f0055]new[/COLOR][/B] [B][COLOR=#7f0055]char[/COLOR][/B][bytes.[COLOR=#0000c0]length[/COLOR] * 2];
[B][COLOR=#7f0055]for[/COLOR][/B] ( [B][COLOR=#7f0055]int[/COLOR][/B] j = 0; j < bytes.[COLOR=#0000c0]length[/COLOR]; j++ ) {
[B][COLOR=#7f0055]int[/COLOR][/B] v = bytes[j] & 0xFF;
hexChars[j * 2] = [I][COLOR=#0000c0]hexArray[/COLOR][/I][v >>> 4];
hexChars[j * 2 + 1] = [I][COLOR=#0000c0]hexArray[/COLOR][/I][v & 0x0F];
}
[B][COLOR=#7f0055]return[/COLOR][/B] [B][COLOR=#7f0055]new[/COLOR][/B] String(hexChars);[/LEFT]
}
auch fehlen sämtliche Fehlerprüfungen in dem php-Code
( bis auf die Prüfung ob eine DB-Verbindung hergestellt werden konnte )

Wenn nach dem Login noch was "gefährliches" mit der Datenbank gemacht werden soll
wäre das Benutzen einer Session-ID angebracht. Die Session-ID bekommt der Client beim
Login und muss diese bei jeder weiteren Anfrage an den Server mit übertragen.
Ansonsten wäre der Login sinnfrei.
 
Zuletzt bearbeitet:
Z

zauber3r

Erfahrenes Mitglied
Danke, meine dB sieht schon etwas anders aus. Wie gesagt ich möchte eine Idee umsetzen die ich für sinnvoll halte. Für nen mittelmäßigen Programmierer nen Witz aber für jmd der vollzeit was Artfremdes macht, nicht wirklich einfach..., aber danke ich arbeite mich durch...
 
Z

zauber3r

Erfahrenes Mitglied
@red-baron: was du sagst ist richtig, aber erstmal unwichtig. ich möchte erstmal eine alpha die zeigt was möglich ist.

das das alles nicht perfekt ist weiß, soll es auch nur werden wenn das ding mal wirklich produktiv werden soll

ich hab jetzt das hier:

Code:
            @Override
        protected void onPostExecute(String result){     
        Log.v(result, "result");
        int intZahl = Integer.parseInt(result);
        //Integer intZahl = Integer.valueOf(result);
        //Log.v(intZahl, "intZahl");
        if (intZahl == 1) {
        //Neues Intent anlegen
        Intent nextScreen = new Intent(context, KstmenuActivity.class);
         //setContentView(R.layout.activity_kstmenu);
         //Intent starten und zur zweiten Activity wechseln
        context.startActivity(nextScreen);
        }
       }
dazu habe ich zwei fragen:
er macht zwar einen neuen screen, ruft aber nicht mein layout auf.
das bringt natürlich nichts.
warum soll ich das gar nicht aufrufen mit setcontentview?
 
Zuletzt bearbeitet:
Z

Zoopa

Stammgast
zauber3r schrieb:
warum soll ich das gar nicht aufrufen mit setcontentview?
sollst du schon, aber nicht hier. Das macht man in der neuen Activity (KstmenuActivity) in der onCreate-Methode.
 
Z

zauber3r

Erfahrenes Mitglied
ihr helft mir megamäßig weiter!

ich mache große fortschritte!

wie übergeben ich nun eine die ich abegrufen habe?

sprich in der neuen Activity möchte ich das username übergeben wird.

protected String doInBackground kennt die variable username, wieso aber nicht onpostexecute?

mit nem normalen string bekomme ich das hin, nicht jedoch mit den variablen

Code:
package com.example.phpmysql;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class SigninActivity  extends AsyncTask<String,Void,String> {

   private TextView statusField,roleField;
   private Context context;
   private int byGetOrPost = 1; 
   //flag 0 means get and 1 means post.(By default it is get.)
   public SigninActivity(Context context,TextView statusField, TextView roleField,int flag) {
      this.context = context;
      this.statusField = statusField;
      this.roleField = roleField;
      byGetOrPost = flag;
   }

   protected void onPreExecute(){

   }
   @Override
   protected String doInBackground(String... arg0) {
      if(byGetOrPost == 0){ //means by Get Method
         try{
            String username = (String)arg0[0];
            String password = (String)arg0[1];
            String link = http://ADASDASDASDASDASDASD;
            URL url = new URL(link);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(link));
            HttpResponse response = client.execute(request);
            BufferedReader in = new BufferedReader
           (new InputStreamReader(response.getEntity().getContent()));

           StringBuffer sb = new StringBuffer("");
           String line="";
           while ((line = in.readLine()) != null) {
              sb.append(line);
              break;
            }
            in.close();
            return sb.toString();
      }catch(Exception e){
         return new String("Exception: " + e.getMessage());
      }
      }
      else{
          try{
             String username = (String)arg0[0];
             String password = (String)arg0[1];
             String link="gdfgdfgdfgdgddgdgd/loginpost.php";
             String data  = URLEncoder.encode("username", "UTF-8") 
             + "=" + URLEncoder.encode(username, "UTF-8");
             data += "&" + URLEncoder.encode("password", "UTF-8") 
             + "=" + URLEncoder.encode(password, "UTF-8");
             URL url = new URL(link);
             URLConnection conn = url.openConnection(); 
             conn.setDoOutput(true); 
             OutputStreamWriter wr = new OutputStreamWriter
             (conn.getOutputStream()); 
             wr.write( data ); 
             wr.flush(); 
             BufferedReader reader = new BufferedReader
             (new InputStreamReader(conn.getInputStream()));
             StringBuilder sb = new StringBuilder();
             String line = null;
             // Read Server Response
             while((line = reader.readLine()) != null)
             {
                sb.append(line);
                break;                
             } 
             return sb.toString();
          } catch(Exception e){
             return new String("Exception: " + e.getMessage());
          }
          
       }
    }
    @Override
    protected void onPostExecute(String result){     
        
        
        Log.v(result, "result");
        int intZahl = Integer.parseInt(result);
        //Integer intZahl = Integer.valueOf(result);
        //Log.v(intZahl, "intZahl");
        if (result != null && intZahl == 1) {
            //Variable übergeben
            Bundle korb = new Bundle();
            korb.putString("username", "testnutzer");
            
            //Neues Intent anlegen
        Intent nextScreen = new Intent(context, KstmenuActivity.class);
        nextScreen.putExtras(korb);
         //Intent starten und zur zweiten Activity wechseln
        context.startActivity(nextScreen);
        }
       }
  }
 
Zuletzt bearbeitet:
Ähnliche Themen - login mit php/mysql Antworten Datum
0