1. 程式人生 > >Android客戶端通過PHP訪問MySQL資料庫

Android客戶端通過PHP訪問MySQL資料庫

為了寫這篇文章,準備了很長的時間,自己也學習很多新的知識,譬如簡單學習了伺服器端的語言PHP,MySQL資料庫以及也瞭解了Http協議。收穫很大,學到了很多新的知識,對C/S架構模式,有了更近一步的瞭解。對近期學習也做一個總結,同時給想做這方面東西的博友們,一點啟發,自己就心滿意足了。在不久之前,也簡單收集了一些資料,然後發表在部落格上,沒有想到的是,到目前為止,這篇部落格成為我寫的所有部落格裡,訪問量最多的文章,雖然部落格的整體訪問量,少的可憐。之前那篇部落格文章的名字叫做《Android客戶端通過WebService訪問MySql資料庫》,一直也不明白什麼是WebService,然後就查閱了相關的資料。
WebService是一種跨程式語言和跨作業系統平臺的遠端呼叫技術,通俗一點理解,就是遠端的某個伺服器公開了某種服務,而我們可以通過程式設計來呼叫這種服務,以獲得我們所需要的資訊。舉個例子,就是Android手機呼叫支付寶的介面。該博文的題目就是WebService一種體現。
先簡單介紹一下,這個小專案,也算不上是小專案,姑且就叫它小專案。總體的實現思路。在伺服器端,我是通過PHP的mysqli擴充套件庫去連線的MySQL資料庫,在Android客戶端,我通過網路請求去訪問Apache伺服器就OK了。

  1. 軟硬體環境
    Android Studio2.2版本
    軟體整合包XAMPP
    真機 華為榮耀3C

2.建立MySQL資料庫以及表
a.建立資料庫

create database persondb;

b.建立資料表

create table persons(Id_P int(11),LastName varchar(255), FirstName varchar(255),Address varchar(255), City varchar(255));

建立之後的結果如下所示:
這裡寫圖片描述
資料庫方面建立OK了,接下來做PHP的mysqli擴充套件庫連線MySQL資料庫

3.PHP的mysqli擴充套件庫連線MySQL資料庫

a.先寫個配置檔案db_config.php

<?php

/*
 * All database connection variables
 */

define('DB_USER', "root"); // db user
define('DB_PASSWORD', ""); // db password (mention your db password here)
define('DB_DATABASE', "persondb"); // database name
define('DB_SERVER', "localhost"); // db server
?>

b.連線MySQL資料庫的檔案db_connect.php

<?php

/**
 * A class file to connect to database
 */
/**
 * Function to connect with database
 */
function connect() {

   /*包含並執行指定的檔案*/
  // import database connection variables
  require_once __DIR__ . '/db_config.php';

  global $con;
  // Connecting to mysql database
  $con = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysqli_connect_error());

  // Selecing database
  $db = mysqli_select_db($con,DB_DATABASE) or die(mysqli_error($con)) ;

  // returing connection cursor
  return $con;
 }

/**
  * Function to close db connection
*/
  function close() {
   // closing db connection
   global $con;
   mysqli_close($con);
   } 
?>

c. Android客戶端從MySQL資料庫裡獲取資料的檔案get_all_persons.php

<?php

/*
 * Following code will list all the products
 */

// array for JSON response
$response = array();

// include db connect class
require_once __DIR__ . '/db_connect.php';

// connecting to db
connect();

// get all products from products table
$result = mysqli_query($con,"SELECT *FROM persons") or die(mysqli_error());

// check for empty result
if (mysqli_num_rows($result) > 0) {
    // looping through all results
    // products node
    $response["persons"] = array();

    while ($row = mysqli_fetch_array($result)) {
        // temp user array
        $info = array();
        $info["Id_P"] = $row["Id_P"];
        $info["LastName"] = $row["LastName"];
        $info["FirstName"] = $row["FirstName"];
        $info["Address"] = $row["Address"];
        $info["City"] = $row["City"];

        // push single product into final response array
        array_push($response["persons"], $info);
    }
    // success
    $response["success"] = 1;

    // echoing JSON response
    echo json_encode($response);
} else {
    // no products found
    $response["success"] = 0;
    $response["message"] = "No products found";

    // echo no users JSON
    echo json_encode($response);
}
  close();
?>

d.Android客戶端向MySQL資料庫插入資料的檔案create_person.php

<?php
   $result = file_get_contents('php://input');
   $object=json_decode($result);
   $Id_P = $object->{'Id_P'};
   $LastName=$object->{'LastName'};
   $FirstName=$object->{'FirstName'};
   $Address=$object->{'Address'};
   $City=$object->{'City'};

