10.2 建立 MySQL 基本類別

  以下我們將使用 PHP 的 MySQLi (MySQL Improved Extension) MySQL API,您可以先使用 phpinfo() 檢查您的 PHP 伺服器是否已經配置了 MySQLi。MySQLi 提供了程序導向 (procedural) 與物件導向 (object-oriented) 兩種介面,為了幫助您將來開發大型專案,我們將全面採用物件導向的寫法。PHP 的物件導向有點類似 C++ 或 Java,但仍有些差異需要注意,例如 PHP 及 Java 的類別 (class) 皆不提供多重繼承 (multiple inheritance),不過卻擁有介面 (interface) 可以進行多重繼承,與 C++ 不同。關於 PHP 物件導向的語法,由於相似度高,在此不再多做敘述。另外,對於 MySQLi 的各個屬性 (field/property) 與方法 (method),也請您自行參閱 PHP 說明文件,畢竟學會自己閱讀手冊 (manual) 或文件 (document/reference) 來尋找答案,是每個程式設計師必備的基本能力。
<?php

final class Mysql {

    private $host = NULL;
    private $usr = NULL;
    private $pwd = NULL;
    private $db = NULL;
    private $conn_type = NULL;
    private $charset = NULL;
    public $conn = NULL;

    public function init($_host, $_usr, $_pwd, $_db, $_conn_type,
    $_charset) {
        $this -> host = $_host;
        $this -> usr = $_usr;
        $this -> pwd = $_pwd;
        $this -> db = $_db;
        $this -> conn_type = $_conn_type;
        $this -> charset = $_charset;
        $this -> connect();
    }

    public function connect() {
        $host_param = empty($this -> conn_type) ?
            $this -> host : $this -> conn_type . $this -> host;
        $this -> conn = new mysqli
            ($host_param, $this -> usr, $this -> pwd, $this -> db);
        if ($this -> conn -> connect_error)
            die('MySQL Error: ('.$this -> conn -> connect_errno.') '.
                $this -> conn -> connect_error);
        $this -> conn -> set_charset($this -> charset);
    }

    public function disconnect() {
        $this -> conn -> close();
    }

    public function showDatabases() {
        $result = $this -> conn -> query("SHOW DATABASES")
            or die('MySQL Error: '.$this -> conn -> error);
        $output = "<table><tr><td colspan='2'>All databases on the MySQL
            server</td></tr>\n";
        $count = 1;
        while ($row = $result -> fetch_assoc()) {
            $output .= "<tr><td>($count)</td>";
            $output .= "<td>$row[Database]</td></tr>\n";
            $count++;
        }
        $output .= "<tr><td colspan='2'>Total databases: $result->num_rows
            </td></tr></table>\n";
        $result -> free();
        return $output;
    }

    public function showTables() {
        $result = $this -> conn -> query("SHOW TABLES")
            or die('MySQL Error: '.$this -> conn -> error);
        $output = "<table><tr><td colspan='2'>All tables in database
            '$this->db'</td></tr>\n";
        $count = 1;
        $column = "Tables_in_$this->db";
        while ($row = $result -> fetch_assoc()) {
            $output .= "<tr><td>($count)</td>";
            $output .= "<td>$row[$column]</td></tr>\n";
            $count++;
        }
        $output .= "<tr><td colspan='2'>Total tables: $result->num_rows
            </td></tr></table>\n";
        $result -> free();
        return $output;
    }

    public function selectDatabase($new_db) {
        $this -> conn -> select_db($new_db)
            or die('MySQL Error: '.$this -> conn -> error);
        $tihs -> db = $new_db;
    }

    public function describeTable($table) {
        $query = "SHOW FULL COLUMNS FROM $table";
        $result = $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
        $output = "<table><tr><td colspan='9'>Descriptions of table
            '$table'</td></tr>\n";
        $output .= "<tr><td>Field</td>";
        $output .= "<td>Type</td>";
        $output .= "<td>Collation</td>";
        $output .= "<td>Null</td>";
        $output .= "<td>Key</td>";
        $output .= "<td>Default</td>";
        $output .= "<td>Extra</td>";
        $output .= "<td>Privileges</td>";
        $output .= "<td>Comment</td></tr>\n";
        while ($row = $result -> fetch_assoc()) {
            $output .= "<tr><td>$row[Field]</td>";
            $output .= "<td>$row[Type]</td>";
            $output .= "<td>$row[Collation]</td>";
            $output .= "<td>$row[Null]</td>";
            $output .= "<td>$row[Key]</td>";
            $output .= "<td>$row[Default]</td>";
            $output .= "<td>$row[Extra]</td>";
            $output .= "<td>$row[Privileges]</td>";
            $output .= "<td>$row[Comment]</td></tr>\n";
        }
        $output .= "<tr><td colspan='9'>Total columns: $result->num_rows
            </td></tr></table>\n";
        $result -> free();
        return $output;
    }

    public function select($column, $table, $condition = NULL,
    $limitation = NULL, $order = NULL) {
        $query = "SELECT $column FROM $table";
        if ($condition)
            $query .= " WHERE $condition";
        if ($limitation)
            $query .= " LIMIT $limitation";
        if ($order)
            $query .= " ORDER BY $order";
        $result = $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
        return $result;
    }

    public function delete($table, $condition, $safe = TRUE) {
        $query = "DELETE FROM $table WHERE $condition";
        if ($safe)
            $query .= " LIMIT 1";
        $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
    }

    public function insert($table, $column, $value) {
        $query = "INSERT INTO $table ($column) VALUES ($value)";
        $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
    }

    public function update($table, $modification, $condition,
    $safe = TRUE) {
        $query = "UPDATE $table SET $modification WHERE $condition";
        if ($safe)
            $query .= " LIMIT 1";
        $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
    }

    public function query($query) {
        $this -> conn -> query($query)
            or die('MySQL Error: '.$this -> conn -> error);
    }

    public function checkValues($value_array) {
        foreach ($value_array as $key => $value) {
            $value_array[$key] = htmlentities
                ((string) $value_array[$key], ENT_QUOTES, 'UTF-8');
            $value_array[$key] = $this -> conn -> real_escape_string
                ($value_array[$key]);
            $value_array[$key] = ($value_array[$key] == "") ?
                "NULL" : "'$value_array[$key]'";
        }
        return $value_array;
    }

}

?>
  請將以上程式碼儲存為 lib_mysql.php,往後若要使用這個類別,只需使用 require_once 'lib_mysql.php'; 即可將該檔案置入程式中。