Вход в Android и регистрация с PHP MySQL

  1. Настройка сервера XAMPP
  2. Настройка базы данных MySQL
  3. Подключение PHP к базе данных MySQL
  4. О Анупам Чуг

Вход в Android и регистрация - очень распространенные сценарии. Вы найдете регистрацию и вход в систему во всех приложениях, где мы хотим, чтобы пользовательская информация. В этом руководстве мы настроим локальный веб-сервер и базу данных MySQL. Мы разработаем приложение для входа и регистрации Android. Мы будем использовать PHP-скрипт для подключения к базе данных MySQL.

Первым шагом является создание внутреннего веб-сервера. Я работаю на Mac OS X, и XAMPP можно использовать для быстрой настройки локального веб-сервера Apache и базы данных MySQL.

Настройка сервера XAMPP

XAMPP (или WAMP) - это программа установки одним нажатием, которая создает среду для разработки веб-приложения MySQL на PHP (которое мы будем связывать с нашим приложением для Android).

Загрузите и установите XAMPP с Вот ,

Запустите приложение XAMPP после установки, и вы увидите экран ниже.

Вы можете проверить свой сервер, открыв http: // localhost. Должен появиться следующий экран.

Также вы можете проверить phpMyAdmin, открыв http: // localhost / phpmyadmin. Посмотрим что это покажет!

OOPS ! Вы можете получить такой экран. Похоже, сервер MySQL не работает должным образом. Перейдите на вкладку «Управление серверами» в приложении XAMPP и нажмите «перезагрузить все». Серверы должны работать правильно, как показано на рисунке ниже.

Теперь протестируйте phpMyAdmin на локальном хосте, и вы получите экран, похожий на этот.

Теперь давайте проверим пример PHP-скрипта. Создайте новый файл test.php и добавьте в него следующие строки.


копия

<? php echo "Hello, World"; ?>

В приведенном выше коде:

  • ? php начинает открывать тег для любого скрипта PHP.
  • ?> означает закрывающий тег как закрывающая скобка в Java.

Примечание. Знание PHP не обязательно для этого урока.

если вы используете MAC, перейдите в Applications-> Xampp-> htdocs. Создайте новую папку здесь, скажем test_android и скопируйте и вставьте test.php, который был создан ранее. Теперь откройте URL http: //localhost/test_android/test.php

Вы получите такой экран:

Настройка базы данных MySQL

Откройте phpMyAdmin, посетив http: // localhost / phpmyadmin.
Теперь выберите вкладку «Базы данных» в левом верхнем углу строки заголовков. Дайте случайное имя и создайте его. Вновь созданная пустая база данных будет видна на левой боковой панели.

Давайте создадим таблицу пользователей во вновь созданной базе данных. Запустите следующий запрос в консоли


копия

