160 likes | 336 Views
資料庫抽象層 EzSQL. IDIC. 網頁取存資料庫. 網頁會因為使用者的需求不同而使用不同資料庫 不同資料庫的連結方式都不同 PHP 有提供不同資料庫的存取函數. MSSQL. MySQL. Oracle. PHP. PHP. PHP. 會員管理. 會員管理. 會員管理. 訂單管理. 訂單管理. 訂單管理. 書藉管理. 書藉管理. 書藉管理. 書籍銷售系統. 書籍銷售系統. 書籍銷售系統. 資料庫連線的方式不同. MySQL $link = mysql_connect ('host', 'user', 'password');
E N D
資料庫抽象層EzSQL IDIC
網頁取存資料庫 • 網頁會因為使用者的需求不同而使用不同資料庫 • 不同資料庫的連結方式都不同 • PHP 有提供不同資料庫的存取函數 MSSQL MySQL Oracle PHP PHP PHP 會員管理 會員管理 會員管理 訂單管理 訂單管理 訂單管理 書藉管理 書藉管理 書藉管理 書籍銷售系統 書籍銷售系統 書籍銷售系統
資料庫連線的方式不同 • MySQL • $link = mysql_connect('host', 'user', 'password'); • mysql_select_db(“db_name"); • $results = mysql_query($sql); • Oracle • $link = oci_connect('user', 'password', 'localhost/XE'); • $query = oci_parse($link, $sql); • oci_execute($query); • MSSQL • $link = mssql_connect($server, 'user ', 'password'); • mssql_select_db("myDB", $link); • $results = mssql_query($query);
使用的 SQL 語法不同 • 各種資料庫取得前十筆資料的 SQL 語法 • MySQL • SELECT * FROM mytable LIMIT 0,10 • MSSQL • SELECT TOP 10 FROM mytable • Oracle • SELECT * FROM mytable WHERE ROWNUM = 10 ORDER BY ROWNUM ASC
資料庫的相容性問題 • 每一套資料庫都有著不同的連線方式 • 不同的協定 • 不同的連線參數 • 在使用時我們必須使用不同的函數連線 • 若要轉移資料庫會成為巨大的工程 • 每一套資料庫都有著不同的 SQL 語法 • 即使 ANSI 有規範 SQL 標準的寫法 • 但實際在使用不同資料庫的 SQL 上仍有許多差異
資料庫抽象層 • Database Abstraction layer, DBAL • DBAL 主要要解決的主要問題 • 統一資料庫的連線方式 • 統一 SQL 的語法撰寫 • SQL 語法可繼承使用 • 缺點 • 開發人員需要額外學習 DBAL 的使用方式 • 每套 DBAL 都有不同的寫法,能解決問題的程度也不盡相同 • DBAL 無法表達所有的語法,只有常用/通用的語法 • 執行的效率較差 • 程式需要額外組合 SQL 語法 MySQL MSSQL Oracle Database abstraction layer query(); PHP DBAL 架構
ezSQL • PHP DBAL 套件 • 解決連線不同資料庫的問題 • 支援的資料庫 • MSSQL • MySQL • PostgreSQL • Oracle • SQLite • 在此使用的 ezSQL 只解決了在連線不同資料庫的問題並未解決 SQL 語法相容性的問題,但仍有其他 DBAL 套件有解決 SQL 語法問題
ezSQL安裝 • 下載 • https://github.com/jv2222/ezSQL • 解壓縮至專案目錄
使用 ezSQL – 連結資料庫 • db_user • 使用者帳號 • db_password • 使用者密碼 • db_name • 資料庫名稱 • db_host • 資料庫主機 // 引用 ezSQL 核心套件 include_once "ez_sql_core.php"; // 引用 ezSQL 欲使用資料庫類型的元件 (如 mySQL) // 若要更換資料庫只需更換此行引用的元件, 其餘用法相同 include_once "ez_sql_mysql.php"; // 建立連線 $db = new ezSQL_mysql('db_user','db_password','db_name','db_host');
使用 ezSQL – 設定資料庫編碼 • 表示文字的編碼方式 • 建議採用 UTF8 編碼,避免使用 BIG5 避免造成衝碼。 • $db->query("SET NAMES UTF8");
使用 ezSQL – 常用語法 • 執行新增/修改/刪除等動作 (不需取得資料) • bool $db->query($query) • 取得一筆資料的某個欄位 • var $db->get_var($query) • 取得一筆資料 的多個欄位 • mixed$db->get_row($query) • 取得所有查詢結果 • mixed$db->get_results($query) $query 表示 SQL
使用情況-查詢 (多筆) • 常用在取得資料清單,是最常使用的情況 • 由於回傳的資料為多筆因此會採用物件陣列的型態 • 須使用使用 foreach 將資料一筆一筆的讀取並做處理 • 必須指定要顯示的欄位,避免使用 * 號 • 避免取得不必要之資料節省頻寬 • 欄位取得的順序不會因為資料表的移動而改變 $students = $db->get_results("SELECT username FROM students"); foreach($students as $student) { echo $student->name; } • $students • 查詢的結果 (多筆) • $student • 查詢的結果 (單筆) • name • 欄位名稱
使用情況-查詢 (單筆) • 常用在取得單筆資料的明細 • 由於回傳的結果為物件,不需使用 foreach • 在下 SQL 需確認取得的資料筆數是否為一筆 • 避免不必要的資料庫資源浪費 $student = $db->get_row(“SELECT username FROM students WHERE username = ‘李白’"); echo $student->name; • $student • 查詢的結果 (單筆) • name • 欄位名稱
使用情況-查詢 (單筆欄位) • 常用在取得資料的筆數或某筆資料的欄位 • 由於回傳的結果為變數 • 無須使用物件的方式取值 $total = $db->get_var("SELECT COUNT(*) FROM students"); • $total • 資料的筆數
完整範例 <?php require_once “/ezsql_path/ez_sql_core.php”; require_once “/ezsql_path/ez_sql_mysql.php”; // 連線資料庫 $db = new ezSQL_mysql('db_user','db_password','db_name','db_host'); // 設定資料庫編碼 $db->query("SET NAMES UTF8"); $query = "INSERT INTO sample_table ('sample_name') VALUES('Loln')"; $db->query($query ); // 查詢 $results = $db->get_results(“SELECT sample_id FROM sample_table"); // 印出取得的資料 var_dump($results); ?>
作業 將會員、訂單、書籍管理等功能的資料庫操作,透過 ezSQL 去存取。