PHP/MySQL

大约 7 分钟

PHP/MySQL

在本章中,我们将说明如何将PHP和MYSQL与您的android应用程序集成。如果您有网络服务器,并且想在Android应用程序上访问其数据,这将非常有用。MYSQL用作Web服务器上的数据库,PHP用于从数据库中获取数据。我们的应用程序将使用必要的参数与PHP页面进行通信,PHP将联系MYSQL数据库并获取结果并将结果返回给我们。

如果您不熟悉MySQLopen in new windowPHPopen in new window,请到我们的教程学习。

创建数据库

使用此简单脚本可以轻松创建MYSQL数据库。用CREATE DATABASE语句创建数据库。

  <?php
     $con=mysqli_connect("example.com","username","password");
     $sql="CREATE DATABASE my_db";
     if (mysqli_query($con,$sql)) {
        echo "数据库 my_db 建立成功";
     }
  ?>

创建表

创建数据库后,就该在数据库中创建一些表了。用CREATE TABLE语句创建表。

  <?php
    $con=mysqli_connect("example.com","username","password","my_db");
     $sql="CREATE TABLE table1(Username CHAR(30),Password CHAR(30),Role CHAR(30))";
     if (mysqli_query($con,$sql)) {
        echo "表已成功创建";
     }
  ?>

在表格中插入值

创建数据库和表时。现在是时候在表中插入一些数据了。用INSERT INTO语句创建数据库。

  <?php
     $con=mysqli_connect("example.com","username","password","my_db");
     $sql="INSERT INTO table1 (Username, Password, Role) VALUES ('admin', 'admin','adminstrator')";
     if (mysqli_query($con,$sql)) {
        echo "值已成功插入";
     }
  ?>

PHP-GET和POST方法

创建记录后,PHP还可用于从mysql数据库中获取记录。为了获取记录,必须将一些有关要获取的记录的信息传递到PHP页面。第一种传递信息的方法是通过使用$ _GET命令的GET方法。变量在url中传递,并获取记录。其语法如下-

  <?php
     $con=mysqli_connect("example.com","username","password","database name");
  
     if (mysqli_connect_errno($con)) {
        echo "无法连接到MySQL: " . mysqli_connect_error();
     }
  
     $username = $_GET['username'];
     $password = $_GET['password'];
     $result = mysqli_query($con,"SELECT Role FROM table1 where Username='$username' AND Password='$password'");
     $row = mysqli_fetch_array($result);
     $data = $row[0];
  
     if($data){
        echo $data;
     }
     mysqli_close($con);
  ?>

第二种方法是使用POST方法。上面脚本中的唯一更改是将$_GET替换为$_POST。在Post方法中,变量不通过URL传递。

Android-连接PHP接口获取MySQL数据

我们将使用开源项目OKHttp类进行网络连接。下面看下导入OKHttp环境

第一步打开FILE > Project Structure

第二步打开依赖 > App > 点加号 选择Library 依赖

第三步按照下面的步骤添加两个库

第四步选择应用

到此,导入okhttp步骤完毕

通过Get方法连接

有两种方法可以通过PHP页面连接到MYSQL。第一个称为Get方法。他们的语法如下-

  OkHttpClient client = new OkHttpClient();
  Request request = new Request.Builder()
          .url(path)
          .get()  // 默认get 不显式调用也可以
          .build();
  Call call = client.newCall(request);

之后,您需要调用Call类的execute方法并将其接收到Response对象中。之后,接收数据。

  Response response = call.execute();
  String returnMsg = response.body().string();

通过Post方法连接

在Post方法中,将使用OkHttpClientRequestBody类。它的语法在下面给出-

  OkHttpClient okHttpClient = new OkHttpClient();
  RequestBody requestBody = new FormBody.Builder()
          .add("username", username)
          .add("password",password)
          .build();
  Request request = new Request.Builder()
          .url(path)
          .post(requestBody)
          .build();
  
  Call call = okHttpClient.newCall(request);

您需要接收响应的数据。

  Response response = call.execute();
  String returnMsg = response.body().string();

示例

以下示例是通过PHP页面将android应用程序与MYSQL数据库连接的完整示例。它创建一个基本的应用程序,允许您使用GET和POST方法登录。

PHP-MYSQL部分