/* 
 * Following code will create a new person row
 * All person details are read from HTTP Post Request
 */

// array for JSON response
  $response = array();

// check for required fields
if (isset($Id_P) || isset($LastName) || isset($FirstName) || isset($Address) || isset($City)) {


    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    connect();

    // mysql inserting a new row
    $result = mysqli_query($con,"INSERT INTO persons(Id_P,LastName,FirstName,Address,City) VALUES('$Id_P', '$LastName','$FirstName','$Address','$City')");

    // check if row inserted or not
    if ($result) {
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = "Person successfully created.";

        // echoing JSON response
        echo json_encode($response);
    } else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

建立一個資料夾android_connect,把以上的所有php檔案都放在該資料夾裡,並把android_connect 資料夾放在xampp安裝目錄裡htdocs資料夾下。

4.Android客戶端通過網路訪問MySQL資料庫

先上佈局檔案activity_main.xml

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.android.androidconnectserver.MainActivity">

    <Button
        android:text="向MYSQL資料庫插入資料"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/Send"
        />

    <Button
        android:text="從MYSQL資料庫獲取資料"
        android:layout_below="@id/Send"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/Receive"
        />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/Receive"
        android:layout_marginTop="5dp"
        android:text="textView"
        android:textSize="20sp"/>
</RelativeLayout>

該佈局檔案是Android客戶端向MySQL資料庫插入資料時的一個自定義對話方塊的佈局檔案dialog_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:paddingLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Id_P :"
            />
        <EditText
            android:id="@+id/et_Id_P"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:hint="請輸入資訊"/>

    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:paddingLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LastName :"
            />
        <EditText
            android:id="@+id/et_LastName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:hint="請輸入資訊"/>
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:paddingLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="FirstName :"
            />
        <EditText
            android:id="@+id/et_FirstName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:hint="請輸入資訊"/>
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:paddingLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Address :"
            />
        <EditText
            android:id="@+id/et_Address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:hint="請輸入資訊"/>

    </LinearLayout>

    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:paddingLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="City :"
        />
    <EditText
        android:id="@+id/et_City"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:hint="請輸入資訊"/>
     </LinearLayout>
</LinearLayout>

最後出場Android端的程式碼,各位小夥伴們注意了。

package com.android.androidconnectserver;

import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    public static final String TAG="MainActivity";
    private Button Send;
    private Button Receive;
    private TextView textView;
    private String response;
    private EditText inputId_P;
    private EditText inputLastName;
    private EditText inputFirstName;
    private EditText inputAddress;
    private EditText inputCity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        Receive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               receive();
               textView.setText(response);

            }
        });
        Send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });
    }

    public void initViews(){
        Send =(Button) findViewById(R.id.Send);
        Receive= (Button) findViewById(R.id.Receive);
        textView=(TextView) findViewById(R.id.textView);

    }



    /*從MySQL裡獲取資料*/
    private void receive() {
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        response=executeHttpGet();
                    }
                }

        ).start();
    }
    private String executeHttpGet() {

        HttpURLConnection con=null;
        InputStream in=null;
        String      path="http://172.27.35.1/android_connect/get_all_persons.php";
        try {
            con= (HttpURLConnection) new URL(path).openConnection();
            con.setConnectTimeout(5000);
            con.setReadTimeout(5000);
            con.setDoInput(true);
            con.setRequestMethod("GET");
            if(con.getResponseCode()==200){

                in=con.getInputStream();
                return parseInfo(in);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    private String parseInfo(InputStream in) throws IOException {
        BufferedReader  br=new BufferedReader(new InputStreamReader(in));
        StringBuilder sb=new StringBuilder();
        String line=null;
        while ((line=br.readLine())!=null){
            sb.append(line+"\n");
        }
        Log.i(TAG, "parseInfo: sb:"+sb.toString());
        return sb.toString();
    }

    /*傳送資料給MySQL資料庫*/

    private void showDialog(){
        AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("添加個人資訊");
        View view= View.inflate(MainActivity.this,R.layout.dialog_custom,null);
        builder.setView(view);


        builder.setPositiveButton("確定", new OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                String Id_P=inputId_P.getText().toString();
                String LastName=inputLastName.getText().toString();
                String FirstName=inputFirstName.getText().toString();
                String Address=inputAddress.getText().toString();
                String City=inputCity.getText().toString();
                try {
                    jsonObject.put("Id_P",Id_P);
                    jsonObject.put("LastName",LastName);
                    jsonObject.put("FirstName",FirstName);
                    jsonObject.put("Address",Address);
                    jsonObject.put("City",City);
                } catch (JSONException e) {
                    e.printStackTrace();
                };
                send();
            }
        });
        builder.setNegativeButton("取消",new OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        AlertDialog ad=builder.create();
        ad.show();

        inputId_P= (EditText)ad.findViewById(R.id.et_Id_P);
        inputLastName= (EditText)ad.findViewById(R.id.et_LastName);
        inputFirstName= (EditText)ad.findViewById(R.id.et_FirstName);
        inputAddress= (EditText)ad.findViewById(R.id.et_Address);
        inputCity= (EditText)ad.findViewById(R.id.et_City);

    }
    private void send() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                executeHttpPost();
            }
        }).start();

    }
    JSONObject jsonObject=new JSONObject();
    private void executeHttpPost() {
        HttpURLConnection con=null;
        String path="http://172.27.35.1/android_connect/create_person.php";
        try {
            URL url=new URL(path);
            con= (HttpURLConnection) url.openConnection();
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setRequestMethod("POST");
            con.setRequestProperty("Connection", "keep-alive");

            con.connect();
            DataOutputStream out=new DataOutputStream(con.getOutputStream());
            out.flush();
            if (con.getResponseCode()==HttpURLConnection.HTTP_OK){
                InputStream in=con.getInputStream();
                byte [] buf=new byte[in.available()];
                in.read(buf);
                String str=new String(buf);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.執行結果
a.向MySQL資料庫插入資料
點擊向MySQL資料庫插入資料的按鈕,會彈出如下圖所示的執行結果,在裡面輸入資料,單擊確定就可以向資料庫中插入資料了,通過查詢資料庫,可以檢視資料是否插入成功。
這裡寫圖片描述

b.從MySQL資料庫獲取資料
點選從MySQL資料庫獲取資料的按鈕,就會JSON格式的字串,執行結果如下所示:
這裡寫圖片描述
以上就是一個多月學習的一個簡單的總結,如果程式碼有什麼問題,還請各位小夥伴批評指正,讓我有進步的機會。最後別忘了開啟XAMPP的控制面板,啟動Apache伺服器和MySQL資料庫,同時Android手機要和XAMPP軟體所在的計算機在同一個區域網中。

相關推薦

Android客戶通過PHP訪問MySQL資料庫

為了寫這篇文章,準備了很長的時間,自己也學習很多新的知識,譬如簡單學習了伺服器端的語言PHP,MySQL資料庫以及也瞭解了Http協議。收穫很大,學到了很多新的知識,對C/S架構模式,有了更近一步的瞭解。對近期學習也做一個總結,同時給想做這方面東西的博友們,一點

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.0.10' (111) 客戶連線 centos 7 mysql 資料庫失敗

參考 https://stackoverflow.com/questions/1673530/error-2003-hy000-cant-connect-to-mysql-server-on-127-0-0-1-111 排查了 /etc/my.cnf 裡面的 bin

PHP訪問MySql資料庫 初級篇

在網站後臺,經常要與資料庫打交道。本文介紹如何使用XAMPP來管理MySql資料庫及如何用PHP來訪問MySql資料庫。 一.使用XAMPP來管理MySql資料庫 首先使用XAMPP開啟MySql的管理頁面。步驟如下:啟動XAMPP後點擊Admin進入XAMPP for Windows的主頁面,

PHP訪問MySql資料庫 高階篇 AJAX技術

                在前面的文章,我們已經開發了一個能夠讀取資料庫並顯示資料的程式,且程式達到了良好的介面與邏輯分離。但是這個程式並不能支援我們對資料庫進行增加、刪除和修改操作。因此在這裡增加這些功能。每次增加刪除或修改資料時,通過AJAX方式向後臺傳送請求,再根據後臺的返回結果調整頁面顯示。這種

如何通過ip訪問MySql資料庫

如果你想通過IP地址連線到你的mysql資料庫時發生如下錯誤錯誤: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server 解決方法如下: 1.改表法。可能是你的帳

Android客戶通過TCP接收伺服器傳送的資料

引言   因為我確實不懂TCP通訊這一塊兒,最近專案中要實現客戶端接收伺服器端傳送過來的資料(這個資料是int型的,範圍是0~360,而且伺服器端用C語言寫的,每一秒傳送一次,客戶端只需要不斷接收就好了),很開心的用BufferedReader讀取資料,結果發現一直讀取不到資

Android客戶PHP服務通訊(五)---移植使用極光推送

概述     上一節備研究了示例工程的框架,本節準備自己建立工程,並將極光推送移植到其上。 建立工程     首先建立一個工程,工程名和應用名為lovelife,包名com.lygk.lovelife     一直“Next”,直到Finish,此時建立工程完畢,如下圖

Android客戶PHP服務通訊(三)---極光推送註冊使用

概述     推送訊息的方式有很多,在這裡我選擇了極光推送。本節分為上下兩部分,首先通過註冊極光推送並使用其Demo程式來看一下推送的效果,然後再一步一步的修改到自己的應用上。註冊登入極光推送     開發人員基本上都瞭解使用第三方的庫,很多都需要註冊才能使用,極光推送也不

android客戶php伺服器的json資料簡單互動(二)

上一篇文章講的是最簡單的通過接送的格式完成android客戶端與php伺服器互動,也就是通過JSONObject物件來進行互動。         從上篇的文章程式碼就可以看出來,如果php陣列僅僅採用鍵值對的方式進行儲存,通過很簡單的方式轉換為json格式,之後在andr

本機可通過ip訪問Mysql資料庫的小方式

1:win+R鍵入cmd2:在cmd中鍵入”mysql -u root -p“Tips:其中,root是使用者名稱稱,可以根據需要進行更改3:在cmd中鍵入”show databases;“確認下你的所有資料庫。4:在cmd中鍵入“grant all privileges o

通過Grafana訪問Mysql/MariaDB -- Web資料庫管理、分析、視覺化工具

前提條件: 首先保證已經安裝了Grafana資料視覺化管理平臺,訪問 http:your-ip-address:3000 , 預設賬戶 admin/admin 如果您不知道如何安裝Grafana管理平臺,可以檢視一下連結 資料視覺化元件Grafana詳細解讀--MacOSX上的安裝:ht

Android手機客戶通過JSP實現與Tomcat伺服器通訊(Msql資料庫,Json作為載體)--服務程式碼

伺服器端主要程式碼: 1.首先構建一個Person類,用來儲存使用者資訊 public class Person private String name; private String address; private Integer age; public P

怎麼通過web伺服器訪問MYSQL資料庫,使其資料同步到android SQLite資料庫

      通過web伺服器訪問MYSQL資料庫有以下幾個過程: 2、連線資料庫。 3、訪問資料庫      過程2、3 具體步驟: 1、在Myeclipse下新建一個web專案,為了好統一管理在WEB-INF下建一個web.xml用來載入伺服器啟動時的配置資訊。這

通過web伺服器訪問MYSQL資料庫,使其資料同步到android SQLite資料庫

      通過web伺服器訪問MYSQL資料庫有以下幾個過程: 2、連線資料庫。 3、訪問資料庫      過程2、3 具體步驟: 1、在Myeclipse下新建一個web專案,為了好統一管理在WEB-INF下建一個web.xml用來載入伺服器啟動時的配

Android客戶程式通過Web Service實現對伺服器資料庫的查詢

1.eclipse+webservice開發例項 http://blog.csdn.net/xw13106209/article/details/7049614/ 2.java通過JDBC連結SQLServer2012 http://blog.csdn.net/stewen_001/article/det

51 信用卡管家 Android 客戶內部資料庫檔案可被盜取

原文: 真的安全嗎之51信用卡管家Android客戶端審計報告 1.講這個漏洞先要介紹一下一個安卓系統特性:db-journal 檔案是 sqlite 的一個臨時的日誌檔案,主 要用於 sqlite 事務回滾機制,在事務開始時產生,在事務結束時刪除;當程式發生崩潰或者系統斷 電時該檔案將留

FastDFS的Python客戶 -- 通過客戶上傳圖片並訪問

本文的前提是已經啟動FastDFS的tracker和storage ㈠ 安裝 將檔案 fdfs_client-py-master.zip 存放在pycharm中,然後再終端進行安裝: pip install fdfs_client-py-master.zip (安裝包後

Android通過jdbc連線mySQL資料庫時,資料庫拒絕連線

原因: mysql伺服器出於安全考慮,預設只允許本機使用者通過命令列登入。 解決方案: 先通過localhost登入mysql伺服器 將mysql伺服器的mysql資料庫的user表中root使用者的Host欄位改為"%"。 操作如下: window+r 輸

實現PHP伺服器+Android客戶(Retrofit+RxJava)第一天基礎搭建

前段不知道怎麼的android寫著寫著有些寫不動了,於是開始搗鼓php,想要自己寫個網站什麼的裝裝逼,於是最近android就有些荒廢了,說要解析fresco的也放了很久,之前在github上提問,昨天突然收到了facebook工程師的回信,又記起來這件事情,本

實現PHP伺服器+Android客戶(Retrofit+RxJava)第四天客戶與伺服器通訊的實現

我的上一篇文章已經介紹了retrofit+rxjava的配置(包括快取),從這一篇開始就開始講我要實現的這個app網路請求部分的構思,也就是要請求那些資料,資料的型別等等。 我要實現的客戶端 看圖: 看了介面基本應該能知道要實現的效果了