CREATE TABLE `firstDB` .users` (` id` INT NOT NULL AUTO_INCREMENT ПЕРВИЧНЫЙ КЛЮЧ, `username` VARCHAR (20) NOT NULL,` password` VARCHAR (20) NOT NULL)

Если таблица успешно создана, вы получите экран, подобный следующему:

Подключение PHP к базе данных MySQL

Для подключения PHP-скрипта к базе данных MySQL необходимы три входных значения.
Ниже приведены входные данные и значения по умолчанию для сервера XAMPP.

  • Имя хоста: localhost
  • Имя пользователя MySQL: root
  • Пароль MySQL: пусто «»

Давайте создадим скрипт test-connect.php и добавим его в папку htdocs-> test-android.


копия

<? php $ host = "localhost"; $ Пользователь = "корень"; $ Пароль = ""; $ CON = mysql_connect ($ хозяин, $ USER, $ пароль); if ($ con) {echo '<h1> Подключен к MySQL </ h1>'; } else {echo '<h1> MySQL Server не подключен </ h1>'; }?>

mysql_connect () - встроенная функция PHP для подключения к базе данных MySQL с параметрами, перечисленными выше.

Попробуйте запустить http: //localhost/test_android/test-connect.php и посмотреть вывод. Если он не подключен, попробуйте перезапустить серверы XAMPP.

Теперь, когда мы обсудили основные настройки PHP и MySQL, давайте перейдем к части приложения для входа в Android. Мы будем разрабатывать приложение для входа / регистрации. Короче говоря, мы будем проверять, уникальны ли имя пользователя и адрес электронной почты при регистрации. Прежде чем перейти к логике приложения, давайте поработаем над сценариями PHP и базой данных MySQL.

Во-первых, давайте отбросим пользователей таблицы и создадим нового в контексте вышеупомянутого приложения.


копия

СОЗДАЙТЕ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ `firstDB` .users` (` id` int (20) NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` varchar (70) NOT NULL,` password` varchar (40) NOT NULL, `email` varchar (50) NOT NULL, `create_at` datetime NOT NULL,` updated_at` datetime DEFAULT NULL)

Ниже приведены PHP-скрипты, которые вы можете скопировать и вставить в папку htdocs-> test_android.

config.php


копия

<? php define ("DB_HOST", "localhost"); define ("DB_USER", "root"); define ("DB_PASSWORD", ""); define ("DB_NAME", "firstDB"); ?>

Сценарий подключения к базе данных приведен ниже.

дб-connect.php


копия

<? php include_once 'config.php'; class DbConnect {private $ connect; публичная функция __construct () {$ this-> connect = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (mysqli_connect_errno ($ this-> connect)) {echo "Невозможно подключиться к базе данных MySQL:". mysqli_connect_error (); }} публичная функция getDb () {return $ this-> connect; }}?>

Следующий скрипт содержит все основные функции приложения.

user.php


копия

<? php include_once 'db-connect.php'; класс User {private $ db; private $ db_table = "users"; публичная функция __construct () {$ this-> db = new DbConnect (); } публичная функция isLoginExist ($ username, $ password) {$ query = "select * from". $ this-> db_table. ", где username = '$ username' И пароль = '$ password' Limit 1"; $ result = mysqli_query ($ this-> db-> getDb (), $ query); if (mysqli_num_rows ($ result)> 0) {mysqli_close ($ this-> db-> getDb ()); вернуть истину; } mysqli_close ($ this-> db-> getDb ()); вернуть ложь; } публичная функция isEmailUsernameExist ($ username, $ email) {$ query = "select * from". $ this-> db_table. ", где username = '$ username' AND email = '$ email'"; $ result = mysqli_query ($ this-> db-> getDb (), $ query); if (mysqli_num_rows ($ result)> 0) {mysqli_close ($ this-> db-> getDb ()); вернуть истину; } вернуть ложь; } публичная функция isValidEmail ($ email) {return filter_var ($ email, FILTER_VALIDATE_EMAIL)! == false; } публичная функция createNewRegisterUser ($ username, $ password, $ email) {$ isExisting = $ this-> isEmailUsernameExist ($ username, $ email); if ($ isExisting) {$ json ['success'] = 0; $ json ['message'] = "Ошибка регистрации. Возможно, имя пользователя / адрес электронной почты уже существует"; } else {$ isValid = $ this-> isValidEmail ($ email); if ($ isValid) {$ query = "вставить в". $ this-> db_table. "(имя пользователя, пароль, электронная почта, creation_at, updated_at) значения ('$ username', '$ password', '$ email', NOW (), СЕЙЧАС())"; $ вставлен = mysqli_query ($ this-> db-> getDb (), $ query); if ($ вставлен == 1) {$ json ['success'] = 1; $ json ['message'] = "Успешно зарегистрирован пользователь"; } else {$ json ['success'] = 0; $ json ['message'] = "Ошибка регистрации. Возможно, имя пользователя / адрес электронной почты уже существует"; } mysqli_close ($ this-> db-> getDb ()); } else {$ json ['success'] = 0; $ json ['message'] = "Ошибка регистрации. Адрес электронной почты недействителен"; }} return $ json; } публичная функция loginUsers ($ username, $ password) {$ json = array (); $ canUserLogin = $ this-> isLoginExist ($ username, $ password); if ($ canUserLogin) {$ json ['success'] = 1; $ json ['message'] = "Успешный вход в систему"; } else {$ json ['success'] = 0; $ json ['message'] = "Неправильные данные"; } вернуть $ json; }}?>

В приведенном выше коде $ json содержит возвращенные объекты JSONObject.

Следующий скрипт PHP - тот, который вызывается первым из приложения.

index.php


копия

<? php require_once 'user.php'; $ username = ""; $ password = ""; $ email = ""; if (isset ($ _ POST ['username'])) {$ username = $ _POST ['username']; } if (isset ($ _ POST ['пароль'])) {$ password = $ _POST ['пароль']; } if (isset ($ _ POST ['email'])) {$ email = $ _POST ['email']; } $ userObject = new User (); // Регистрация if (! Empty ($ username) &&! Empty ($ password) &&! Empty ($ email)) {$ hashed_password = md5 ($ password); $ json_registration = $ userObject-> createNewRegisterUser ($ username, $ hashed_password, $ email); echo json_encode ($ json_registration); } // Войдите в систему, если (! Empty ($ username) &&! Empty ($ password) && empty ($ email)) {$ hashed_password = md5 ($ password); $ json_array = $ userObject-> loginUsers ($ username, $ hashed_password); echo json_encode ($ json_array); }?>

В приведенном выше коде мы проверяем, является ли поле электронной почты пустым или нет. Если это так, мы вызовем функцию входа в скрипт PHP, иначе мы перейдем к функции регистрации. Ответ JSON возвращает два параметра: success (0 или 1) и сообщение .

  • Функция md5 () использует алгоритм MD5 Message-Digest RSA Data Security, Inc. для создания хеш-строки пароля.
  • Чтобы проверить, является ли адрес электронной почты действительным, мы реализовали метод isValidEmail (). FILTER_VALIDATE_EMAIL работает в версиях PHP 5.2.0+

В этом проекте мы использовали три библиотеки для реализации HTTP-вызовов в нашем приложении.
Класс JSONParser используется для выполнения HTTP-вызовов POST и GET к локальному хосту и возврата ответа в форме JSONObject.

Компоновка activity_main.xml определяется ниже.


копия

<? xml version = "1.0&quot; encoding = "utf-8"?> <ScrollView xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "fill_parent" android: layout_height = "fill_parent" android: fillViewport = "true"> <RelativeLayout android: layout_width = "match_parent" android: layout_height = "wrap_content"> <LinearLayout android: direction = "вертикальный" android: layout_width = "match_parent" android: layout_height = " wrap_content "android: layout_centerInParent =" true "android: paddingLeft =" 24dp "android: paddingRight =" 24dp "android: id =" @ + id / linearLayout "> <EditText android: id =" @ + id / editName "android: layout_width = "match_parent" android: layout_height = "wrap_content" android: hint = "Имя пользователя" android: textColor = "# FF192133" android: textColorHint = "# A0192133" android: fontFamily = "sans-serif-light" android: focusable = "true" android: focusableInTouchMode = "true" /> <EditText android: id = "@ + id / editPassword" android: layout_width = "match_parent" android: layout_height = "wrap_content" android: inputType = "textPassword" android: tex tColor = "# FF192133" android: textColorHint = "# A0192133" android: fontFamily = "sans-serif-light" android: hint = "Пароль" android: focusable = "true" android: focusableInTouchMode = "true" /> <EditText android: id = "@ + id / editEmail" android: layout_width = "match_parent" android: layout_height = "wrap_content" android: inputType = "textEmailAddress" android: textColor = "# FF192133" android: visibility = "ушел" android: textColorHint = "# A0192133" android: fontFamily = "sans-serif-light" android: hint = "Email" android: focusable = "true" android: focusableInTouchMode = "true" /> <Кнопка android: layout_width = "match_parent" android: layout_height = "wrap_content" android: id = "@ + id / btnSignIn" android: text = "SIGN IN" android: textStyle = "bold" /> <Кнопка android: layout_width = "match_parent" android: layout_height = "wrap_content" android : id = "@ + id / btnRegister" android: text = "REGISTER" android: textStyle = "bold" /> </ LinearLayout> </ RelativeLayout> </ ScrollView>

MainActivity.java приведен ниже.


копия

пакет com.journaldev.loginphpmysql; импорт android.content.Intent; import android.content.SharedPreferences; импорт android.graphics.Color; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.util.Log; импорт android.view.View; импорт android.widget.Button; import android.widget.EditText; импорт android.widget.Toast; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; открытый класс MainActivity расширяет AppCompatActivity {EditText editEmail, editPassword, editName; Кнопка btnSignIn, btnRegister; String URL = "http://10.0.3.2/test_android/index.php"; JSONParser jsonParser = new JSONParser (); int i = 0; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); editEmail = (EditText) findViewById (R.id.editEmail); editName = (EditText) findViewById (R.id.editName); editPassword = (EditText) findViewById (R.id.editPassword); btnSignIn = (кнопка) findViewById (R.id.btnSignIn); btnRegister = (кнопка) findViewById (R.id.btnRegister); btnSignIn.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {AttemptLogin tryLogin = new AttemptLogin (); tryLogin.execute (editName.getText (). toString (), toStringring). (), "");}}); btnRegister.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {if (i == 0) {i = 1; editEmail.setVisibility (View.VISIBLE); btnSignIn.setVisibility (View.GONE) ; btnRegister.setText ("CREATE ACCOUNT");} else {btnRegister.setText ("REGISTER"); editEmail.setVisibility (View.GONE); btnSignIn.setVisibility (View.VISIBLE); i = 0; AttemptLogin tryLogin = new (); tryLogin.execute (editName.getText (). toString (), editPassword.getText (). toString (), editEmail.getText (). toString ());}}}); } закрытый класс AttemptLogin extends AsyncTask <String, String, JSONObject> {@Override protected void onPreExecute () {super.onPreExecute (); } @Override защищенный JSONObject doInBackground (String ... args) {String email = args [2]; Строка пароля = аргументы [1]; Строка name = args [0]; ArrayList params = new ArrayList (); params.add (новый BasicNameValuePair («имя пользователя», имя)); params.add (новый BasicNameValuePair («пароль», пароль)); if (email.length ()> 0) params.add (new BasicNameValuePair ("email", email)); JSONObject json = jsonParser.makeHttpRequest (URL, «POST», params); вернуть JSON; } protected void onPostExecute (результат JSONObject) {// закрываем диалоговое окно после удаления продукта //Toast.makeText(getApplicationContext (), result, Toast.LENGTH_LONG) .show (); try {if (result! = null) {Toast.makeText (getApplicationContext (), result.getString ("message"), Toast.LENGTH_LONG) .show (); } else {Toast.makeText (getApplicationContext (), «Невозможно получить какие-либо данные с сервера», Toast.LENGTH_LONG) .show (); }} catch (JSONException e) {e.printStackTrace (); }}}}

Это довольно большой код! Давайте сделаем важные выводы из приведенного выше кода.

  1. http://10.0.3.2 - это адрес перенаправления localhost. Этот адрес работает исключительно, если вы используете эмулятор Genymotion . Используйте http://10.0.2.2 для эмулятора AVD, который теперь значительно улучшен. Если вы запускаете приложение на своем устройстве, используя вместо этого адрес WIFI вашего компьютера. Пример: http://192.168.0.143.
  2. При нажатии кнопки «РЕГИСТРАЦИЯ» мы программно скрываем кнопку «ВХОД» и вместо этого отображаем текстовое поле ввода адреса электронной почты.
  3. Класс AttemptLogin выполняет сетевые HTTP-запросы к нашему локальному узлу в фоновом режиме.
    Имя пользователя, пароль и параметры электронной почты добавляются в ArrayList, который передается в метод makeHttpRequest (URL, «POST», params); класса JSONParser.
  4. В методе onPostExecute мы отображаем строку сообщения, возвращенную с сервера, в сообщении Toast.

Класс JSONParser.java приведен ниже.


копия

пакет com.journaldev.loginphpmysql; импорт android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; импорт java.io.BufferedReader; импорт java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; / ** * Создано anupamchugh 29/08/16. * / public class JSONParser {статический InputStream is = null; статический JSONObject jObj = null; статический JSONArray jArr = null; static String json = ""; статическая ошибка строки = ""; // конструктор public JSONParser () {} // функция получает json из URL //, делая HTTP-метод POST или GET общедоступным JSONObject makeHttpRequest (URL-адрес строки, метод String, параметры ArrayList) {// Выполнение запроса HTTP {// проверка на наличие метод запроса if (method.equals ("POST")) {// метод запроса - POST // defaultHttpClient HttpClient httpClient = new DefaultHttpClient (); HttpPost httpPost = новый HttpPost (url); httpPost.setEntity (новый UrlEncodedFormEntity (params)); try {Log.e ("API123", "" + convertStreamToString (httpPost.getEntity (). getContent ())); Log.e ( "API123", httpPost.getURI () ToString ().); } catch (Exception e) {e.printStackTrace (); } HttpResponse httpResponse = httpClient.execute (httpPost); Log.e ( "API123", "" + httpResponse.getStatusLine () getStatusCode ().); error = String.valueOf (httpResponse.getStatusLine (). getStatusCode ()); HttpEntity httpEntity = httpResponse.getEntity (); is = httpEntity.getContent (); } else if (method.equals ("GET")) {// метод запроса - GET DefaultHttpClient httpClient = new DefaultHttpClient (); String paramString = URLEncodedUtils.format (params, "utf-8"); url + = "?" + paramString; HttpGet httpGet = new HttpGet (url); HttpResponse httpResponse = httpClient.execute (httpGet); HttpEntity httpEntity = httpResponse.getEntity (); is = httpEntity.getContent (); }} catch (UnsupportedEncodingException e) {e.printStackTrace (); } catch (ClientProtocolException e) {e.printStackTrace (); } catch (IOException e) {e.printStackTrace (); } try {BufferedReader reader = new BufferedReader (new InputStreamReader (is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder (); Строка line = null; while ((line = reader.readLine ())! = null) {sb.append (line + "\ n"); } закрыто(); json = sb.toString (); Log.d ( "API123", JSON); } catch (Exception e) {Log.e («Ошибка буфера», «Ошибка преобразования результата» + e.toString ()); } // пытаемся разобрать строку в объекте JSON try {jObj = new JSONObject (json); jObj.put ( "код_ошибки", ошибка); } catch (JSONException e) {Log.e ("Анализатор JSON", "Ошибка анализа данных" + e.toString ()); } // return JSON String return jObj; } private String convertStreamToString (InputStream is) выдает Exception {BufferedReader reader = new BufferedReader (new InputStreamReader (is)); StringBuilder sb = new StringBuilder (); Строка line = null; while ((line = reader.readLine ())! = null) {sb.append (line); } закрыто(); return sb.toString (); }}

В приведенном выше коде мы вызываем соответствующие классы HTTPPost или HTTPGet в зависимости от второго параметра, который передается в функцию makeHttpRequest .


копия

jObj.put ( "код_ошибки", ошибка);

Выше мы добавляем код состояния ответа, возвращенный с сервера, в конечный объект JSONObject, который возвращается в класс MainActivity.

Примечание. Не забудьте добавить следующее разрешение в файл AndroidManifest.xml.


копия

<использует-разрешение android: name = "android.permission.INTERNET" /> Многие пользователи разместили свои комментарии в нижней части этого урока, заявив, что они получают «Невозможно получить данные» тост.
Обратите внимание, что начиная с Android 6.0 и выше вам необходимо добавить следующий атрибут в тег приложения в файле Manifest.xml:

андроид: usesCleartextTraffic = "истина"

Почему так?
Чтобы сетевая безопасность эмулятора / устройства могла выполнять http-вызовы.

Пожалуйста, проверьте вывод с последними скриншотами из эмулятора Android Q ниже.
Последний исходный код с изменениями в файле AndroidManifest.xml обновляется по ссылке и в нашем репозитории Github.

Результат работы приложения приведен ниже.

На скриншоте ниже мы регистрируем нового пользователя, и он добавляется в базу данных.
Затем мы авторизируемся, используя учетные данные, которые мы указали при регистрации.

Android Войти с Php Mysql Окончательный вывод

Это прекращает вход в Android с помощью PHP MySQL Tutorial . Вы можете скачать проект по ссылке ниже. Он также содержит папку test_android, которая содержит файлы PHP. Скопируйте его в папку xampp-> htdocs! Удачи.

Вы также можете получить доступ к полному исходному коду из нашего репозитория Github ниже:

О Анупам Чуг

Он любит изучать новые вещи в Android и iOS. Стреляй в него запросы.

Php echo "Hello, World"; ?
Mysqli_connect_error (); }} публичная функция getDb () {return $ this-> connect; }}?
Quot; encoding = "utf-8"?
Format (params, "utf-8"); url + = "?

Новости

Лучшие костюмы для охоты, рыбалки и туризма — 100450 просмотров
Отдых на свежем воздухе особенно хорош тогда, когда проводишь его комфортно. Поэтому и начинающему, и опытному охотнику, рыболову, туристу нужен качественный, надежный и удобный костюм. При выборе

Балансиры на судака
Зимняя рыбалка на судака – увлекательное занятие. Раньше клыкастого ловили вертикальным блеснением на специальные судачьи блесны. С недавнего времени стали использовать балансиры для судака . Эти новые

Балансиры на Щуку и Окуня: Как выбрать, как ловить на балансир и основные ошибки при ловле на балансир
Балансир – это одна из самых популярных приманок, применяемых для ловли щуки зимой. Как известно, щука охотится в одиночку (в отличие от стаи окуней), поэтому методы, которые позволят нам определить

Зимняя обувь для рыбалки
Мы уже писали о зимней обуви о рыбалке на нашем сайте. Теперь предлагаем вам продолжение обзора обуви.  Начало статьи вы можете прочитать здесь " Обувь для зимней рыбалки ". Очень будем рады. если наш

Выбор зимней палатки для рыбалки
   Палатка для зимней рыбалки – вещь крайне необходимая. Она защищает от непогоды, а в морозы сохраняет тепло, что особенно важно для тех, кто живет в местности с суровой погодой, в любом случае палатка

10 лучших эхолотов
Как вовремя обнаружить косяк Автор: Василий Зуев, Сергей Щетько С появлением рыболовецких эхолотов процесс сидения на берегу или в лодке с удочкой значительно упростился. Теперь вы точно

На что, как ловить окуня зимой: зимние приманки, тонкости ловли
Окунь – рыба, которая в зимний период  наиболее активна, чем несказанно радует любителей подледного лова, «спасая» их даже в самую не клевую погоду. Часто рыболовы называют окуня «палочкой-выручалочкой»-

Выбор палатки для зимней рыбалки
Выбор палатки для зимней рыбалки Водяной Дата: Суббота, 23.01.2010, 21:27 | Сообщение # 1 Сергей Группа: Совет Клуба Сообщений: 3120 Награды: 44 Статус: На рыбалке

Уловистые мормышки и секреты ловли зимой
Рыболовство не только вид хозяйственной деятельности, но и хорошая возможность отдохнуть на природе. Активный отдых, не имеющий временных ограничений, может проводиться не только летом, но и зимой, однако,

Обувь для зимней рыбалки и охоты выбор,описание,модели,отзывы
Нежданов М.   Столкнувшись в зимы 2009-10 и 2010-11 годов с очень неприятными с начала ледостава ледово-снежными условиями, мягко выражаясь - нестандартными, а по большому счету - просто чрезвычайными,

Карта