190 likes | 309 Views
連結 MySQL 資料庫. 鄧姚文 joseph.deng@gmail.com http://www.ywdeng.idv.tw. 流程. 建立連線: mysql_connect() 或 mysql_pconnect() 送出 SQL : mysql_db_query() 或 mysql_select_db() + mysql_query() 處理資料: mysql_fetch_array() 或 mysql_fetch_assoc() 或 mysql_fetch_row() … 關閉連線: mysql_close(). 建立連線.
E N D
連結 MySQL 資料庫 鄧姚文 joseph.deng@gmail.com http://www.ywdeng.idv.tw
流程 • 建立連線: • mysql_connect() 或 mysql_pconnect() • 送出 SQL: • mysql_db_query() 或 mysql_select_db() + mysql_query() • 處理資料: • mysql_fetch_array() 或 mysql_fetch_assoc() 或 mysql_fetch_row() … • 關閉連線: • mysql_close()
建立連線 • 不佔線的方式:每次建一個連線,用完就關閉 • $link = mysql_connect($db_host, $user, $password); • 佔線的方式:permanent 持久性連線 • mysql_pconnect() • mysql_error() 傳回錯誤訊息(if any)
送出 SQL • 送出 SELECT • $resource = mysql_db_query($db_name, $sql, $link); // 如果只有一個資料庫連線,$link 可省略 • $resource 為查詢的結果 • 送出 UPDATE, INSERT, DELETE • mysql_db_query() 傳回 TRUE/FALSE 代表是否成功 • mysql_affected_rows() 傳回受影響的資料列數 • 也可以這樣做: • mysql_select_db($db_name) • mysql_query($sql, $link)
處理資料 • $row = mysql_fetch_array($resource); • 可以用 $row['地址'] 取得欄位資料,也可以用 $row[3] 取得欄位資料 • $n = mysql_num_fields($resource) 傳回欄位數目 • $n = mysql_num_rows($resource) 傳回資料列數 • $row = mysql_fetch_assoc($resource) 只能用 $row['地址'] 取得欄位資料 • $row = mysql_fetch_row($resource)只能用 $row[3] 取得欄位資料
列出每一個欄位的名稱-1 $result = mysql_query($sql); echo "<table border='1'><tr>"; $i = 0; while ($i < mysql_num_fields($result)) { $meta = mysql_fetch_field($result, $i); echo "<th>" . $meta->name . "</th>"; $i++; } echo "</tr>";
列出每一個欄位的名稱-2 $data = mysql_fetch_assoc($res); echo "<table border='1'><tr>"; foreach ($data as $field_name=>$field_val) { echo "<th>" . $field_name . "</th>"; } echo "</tr>";
列出每一列的資料 do { echo "<tr>"; foreach ($data as $field_val) { echo "<td>" . $field_val . "</td>"; } echo "</tr>"; } while ($data = mysql_fetch_assoc($res)); echo "</table>";
關於密碼 • 密碼於資料庫之中不應以明文儲存 • MySQL 提供加密函數 • PASSWORD() • MD5(): Calculate MD5 checksum • SHA1(): Calculate an SHA-1 160-bit checksum • ENCRYPT()
使用者登入驗證:比對帳號密碼 $acc=$_POST["account"]; $pwd=$_POST["password"]; $sql="SELECT * FROM `users` WHERE `account` = '$acc' AND `password` = PASSWORD( '$pwd' )"; $result = mysql_query($sql); if (mysql_num_rows($result) < 1) { die ("帳號或密碼錯誤!"); }
關於中文 • 請使用 utf8 編碼 • 為避免亂碼,在存取資料庫前: • $sql = 'SET NAMES utf8'; • $result = mysql_query ($sql);
如何儲存資料庫連線資訊? • 將資料庫連線資訊另存成 connection.inc.php • 以 require 或 require_once 引入 • require() 引入檔案,若失敗,程式停止 • require_once() 與 require() 同,但同一個檔案只引入一次,不重複引入 • include() 引入檔案,若失敗,發出警告,程式繼續 • include_once() 同 include(),但同一個檔案只引入一次,不重複引入
練習:會員管理 • 幾乎每一個網站都有會員管理功能 • 功能需求: • 會員可以自行申請入會 • 會員帳號必須由管理員『啟用』後才可以登入 • 會員可以修改自己的基本資料(帳號除外) • 會員基本資料包括: • 登入帳號、登入密碼、姓名、性別、出生日期、電子郵件地址、聯絡電話 • 管理員可以新增、修改或刪除所有會員的基本資料
會員基本資料表 CREATE TABLE `users` ( `account` varchar(20) NOT NULL COMMENT '登入帳號', `password` varchar(50) NOT NULL COMMENT '登入密碼', `name` varchar(100) NOT NULL COMMENT '姓名', `sex` enum('男','女') NOT NULL default '女' COMMENT '性別', `birth_date` date NOT NULL COMMENT '出生日期', `email` varchar(255) NOT NULL COMMENT '電郵', `tel` varchar(20) NOT NULL COMMENT '電話或手機', `memo` text COMMENT '備註', `is_admin` enum('Y','N') NOT NULL default 'N' COMMENT '是否管理員', `is_active` enum('Y','N') NOT NULL default 'N' COMMENT '是否已啟用', PRIMARY KEY (`account`), KEY `name` (`name`) ) DEFAULT CHARSET=utf8;
connection.inc.php $db_host = "localhost"; // 資料庫主機 $db_account = "9888D888"; // 資料庫帳號 $db_password = "99999999"; // 資料庫密碼 $db_database = "9888D888"; // 資料庫名稱 /* * 檢查登入帳號與密碼是否正確 */ function verify_login($account, $password) { global $db_host, $db_account, $db_password, $db_database; $link = mysql_connect($db_host, $db_account, $db_password) or die(mysql_error()); mysql_select_db($db_database) or die(mysql_error()); $sql = 'SET NAMES utf8'; $result = mysql_query($sql); $sql="SELECT * FROM `users` WHERE `account` = '$account' AND `password` = PASSWORD( '$password' )"; $result = mysql_query($sql); return (mysql_num_rows($result) == 1); }
會員登入 login.php • 提供會員登入畫面 • 檢驗帳號與密碼 • 若登入成功 • 一般會員轉移至 index.php • 管理員轉移至 admin.php
一般會員首頁 index.php • 會員若尚未登入: • 提示登入 • 提示申請會員 • 會員已經登入 • 提示登出 • 提示修改基本資料 • 提示修改密碼
管理員首頁 admin.php • 若尚未登入:轉移至 login.php • 若已經登入 • 提示登出 • 列出會員清單 • 提供編輯會員基本資料功能 • 提供刪除會員功能 • 提供新增會員功能
會員活動記錄 • Session:從使用者進站到離開之間的過程 • PHP 的 Session 功能 • session_start() 啟動 Session • $_SESSION[] 存放 Session 變數的全域陣列(assoc) • session_unset() 清除 Session 變數 • 例如,在驗證登入系統使用者帳號與密碼無誤之後: • session_start(); • $_SESSION["LOGIN_OK"] = "TRUE"; • 以後就以 if ($_SESSION[“LOGIN_OK”] === “TRUE”) 判斷使用者是否已經登入