在此示例中,已在000webhost.com中创建了名称为temp的数据库。在该数据库中,已创建一个名为table1的表。该表具有三个字段。(Username, Password, Role)。该表只有一条记录(“admin”,“admin”,“administrator”)。下面给出了php页面,该页面通过post方法获取参数。

  <?php
     $con=mysqli_connect("example.com","username","password","db_name");
  
     if (mysqli_connect_errno($con)) {
        echo " MySQL链接失败: " . mysqli_connect_error();
     }
             $username = $_REQUEST['username'];
     $password = $_REQUEST['password'];
     $result = mysqli_query($con,"SELECT Role FROM table1 where    Username='$username' and Password='$password'");
     $row = mysqli_fetch_array($result);
     $data = $row[0];
  
     if($data){
        echo $data;
     }
             mysqli_close($con);
  ?>

Android 部分

要尝试使用此示例,您需要在连接了wifi互联网的实际设备上运行此示例。

  1. 您将使用Android Studio创建一个Android应用程序,并将其命名为Demo,位于com.jc2182.demo包下,如Hello World示例open in new window一章中所述。
  2. 修改src/MainActivity.java文件以添加活动代码。
  3. 创建src/DoRequest.java文件以添加HTTP请求代码。
  4. 修改布局XML文件res/layout/activity_main.xml如果需要,可添加任何GUI组件。
  5. 修改res/values/string.xml文件并添加必要的字符串组件。
  6. 修改AndroidManifest.xml以添加必要的权限。
  7. 运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。

以下是修改后的主要活动文件src/com.jc2182.demo/MainActivity.java的内容。

  package com.jc2182.demo;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.os.Looper;
  import android.os.Message;
  import android.view.View;
  import android.widget.EditText;
  import android.widget.TextView;
  
  import java.io.IOException;

public class MainActivity extends Activity {

  private EditText usernameField,passwordField;
  private TextView status,role,method;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      usernameField = (EditText)findViewById(R.id.editText1);
      passwordField = (EditText)findViewById(R.id.editText2);

      status = (TextView)findViewById(R.id.textView6);
      role = (TextView)findViewById(R.id.textView7);
      method = (TextView)findViewById(R.id.textView9);
  }

  public void showMsg(String msg){
      role.setText(msg);
      status.setText("登录成功");
  }

  public void login(View view) throws IOException {
      new Thread(new Runnable() {
          @Override
          public void run() {
              Looper.prepare();
              String username = usernameField.getText().toString();
              String password = passwordField.getText().toString();
              Message message = Message.obtain();
              try {
                  DoRequest dr = new DoRequest();
                  dr.doInBackground(username,password,1);
                  String res = dr.getReturnMsg();
                  showMsg(res);
                  method.setText("Get 方法");
              } catch (IOException e) {
                  e.printStackTrace();
              }
              Looper.loop();
          }
      }).start();
  }

  public void loginPost(View view) throws IOException {

      new Thread(new Runnable() {
          @Override
          public void run() {
              Looper.prepare();
              String username = usernameField.getText().toString();
              String password = passwordField.getText().toString();
              Message message = Message.obtain();
              try {
                  DoRequest dr = new DoRequest();
                  dr.doInBackground(username,password,1);
                  String res = dr.getReturnMsg();
                  showMsg(res);
                  method.setText("Post 方法");
              } catch (IOException e) {
                  e.printStackTrace();
              }
              Looper.loop();//增加部分
          }
      }).start();


  }

}



以下是修改后的主要活动文件src/com.jc2182.demo/DoRequest.java的内容。

