200 likes | 491 Views
PHP 存取 MySQL 資料庫. PDO ( PHP Data Object). PHP. DB Abstraction Layer (PDO). MSSQL. MySQL. Oracle. PHP 存取 MySQL 流程. 產生 PDO 物件. $ db_host = 'db.mis.kuas.edu.tw'; $ db_name = ' cobol '; $ db_user = ' cobol '; $ db_password = ‘1234';
E N D
PDO (PHP Data Object) PHP DB Abstraction Layer (PDO) MSSQL MySQL Oracle
PHP 存取 MySQL 流程 產生PDO物件 $db_host = 'db.mis.kuas.edu.tw'; $db_name = 'cobol'; $db_user = 'cobol'; $db_password = ‘1234'; $dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8"; $db = new PDO($dsn, $db_user, $db_password); 執行查詢/修改/新增/刪除 $stmt = $db->query("SELECT * FROM sample"); $count = $db->exec("UPDATE table SET field='value'"); 顯示查詢結果/檢查執行結果 foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { $msg .= $row['id'] . " " . $row['name'] . " ". $row['birth'] . " <br/>"; } if($count<1) echo ‘error’;
範例 $db_host = 'db.mis.kuas.edu.tw'; $db_name = 'cobol'; $db_user = 'cobol'; $db_password = ‘1234'; $dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8"; try { $db = new PDO($dsn, $db_user, $db_password); $stmt = $db->query("SELECT * FROM sample"); $msg = "<table border>\n"; foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { $msg .= "\t<tr><td>" . $row['id'] . "</td><td>" . $row['name'] . "</td><td>" . $row['birth'] . "</td></tr>"; } $msg .= "</table>\n"; } catch (PDOException $e) { echo $e->getMessage(); }
MySQL 資料庫的字元集 • 字元集(character set):文字編碼方式 • 若儲存與讀取資料庫的編碼不同,便會導致亂碼。 • 為避免 Big5 編碼可能造成的衝碼問題,所以建議採用 UTF8 編碼。 • 為提供最大彈性,MySQL允許在伺服器、資料庫、資料表、欄位與連線等不同層級設定不同字元集,但預設下層會繼承上一層的設定。 • 未特別設定時,MySQL 預設會採用 "latin1" 字元集與 "latin1_swedish_ci" 校對。
查詢資料庫注意事項 • 避免使用select *,以加快查詢效能。 • 資料庫查詢需耗費大量的時間與成本,若查詢結果在後續程式會被多次使用,需用二維陣列儲存結果。 foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { $arr[] = $row; }
新增資料 編號具有auto_increment屬性,所以新增時會自動累加編號 新增的記錄 • $count = $db->exec(INSERT 敘述) • $count表示剛才新增了多少筆記錄 • 取得剛才新增訂單的編號 • $id = $db->lastInsertId(); • 範例:將資料新增至 student_profile資料表內: $count = $db->exec(“INSERT INTOstudent_profile (name, addr, birth) VALUES (‘王小明’, ‘高雄市’, ’05/07/2014’)”);
Prepared Statement $db = new PDO($dsn, $db_user, $db_password); 作法一: $stmt = $db->prepare("INSERT INTO student_profile (name, addr, birth) VALUES (?, ?, ?)"); $stmt->execute(array("王小明", "高雄市", "05/07/2014" )); 作法二: $stmt = $db->prepare("INSERT INTO student_profile (name, addr, birth) VALUES (:name, :addr, :birth)"); $stmt->execute(array( “:name" => "王小明", “:addr" => "高雄市", “:birth" => "05/07/2014" ));
刪除資料 do_delete_action.php show_delete_list.php • $count = $db->exec(DELETE 敘述) • $count表示剛才刪除了多少筆記錄 • 範例:將 student_profile資料表中,姓名欄位值為王小明的記錄刪除: $count = $db->exec(“DELETE from student_profile where name=‘王小明’ ”);
更新資料 do_update_action.php show_update_page.php show_update_list.php 姓名: 林小華 住址: 台北市 生日: 01/24/2009 • $count = $db->exec(UPDATE 敘述) • $count表示剛才更新了多少筆記錄 • 範例:更新 student_profile資料表中學號為 2的記錄, 將姓名改成王小青: • $count = $db->exec(“UPDATE student_profile set name=‘王小青’ where id=2”)
整合範例 整合前執行流程 整合後執行流程
整合前執行流程 修改 開始 查詢 開始 新增 開始 刪除 開始 結束 執行刪除SQL 執行新增SQL 執行修改SQL 結束 結束 結束
使用Header()函數轉址 • 轉址 • header(“Location: 導向的網址”); • header(“Location: ./show_insert_page.php"); • 如何轉頁並傳遞變數 • header(“Location: ./show_update_page.php?stu_id=26"); • 常犯錯誤 • 在header()執行前輸出文字 • 轉址後,不結束程式
新增範例 1 2 7 4 6 3 5
新增範例 1 1 2 2
新增範例 4 4 3 5
新增範例 7 6 6
建立資料庫引用檔 • 一般會將存取資料庫的必要步驟獨立為引用檔: • 連線伺服器 • 設定連線字元集 • 選擇資料庫 • 範例: $db_server = “db.mis.kuas.edu.tw”; $db_name = “cobol”; $username = “cobol”; $password = “1234”; if( ! @mysql_connect($db_server, $username, $password) ){ die(‘連線資料庫伺服器失敗’); } mysql_query(“SET NAMES utf8”); if( ! @mysql_select_db($db_name) ){ die(‘選取資料庫失敗’); }
建立資料庫引用檔 • 假設此引用檔的檔名為 mysql.inc.php • 其他 PHP 檔案只要執行 include ("mysql.inc.php"); 就可以完成連線伺服器、指定使用的字元集以及資料庫。 • 因為資料庫引用檔包含連線伺服器的帳號和密碼,請務必使用 .php為副檔名,以避免外洩。