Android has deprecated the Apache module(HttpPost and HttpGet) since API level 22, Now the alternate way is to use JAVA’s HttpURLConnection Class. This tutorial depict Android PHP Mysql login to deal with GET and POST data.

Android php mysql login system contains two android activities, MainActivity.java and SuccessActivity.java. MainActivity is actual login form where you can see username,password and a button whereas SuccessActivity is a plain form with success message which triggers after successful login. The functions of both activity are detailed in Android section below.

Apart from android part the mysql and php implimentation is considerably easy to do.

Download Code From Github

Android MySQL PHP LogIn demo

MySql

Table ‘tbl_login’ contains username and password of user.

CREATE TABLE 'tbl_login' ( 'email' varchar ( 255 ) NOT NULL , 'password' varchar ( 255 ) NOT NULL ) ;

Table holds data row like this.

INSERT INTO 'tbl_login' ( 'email' , 'password' ) VALUES ( 'gpkharvi@gmail.com' , 'password' ) ;

PHP

include config.inc.php file to connect database. Check if POST data is set from android. Query the database to see row exist or not. Return the result.

login.inc.php

<?php include 'config.inc.php' ; // Check whether username or password is set from android if ( isset ( $_POST [ 'username' ] ) & & isset ( $_POST [ 'password' ] ) ) { // Innitialize Variable $result = '' ; $username = $_POST [ 'username' ] ; $password = $_POST [ 'password' ] ; // Query database for row exist or not $sql = 'SELECT * FROM tbl_login WHERE email = :username AND password = :password' ; $stmt = $conn - > prepare ( $sql ) ; $stmt - > bindParam ( ':username' , $username , PDO : : PARAM_STR ) ; $stmt - > bindParam ( ':password' , $password , PDO : : PARAM_STR ) ; $stmt - > execute ( ) ; if ( $stmt - > rowCount ( ) ) { $result = "true" ; } elseif ( ! $stmt - > rowCount ( ) ) { $result = "false" ; } // send result back to android echo $result ; } ?>

config.inc.php

<?php $servername = "localhost" ; $username = "root" ; $password = "root" ; $dbname = "9tutorials" ; try { $conn = new PDO ( "mysql:host= $servername ;dbname= $dbname " , $username , $password ) ; $conn - > setAttribute ( PDO : : ATTR_ERRMODE , PDO : : ERRMODE_EXCEPTION ) ; } catch ( PDOException $e ) { die ( "OOPs something went wrong" ) ; } ?>

Android

The image on the top of page shows both MainActivity.java and SuccessActivity.java respectively.

MainActivity.java

On LogIn button click checkLogin() function is triggered. Which innitiate AsyncLogin class to carry out Asynchronous task. onPreExecute() , invoked on the UI thread before the task is executed. Here We are displaying loading message. doInBackground(Params…) , invoked on the background thread immediately after

onPreExecute() finishes executing. The sending and recieving data from and to php file using HttpURLConnection class has done in this function. onPostExecute(Result) , invoked on the UI thread after the background computation finishes. Here we are checking for recieved result. The parameters params[0] and params[1] is from AsyncLogin’s execute method.

