Les modules Apache pour Android est deprecated (ésapprouvé) pour la création de notre page de connexion Android PHP/MySQL, cependant, depuis le niveau 22 de l’API. Maintenant, l’alternative est d’utiliser la classe HttpURLConnection de JAVA.
Comment créer une page de connexion Android avec PHP/MySQL
La creation de notre application pages de connexion Android PHP/MySQL contient deux activités, MainActivity.java et SuccessActivity.java. MainActivity est un formulaire de connexion réel où vous pouvez voir le nom d’utilisateur, le mot de passe et un bouton, tandis que SuccessActivity est une forme simple avec un message de succès qui se déclenche après une connexion réussie. Les fonctions de ces deux activités sont détaillées dans la section Android ci-dessous.
1. MySQL
On crée la table tbl_login
CREATE TABLE 'tbl_login' ( 'email' varchar(255) NOT NULL, 'password' varchar(255) NOT NULL );
Et on insere les données dans la table créée
INSERT INTO 'tbl_login' ('email', 'password') VALUES ('gpkharvi@gmail.com', 'password');
2. PHP
2.1 Inclure le fichier config.inc.php pour connecter la base de données.
2.2. Vérifiez si les données POST sont définies à partir d’Android.
2.3. Interrogez la base de données pour voir la ligne existe ou pas.
2.4. Return le résultat.
Le fichier 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; } ?>
Le fichier 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");
}
?>
3. Android
L’image en haut de la page affiche à la fois MainActivity.java et SuccessActivity.java.
en appuyant sur le bouton LogIn, la fonction checkLogin () est appelée. la classe initie AsyncLogin pour effectuer une tâche asynchrone.
onPreExecute (), invoquée sur le thread de l’interface utilisateur avant l’exécution de la tâche. Ici, nous affichons le message de chargement.
doInBackground (Params …), invoquée sur le fil d’arrière-plan immédiatement après
onPreExecute () termine l’exécution. L’envoi et la réception de données depuis et vers le fichier PHP à l’aide de la classe HttpURLConnection ont été effectués dans cette fonction.
onPostExecute(Résultat), invoquée sur le thread d’interface utilisateur après la fin du calcul de l’arrière-plan. Ici, nous vérifions le résultat reçu.
Les paramètres params [0] et params [1] proviennent de la méthode d’exécution AsyncLogin.
MainActivity.java
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("tLoading..."); 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(); } } } }
le fichier XML avtivity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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>
Le fichier success_activity.java
Cette classe ne s’affiche que si Cette activité est lancée à partir de la méthode OnreFexecute () après le succès de la connexion.
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); } }
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.guru.login" > <uses-permission android_name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android_name="android.permission.INTERNET" /> <application android_allowBackup="true" android_icon="@mipmap/ic_launcher" android_label="@string/app_name" android_supportsRtl="true" android_theme="@style/AppTheme" > <activity android_name=".MainActivity" > <intent-filter> <action android_name="android.intent.action.MAIN" /> <category android_name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android_name=".SuccessActivity" > </activity> </application> </manifest>