```java

package com.jc2182.demo;

import android.util.Log;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class DoRequest  {

    /**     * 返回消息     */
    protected String returnMsg;

    public String getReturnMsg(){
        return  this.returnMsg;
    }

    public void doInBackground(String username,String password,int byGetOrPost) throws IOException {

        if(byGetOrPost == 0) {
            //get的方式提交就是url拼接的方式
            String path = "http://192.168.61.201:9090/login.php?username=" + username + "&password=" + password;
            OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url(path)
                    .get()  // 默认get 不显式调用也可以
                    .build();
            Call call = client.newCall(request);
            Response response = call.execute();

            //第四步,解析响应结果
            Headers headers = response.headers();
            for (int i = 0; i < headers.size(); i++) {
                Log.d("GET返回头", headers.name(i) + ":" + headers.value(i));
            }
            this.returnMsg = response.body().string();

        }else {
            String path = "http://192.168.61.201:9090/login.php";

            OkHttpClient okHttpClient = new OkHttpClient();
            RequestBody requestBody = new FormBody.Builder()
                    .add("username", username)
                    .add("password",password)
                    .build();
            Request request = new Request.Builder()
                    .url(path)
                    .post(requestBody)
                    .build();

            Call call = okHttpClient.newCall(request);

            Response response = call.execute();

            Headers headers = response.headers();
            for (int i = 0; i < headers.size(); i++) {
                Log.d("POST返回头", headers.name(i) + ":" + headers.value(i));
            }
            this.returnMsg = response.body().string();
        }
    }

}

以下是res/layout/activity_main.xml文件的内容-

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/textView3"
        android:layout_width="79dp"
        android:layout_height="55dp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="117dp"
        android:text="@string/App"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="68dp"
        android:layout_height="27dp"
        android:layout_below="@+id/textView3"
        android:layout_marginTop="73dp"
        android:text="@string/Username" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="64dp"
        android:layout_height="35dp"
        android:layout_below="@+id/textView1"
        android:layout_alignParentStart="true"
        android:layout_marginStart="3dp"
        android:layout_marginTop="28dp"
        android:layout_marginBottom="-56dp"
        android:text="@string/Password" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="326dp"
        android:layout_height="30dp"
        android:layout_below="@+id/textView3"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="31dp"
        android:layout_marginEnd="3dp">
        <requestFocus android:layout_width="wrap_content" />

    </EditText>


    <EditText
        android:id="@+id/editText2"
        android:layout_width="278dp"
        android:layout_height="29dp"
        android:layout_below="@+id/editText1"
        android:layout_alignEnd="@+id/editText1"
        android:layout_marginStart="5dp"
        android:layout_marginTop="96dp"
        android:layout_marginEnd="4dp"
        android:layout_toEndOf="@+id/textView2"
        android:ems="10"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/button1"
        android:layout_width="121dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignStart="@+id/textView2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignParentStart="true"
        android:layout_marginStart="-3dp"
        android:layout_marginBottom="45dp"
        android:onClick="login"
        android:text="@string/LoginGet" />

    <Button
        android:id="@+id/button2"
        android:layout_width="119dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginStart="1dp"
        android:layout_toEndOf="@+id/textView6"
        android:onClick="loginPost"
        android:text="@string/LoginPost" />

    <TextView
        android:id="@+id/textView8"
        android:layout_width="63dp"
        android:layout_height="28dp"
        android:layout_below="@+id/button1"
        android:layout_alignStart="@+id/textView5"
        android:layout_marginStart="-2dp"
        android:layout_marginBottom="-20dp"
        android:text="@string/method" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="66dp"
        android:layout_height="28dp"
        android:layout_below="@+id/textView8"
        android:layout_marginStart="23dp"
        android:layout_marginTop="13dp"
        android:text="@string/LoginStatus" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="70dp"
        android:layout_height="30dp"
        android:layout_below="@+id/textView4"
        android:layout_marginTop="43dp"
        android:layout_marginEnd="7dp"
        android:layout_toStartOf="@+id/editText1"
        android:text="@string/LoginRole" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="116dp"
        android:layout_height="25dp"
        android:layout_alignBottom="@+id/textView5"
        android:layout_marginBottom="0dp"
        android:layout_toRightOf="@+id/textView5"
        android:text="@string/Role"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp"
        tools:ignore="SmallSp" />


    <TextView
        android:id="@+id/textView6"
        android:layout_width="100dp"
        android:layout_height="32dp"
        android:layout_alignTop="@+id/textView4"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="0dp"
        android:layout_toEndOf="@+id/textView4"
        android:text="@string/Status"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp"
        tools:ignore="SmallSp" />

    <TextView
        android:id="@+id/textView9"
        android:layout_width="96dp"
        android:layout_height="29dp"
        android:layout_below="@+id/button2"
        android:layout_alignStart="@+id/textView6"
        android:layout_alignBottom="@+id/textView8"
        android:layout_marginStart="56dp"
        android:layout_marginTop="11dp"
        android:layout_marginBottom="-1dp"
        android:text="@string/Choose"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textSize="10sp"
        tools:ignore="SmallSp" />


</RelativeLayout>

以下是AndroidManifest.xml文件的内容-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jc2182.demo">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:usesCleartextTraffic="true"
        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=".SecondMain"></activity>

    </application>

</manifest>

让我们尝试运行刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后工具栏中单击“运行”图标。Android studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-

尝试POST , GET 请求 分别如下: