1.5 PHP基礎+1.5.1 訪問資料庫

PHP作為流行的網站開發語言,具有上手簡單,運行速度快的特點,它和javascript類似,無需定義變數類型,免去了使用者要對變數類型轉換的煩惱,當然了,這就要求我們要對變數類型隱式轉換過程予以關注。總之,PHP語言使用方便,也是本文所使用的主要語言之一。

在這裡,我們仍然延續上一章的案例,並使用PHP對主要業務邏輯進行實現。

第一,我們需要一種高效、便捷、通用的資料庫訪問方式,能夠使PHP和MySQL就行協同;

第二,要分析和實現基本的教學、選課操作,為前台展示提供必要的業務介面;

第三,要分析和實現學生資訊維護、教師資訊維護和課程資訊維護等後台管理的功能,增強系統的可擴展性;

第四,邏輯介面要有通用性,能夠對接當前流行的前端設計,尤其是滿足可供微信服務號使用的介面設計。

基於以上分析,本節所涉及的系統設計如下,

 

 

其中,如上圖所示,PHP所負責部分主要有3處,訪問資料庫、前端業務邏輯、後台業務邏輯,下面分3小節進行描述。

1.5.1 訪問資料庫

本文前面部署PHP時提到,PHP訪問MySQL資料庫需要使用MySQLi模組,即PHP已經封裝好了訪問MySQL資料庫的方式方法,我們只需調用相應的介面函數實現即可。

在實現之前,需要先講解一些PHP的基礎知識。

定義一個文本文件為PHP腳本,不但其文件的後綴名應是.php,而且,在文本中,涉及PHP程式碼的部分,要用「<?php … ?>」包括起來。例如

<?php echo phpinfo(); ?>

 

下面我們學習一下PHP連接資料庫的方法。為了程式碼能夠復用,我們將資料庫操作相關方法整合在一起,定義為一個「類」。

(這裡,「類」是面向對象程式語言中一個基礎概念,是對象的基本屬性和方法的描述,用class表示)

如,我們定義資料庫操作對象為

class  DbMysql {

}

 

上述類定義中,「DbMysql」為類名,括弧內部具體描述該類所具有的屬性和方法。

經過上節——MySQL資料庫命令中,我們知道,想要連接資料庫,我們必須要知道MySQL伺服器主機名稱(例如:本地localhost或者127.0.0.1)、的用戶名(例如:root)和密碼(例如上節課中的123456)才能進入資料庫,我們還需要知道資料庫的名稱(例如上節中的「db_edu_sys」)以便於能夠將資料庫切換至我們自建的資料庫。

除了以上內容,我們還需要能夠存儲已經建立好的資料庫鏈接標識,以便能夠重複使用。

另一方面,我們設計資料庫操作類的初衷就是為了能夠通過它來進行SQL語句的操作,因此,我們還需要定義有關SQL操作的相關屬性,主要有:操作的語句、操作後的結果以及出錯時的錯誤資訊等。

綜合以上分析,我們可以將類定義如下:

class  DbMysql {

  //資料庫連接時所需要的屬性

  private $dbhost; // 資料庫主機,如:localhost:3306

    private $dbuser; // 資料庫用戶名,如:root

    private $dbpass; // 資料庫用戶名密碼:123456

    private $dbname; // 資料庫名:db_edu_sys

 

  // 資料庫保持連接時需要的屬性

    private $conn; // 資料庫連接標識

 

  //執行SQL語句時需要的屬性

  private $sql; // sql執行語句:SELECT s_name FROM student

    private $result; // 執行sql語句後返回的結果

    private $error_msg; // 資料庫出現錯誤時返回的錯誤提示

 

}

 

上面的例子中,屬性前面的關鍵字「private」表明,該屬性為DbMysql類「私有」的屬性,其他類或外部操作無法訪問該屬性。

(注意:一般定義屬性時,往往都是private的,如果希望其他類或外部函數訪問該屬性,可以通過定義屬性讀取函數將該屬性的值作為返回值)

另,我們上述中提到的類的屬性和方法,大家可以簡單理解就是在類中定義的「變數」和「函數」。

下面我們討論一下,該類中所需要的方法。

(1)構造函數:一個類往往需要一個構造函數,這個構造函數主要功能就是對類的屬性就行初始化,指定這些屬性最初的值是什麼。

這裡的構造函數可以寫成:

// 構造函數

    function __construct($dbhost, $dbuser, $dbpass, $dbname = '') {

     // 初始化資料庫連接時所需要的屬性

        $this->dbhost = $dbhost; 

        $this->dbuser = $dbuser;

        $this->dbpass = $dbpass;

        $this->dbname = $dbname;

        // 進行資料庫連接

        $this->connect();

    }

 

對於上述函數的實現,這裡做一下說明:

參數如果寫成「$dbname = ”」,表示這個參數有默認值,實際調用該函數時,處於這個位置的參數可以不賦值;沒有默認值的參數,調用函數時則必須對其賦值。

在類定義函數中使用該類的屬性時,需要使用「$this->」,否則認為是函數內部變數。使用類方法也要加「$this->」。

(2)資料庫連接

資料庫連接時,我們要使用mysqli進行mysql控制台的登錄和資料庫切換的操作,具體實現如下:

// 資料庫連接

    function connect() {

     // 使用mysqli連接資料庫

     // 相當於在控制台中使用:mysql -u root -p

    if (!$this->conn = mysqli_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) {

         $this->error('Can not pconnect to mysql server');

            return false;

        }

 

     // 連接成功,進入mysql控制台

     // 使用mysqli切換資料庫

     // 相當於在控制台中使用:use db_edu_sys;

     if (mysqli_select_db($this->conn, $this->dbname) === false ) {

            $this->error("NO THIS DBNAME:" . $this->dbname);

            return false;

        }

  }

 

對於上述函數,需要說明的是,這裡使用了判斷語句「if」,這是控制程式走向的重要語句,if後面的條件成立時,將執行條件後面{}裡面的內容,上述例子中,第一個「if」是說,如果mysql連接(或者說是登錄)不成功,則執行{}裡面的顯示出錯資訊,返回false,退出函數執行。(這裡注意條件判斷中的「!」,這是「非」的意思,就是與其後面的語句相反的意思,後面的語句是「成功連接資料庫」加上一個「非」,就是「連接資料庫不成功」的意思)

第二個「if」是選擇資料庫不成功,則執行顯示「沒有這個資料庫」錯誤,並返回false,退出函數執行。

(3)執行SQL語句

Mysqli提供了執行SQL語句的函數,我們直接調用該函數即可。

// 執行查詢語句,支援增加、刪除、修改、查詢等多種SQL語句

    function query($sql) {

    

        $this->sql = $sql;

        $query = mysqli_query($this->conn, $this->sql);

        return $query;

    }

 

(4)其他函數

最後,我們還要實現資料庫的關閉和錯誤資訊的顯示,這樣,一個簡單的mysql資料庫操作類就基本實現了。

本小節的最後,我們將整個DbMysql類的實現寫在下面,供讀者參考。

文件名:DbMysql.class.php

<?php

class  DbMysql {

  //資料庫連接時所需要的屬性

  private $dbhost; // 資料庫主機,如:localhost:3306

    private $dbuser; // 資料庫用戶名,如:root

    private $dbpass; // 資料庫用戶名密碼:123456

    private $dbname; // 資料庫名:db_edu_sys

 

  // 資料庫保持連接時需要的屬性

    private $conn; // 資料庫連接標識

 

  //執行SQL語句時需要的屬性

  private $sql; // sql執行語句:SELECT s_name FROM student

    private $result; // 執行sql語句後返回的結果

    private $error_msg; // 資料庫出現錯誤時返回的錯誤提示

 

  // 構造函數

    function __construct($dbhost, $dbuser, $dbpass, $dbname = '') {

     // 初始化資料庫連接時所需要的屬性

        $this->dbhost = $dbhost; 

        $this->dbuser = $dbuser;

        $this->dbpass = $dbpass;

        $this->dbname = $dbname;

        // 進行資料庫連接

        $this->connect();

    }

 

  // 資料庫連接

    function connect() {

     // 使用mysqli連接資料庫

     // 相當於在控制台中使用:mysql -u root -p

    if (!$this->conn = mysqli_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) {

         $this->error('Can not pconnect to mysql server');

            return false;

        }

 

     // 連接成功,進入mysql控制台

     // 使用mysqli切換資料庫

     // 相當於在控制台中使用:use db_edu_sys;

     if (mysqli_select_db($this->conn, $this->dbname) === false ) {

            $this->error("NO THIS DBNAME:" . $this->dbname);

            return false;

        }

  }

 

  // 執行查詢語句,支援增加、刪除、修改、查詢等多種SQL語句

    function query($sql) {

     // 使用mysqli進行查詢語句執行

     // 相當於在控制台中使用該查詢語句

        $this->sql = $sql;

        $query = mysqli_query($this->conn, $this->sql);

        return $query;

    }

 

  // 關閉 MySQL 連接

    function close() {

     // 使用mysqli關閉資料庫

     // 相當於在控制台使用:exit

        return mysqli_close($this->conn);

    }

  // 返回錯誤資訊

    function error($msg = '') { 

        $msg = $msg ? "database Error: $msg" : '<b>MySQL server error report</b><br>' . $this->error_msg;

        exit($msg);

    }


} 

?>