package com . guru . login ; import android . app . ProgressDialog ; import android . content . Intent ; import android . content . SharedPreferences ; import android . net . Uri ; import android . os . AsyncTask ; import android . support . v7 . app . AppCompatActivity ; import android . os . Bundle ; import android . view . View ; import android . widget . EditText ; import android . widget . Toast ; import java . io . BufferedReader ; import java . io . BufferedWriter ; import java . io . IOException ; import java . io . InputStream ; import java . io . InputStreamReader ; import java . io . OutputStream ; import java . io . OutputStreamWriter ; import java . net . HttpURLConnection ; import java . net . MalformedURLException ; import java . net . URL ; public class MainActivity extends AppCompatActivity { // CONNECTION_TIMEOUT and READ_TIMEOUT are in milliseconds public static final int CONNECTION_TIMEOUT = 10000 ; public static final int READ_TIMEOUT = 15000 ; private EditText etEmail ; private EditText etPassword ; @ Override protected void onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ) ; setContentView ( R . layout . activity_main ) ; // Get Reference to variables etEmail = ( EditText ) findViewById ( R . id . email ) ; etPassword = ( EditText ) findViewById ( R . id . password ) ; } // Triggers when LOGIN Button clicked public void checkLogin ( View arg0 ) { // Get text from email and passord field final String email = etEmail . getText ( ) . toString ( ) ; final String password = etPassword . getText ( ) . toString ( ) ; // Initialize AsyncLogin() class with email and password new AsyncLogin ( ) . execute ( email , password ) ; } private class AsyncLogin extends AsyncTask<String, String, String> { ProgressDialog pdLoading = new ProgressDialog ( MainActivity . this ) ; HttpURLConnection conn ; URL url = null ; @ Override protected void onPreExecute ( ) { super . onPreExecute ( ) ; //this method will be running on UI thread pdLoading . setMessage ( " \t Loading..." ) ; pdLoading . setCancelable ( false ) ; pdLoading . show ( ) ; } @ Override protected String doInBackground ( String . . . params ) { try { // Enter URL address where your php file resides url = new URL ( "http://localhost/test/login.inc.php" ) ; } catch ( MalformedURLException e ) { // TODO Auto-generated catch block e . printStackTrace ( ) ; return "exception" ; } try { // Setup HttpURLConnection class to send and receive data from php and mysql conn = ( HttpURLConnection ) url . openConnection ( ) ; conn . setReadTimeout ( READ_TIMEOUT ) ; conn . setConnectTimeout ( CONNECTION_TIMEOUT ) ; conn . setRequestMethod ( "POST" ) ; // setDoInput and setDoOutput method depict handling of both send and receive conn . setDoInput ( true ) ; conn . setDoOutput ( true ) ; // Append parameters to URL Uri . Builder builder = new Uri . Builder ( ) . appendQueryParameter ( "username" , params [ 0 ] ) . appendQueryParameter ( "password" , params [ 1 ] ) ; String query = builder . build ( ) . getEncodedQuery ( ) ; // Open connection for sending data OutputStream os = conn . getOutputStream ( ) ; BufferedWriter writer = new BufferedWriter ( new OutputStreamWriter ( os , "UTF-8" ) ) ; writer . write ( query ) ; writer . flush ( ) ; writer . close ( ) ; os . close ( ) ; conn . connect ( ) ; } catch ( IOException e1 ) { // TODO Auto-generated catch block e1 . printStackTrace ( ) ; return "exception" ; } try { int response_code = conn . getResponseCode ( ) ; // Check if successful connection made if ( response_code = = HttpURLConnection . HTTP_OK ) { // Read data sent from server InputStream input = conn . getInputStream ( ) ; BufferedReader reader = new BufferedReader ( new InputStreamReader ( input ) ) ; StringBuilder result = new StringBuilder ( ) ; String line ; while ( ( line = reader . readLine ( ) ) ! = null ) { result . append ( line ) ; } // Pass data to onPostExecute method return ( result . toString ( ) ) ; } else { return ( "unsuccessful" ) ; } } catch ( IOException e ) { e . printStackTrace ( ) ; return "exception" ; } finally { conn . disconnect ( ) ; } } @ Override protected void onPostExecute ( String result ) { //this method will be running on UI thread pdLoading . dismiss ( ) ; if ( result . equalsIgnoreCase ( "true" ) ) { /* Here launching another activity when login successful. If you persist login state use sharedPreferences of Android. and logout button to clear sharedPreferences. */ Intent intent = new Intent ( MainActivity . this , SuccessActivity . class ) ; startActivity ( intent ) ; MainActivity . this . finish ( ) ; } else if ( result . equalsIgnoreCase ( "false" ) ) { // If username and password does not match display a error message Toast . makeText ( MainActivity . this , "Invalid email or password" , Toast . LENGTH_LONG ) .show() ; } else if ( result . equalsIgnoreCase ( "exception" ) | | result . equalsIgnoreCase ( "unsuccessful" ) ) { Toast . makeText ( MainActivity . this , "OOPs! Something went wrong. Connection Problem." , Toast . LENGTH_LONG ) .show() ; } } } }

activity_main.xml

The xml file for MainActivity.java.

<? xml version = " 1.0 " encoding = " utf-8 " ?> < RelativeLayout xmlns : android = " http : // schemas.android.com /apk/res/android " xmlns : tools = " http : // schemas.android.com /tools " android : layout_width = " match_parent " android : layout_height = " match_parent " android : paddingLeft = " @dimen/activity_horizontal_margin " android : paddingRight = " @dimen/activity_horizontal_margin " android : paddingTop = " @dimen/activity_vertical_margin " android : paddingBottom = " @dimen/activity_vertical_margin " tools : context = " .MainActivity " > < EditText android : layout_width = " match_parent " android : layout_height = " wrap_content " android : inputType = " textEmailAddress " android : ems = " 10 " android : id = " @+id/email " android : layout_alignParentTop = " true " android : layout_alignParentLeft = " true " android : layout_alignParentStart = " true " android : hint = " Email " android : layout_marginTop = " 10dp " /> < EditText android : layout_width = " match_parent " android : layout_height = " wrap_content " android : inputType = " textPassword " android : ems = " 10 " android : id = " @+id/password " android : layout_below = " @+id/email " android : hint = " Password " android : layout_marginTop = " 10dp " /> < Button android : layout_width = " match_parent " android : layout_height = " wrap_content " android : text = " LOGIN " android : id = " @+id/button " android : layout_below = " @+id/password " android : layout_marginTop = " 10dp " android : onClick = " checkLogin " /> </ RelativeLayout >

SuccessActivity.java

This Activity is launched from onPreExecute() method after login success.

package com . guru . login ; import android . support . v7 . app . AppCompatActivity ; import android . os . Bundle ; public class SuccessActivity extends AppCompatActivity { @ Override protected void onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ) ; setContentView ( R . layout . activity_success ) ; } }

activity_success.xml

The xml file for SuccessActivity.java.

<? xml version = " 1.0 " encoding = " utf-8 " ?> < RelativeLayout xmlns : android = " http : // schemas.android.com /apk/res/android " xmlns : tools = " http : // schemas.android.com /tools " android : layout_width = " match_parent " android : layout_height = " match_parent " android : paddingLeft = " @dimen/activity_horizontal_margin " android : paddingRight = " @dimen/activity_horizontal_margin " android : paddingTop = " @dimen/activity_vertical_margin " android : paddingBottom = " @dimen/activity_vertical_margin " > < TextView android : layout_width = " wrap_content " android : layout_height = " wrap_content " android : textAppearance = " ?android:attr/textAppearanceLarge " android : text = " WELCOME " android : id = " @+id/textView " android : layout_alignParentTop = " true " android : layout_centerHorizontal = " true " android : layout_marginTop = " 62dp " /> < TextView android : layout_width = " wrap_content " android : layout_height = " wrap_content " android : textAppearance = " ?android:attr/textAppearanceMedium " android : text = " Successfully LoggedIn " android : id = " @+id/textView2 " android : layout_marginTop = " 46dp " android : layout_below = " @+id/textView " android : layout_centerHorizontal = " true " /> </ RelativeLayout >

AndroidManifest.xml

Don’t forget to add uses-permission and SuccessActivity to your AndroidManifest.xml file.