Transcript 02. DBAL

資料庫抽象層
EzSQL
IDIC
網頁取存資料庫
• 網頁會因為使用者的需求不同而使用不同資料庫
• 不同資料庫的連結方式都不同
• PHP 有提供不同資料庫的存取函數
MySQL
PHP
會員管理
訂單管理
書藉管理
書籍銷售系統
MSSQL
PHP
會員管理
訂單管理
書藉管理
書籍銷售系統
Oracle
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 語法可繼承使用
MySQL
MSSQL
Oracle
• 缺點
• 開發人員需要額外學習 DBAL 的
使用方式
Database abstraction layer
• 每套 DBAL 都有不同的寫法,能
解決問題的程度也不盡相同
• DBAL 無法表達所有的語法,只
有常用/通用的語法
• 執行的效率較差
• 程式需要額外組合 SQL 語法
query();
PHP
DBAL 架構
ezSQL
• PHP DBAL 套件
• 解決連線不同資料庫的問題
• 支援的資料庫
•
•
•
•
•
MSSQL
MySQL
PostgreSQL
Oracle
SQLite
• 在此使用的 ezSQL 只解決了在連線不同資料庫的問題並未
解決 SQL 語法相容性的問題,但仍有其他 DBAL 套件有解
決 SQL 語法問題
ezSQL安裝
• 下載
• https://github.com/jv2222/ezSQL
• 解壓縮至專案目錄
使用 ezSQL – 連結資料庫
// 引用 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');
• db_user
• 使用者帳號
• db_password
• 使用者密碼
• db_name
• 資料庫名稱
• db_host
• 資料庫主機
使用 ezSQL – 設定資料庫編
碼
• 表示文字的編碼方式
• 建議採用 UTF8 編碼,避免使用 BIG5 避免造成衝碼。
• $db->query("SET NAMES UTF8");
使用 ezSQL – 常用語法
1. 執行新增/修改/刪除等動作 (不需取得資料)
• bool
$db->query($query)
1. 取得一筆資料的某個欄位
• var
$db->get_var($query)
1. 取得一筆資料 的多個欄位
• mixed $db->get_row($query)
1. 取得所有查詢結果
• 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 去存取。