Trong phần này chúng ta sẽ xây dựng các chức năng để kết nối PHP với cơ sở dữ liệu MySQL.
Chúng ta sẽ xây dựng lớp DDatabase để thực hiện các chức năng cần thiết.
Trong thư mục dframework/libs/ tạo file ddatabase.php với nội dung sau:
?php
include(__DIR__.'/dsecurity.php');
class DDatabase extends DSecurity{
public $con=false;
public function db_connect($db_host,$db_user,$db_pass,$db_name){
$this->con = mysqli_connect($m_host,$db_user,$db_pass,$db_name);
if(!$this->con){
die('Could not connect: ' . mysqli_connect_error());
}
}
public function db_query($m_sql){
if($db_result=mysqli_query($this->con,$m_sql)){
return $db_result;
}else{
return false;
}
}
}
?>
include(__DIR__.'/dsecurity.php');
class DDatabase extends DSecurity{
public $con=false;
public function db_connect($db_host,$db_user,$db_pass,$db_name){
$this->con = mysqli_connect($m_host,$db_user,$db_pass,$db_name);
if(!$this->con){
die('Could not connect: ' . mysqli_connect_error());
}
}
public function db_query($m_sql){
if($db_result=mysqli_query($this->con,$m_sql)){
return $db_result;
}else{
return false;
}
}
}
?>
Để thuận tiện cho việc kết nối với nhiều loại cơ sở dữ liệu khác nhau, chúng ta sẽ không dùng trực tiếp các hàm của PHP để thao tác với dữ liệu mà xây dựng các hàm riêng để thực hiện, lợi ích là khi thay đổi chúng ta chỉ cần thay đổi trong lớp kết nối Database mà không cần phải thay đổi lại code đã viết ở các vị trí khác.
Viết thêm cho lớp DDatabase các chức năng sau:
1. Chức năng truy vấn: là chức năng lấy dữ liệu từ cơ sở dữ liệu để sử dụng trên website.
public function get_rows($m_sql){
if($rs=$this->db_query($m_sql)){
$m_data=array();
while($rows = mysqli_fetch_assoc($rs)){
$m_data[] = $rows;
}
return $m_data;
}
return false;
}
if($rs=$this->db_query($m_sql)){
$m_data=array();
while($rows = mysqli_fetch_assoc($rs)){
$m_data[] = $rows;
}
return $m_data;
}
return false;
}
2. Chức năng lưu trữ: là chức năng lưu dữ liệu từ website vào cơ sở dữ liệu.
public function db_insert($tbl_name,$tbl_data){
if(is_array($tbl_data)){
$m_fields=implode(',',array_keys($tbl_data));
$db_values=array();
foreach($tbl_data as $m_values){
$db_values[]="'$m_values'";
}
$m_sql="insert into $tbl_name($m_fields) values(".implode(',',$db_values).')';
return $this->db_query($m_sql);
}else return false;
}
if(is_array($tbl_data)){
$m_fields=implode(',',array_keys($tbl_data));
$db_values=array();
foreach($tbl_data as $m_values){
$db_values[]="'$m_values'";
}
$m_sql="insert into $tbl_name($m_fields) values(".implode(',',$db_values).')';
return $this->db_query($m_sql);
}else return false;
}
3. Chức năng cập nhật: là chức năng cập nhật lại dữ liệu đã có trong cơ sở dữ liệu.
public function db_update($tbl_name,$tbl_data,$m_where){
if(is_array($tbl_data)){
$m_fields=array_keys($tbl_data);
$db_values=array();
foreach($m_fields as $m_key){
$db_values[]="$m_key='{$tbl_data[$m_key]}'";
}
$m_value = implode(',',$db_values);
$m_sql="update $tbl_name set $m_value $m_where";
return $this->db_query($m_sql);
}
}
if(is_array($tbl_data)){
$m_fields=array_keys($tbl_data);
$db_values=array();
foreach($m_fields as $m_key){
$db_values[]="$m_key='{$tbl_data[$m_key]}'";
}
$m_value = implode(',',$db_values);
$m_sql="update $tbl_name set $m_value $m_where";
return $this->db_query($m_sql);
}
}
4. Chức năng xóa: là chức năng xóa dữ liệu đã có trong cơ sở dữ liệu.
public function db_delete($tbl_name,$m_where){
return $this->db_query('delete from '.$tbl_name.' '.$m_where);
}
return $this->db_query('delete from '.$tbl_name.' '.$m_where);
}
Ứng dụng:
Thực hiện Example 3 với yêu cầu sau:
1. Nhập vào tên xe và lưu trữ các thông tin này vào cơ sở dữ liệu
2. Sau khi nhập xong sẽ hiện danh sách các xe đã nhập
3. Khi nhấn nút xóa ứng với mỗi xe trong danh sách thì xóa dữ liệu này trong cơ sở dữ liệu
4. Khi nhấn nút sửa tương ứng thì cho phép cập nhật lại dữ liệu đó
Thực hiện:
Bước 1: Tạo Database tên mydatabase để sử dụng, sau đó tạo Table là cac_loai_xe đây là nơi chúng ta sẽ lưu trữ các thông tin mà người sử dụng nhập vào.
Tạo Database với phpMyAdmin
Trong bài hướng dẫn cài đặt PHP chạy Localhost trên Window mình có hướng dẫn cài đặt PHP bằng phần mềm Appserv, phần mềm này đã tích hợp sẵn phpMyAdmin hoặc bạn có thể tải về từ trang chủ phpMyAdmin

Để tạo database mới bạn vào mục Databases

Sau khi có Database chúng ta sẽ tạo thêm Table để chứa dữ liệu

Trong ví dụ này chúng ta chỉ đơn giản là lưu tên nên Table cac_loai_xe sẽ gồm 2 dữ liệu chính là id và name, trong đó id sẽ được tạo tự động và được sử dụng để cập nhật hoặc xóa dữ liệu.

Sau khi tạo xong chúng ta sẽ có thông tin:

Như vậy là chúng ta đã hoàn thành xong bước tạo dữ liệu cho website.
Bước 2: Lập trình
+ Trong thư mục dframework/example tạo file example3.php có nội dung sau:
?php
include('../libs/dframework.php');
$tpl = new DFramework;
$tpl->loadtemplate('example3.htm');
$tpl->db_connect('localhost','root','rootroot',mydatabase);
$tbl_name='cac_loai_xe';
$initAction=$initValue='';
if(isset($_POST['name'])){
if(isset($_GET['eid']) && intval($_GET['eid']) > 0){
$tpl->db_update($tbl_name,array('name' => strval($_POST['name'])),'where id='.intval($_GET['eid']));
}else{
$tpl->db_insert($tbl_name,array('name' => strval($_POST['name'])));
}
header('location:?');
}
if(isset($_GET['did']) && intval($_GET['did']) > 0){
$tpl->db_delete($tbl_name,'where id='.intval($_GET['did']));
header('location:?');
}
if(isset($_GET['eid']) && intval($_GET['eid']) > 0){
$m_init = $tpl->get_rows('select * from '.$tbl_name.' where id='.intval($_GET['eid']));
if($m_init){
$initValue = $m_init[0]['name'];
$initAction = '?eid='.intval($_GET['eid']);
}
}
$tpl->assign('data.init',$initValue);
$tpl->assign('data.action',$initAction);
if($allrows = $tpl->get_rows('select * from '.$tbl_name)){
foreach($allrows as $rows){
$rows['edit']='Sửa';
$rows['delete']='Xóa';
$tpl->assign('loaixe',$rows,'data');
}
$tpl->show_block('loaixe');
}
$tpl->assign($data_assign);
$tpl->display();
?>
include('../libs/dframework.php');
$tpl = new DFramework;
$tpl->loadtemplate('example3.htm');
$tpl->db_connect('localhost','root','rootroot',mydatabase);
$tbl_name='cac_loai_xe';
$initAction=$initValue='';
if(isset($_POST['name'])){
if(isset($_GET['eid']) && intval($_GET['eid']) > 0){
$tpl->db_update($tbl_name,array('name' => strval($_POST['name'])),'where id='.intval($_GET['eid']));
}else{
$tpl->db_insert($tbl_name,array('name' => strval($_POST['name'])));
}
header('location:?');
}
if(isset($_GET['did']) && intval($_GET['did']) > 0){
$tpl->db_delete($tbl_name,'where id='.intval($_GET['did']));
header('location:?');
}
if(isset($_GET['eid']) && intval($_GET['eid']) > 0){
$m_init = $tpl->get_rows('select * from '.$tbl_name.' where id='.intval($_GET['eid']));
if($m_init){
$initValue = $m_init[0]['name'];
$initAction = '?eid='.intval($_GET['eid']);
}
}
$tpl->assign('data.init',$initValue);
$tpl->assign('data.action',$initAction);
if($allrows = $tpl->get_rows('select * from '.$tbl_name)){
foreach($allrows as $rows){
$rows['edit']='Sửa';
$rows['delete']='Xóa';
$tpl->assign('loaixe',$rows,'data');
}
$tpl->show_block('loaixe');
}
$tpl->assign($data_assign);
$tpl->display();
?>
+ Trong thư mục dframework/example tạo file example3.htm có nội dung sau:
html>
link rel="stylesheet" type="text/css" href="../css/style.css">
body align="center">
form method="post" action="{data.action}">
br />p>Nhập vào tên xe input type="text" name="name" value="{data.init}" />/p>
input type="submit" value="Lưu dữ liệu" />
/form>
br>
table width="60%" border="1" style="border-collapse: collapse;margin:auto;text-align:center" cellspacing="0" cellpadding="5">
tr style="background:#f7f7f7">
td>ID/td>
td>Name/td>
td>Edit/td>
td>Delete/td>
/tr>
{d:block name="loaixe" loop="0"}
tr>
td>{data.id}/td>
td>{data.name}/td>
td>{data.edit}/td>
td>{data.delete}/td>
/tr>
{d:/block}
/table>
/body>
/html>
link rel="stylesheet" type="text/css" href="../css/style.css">
body align="center">
form method="post" action="{data.action}">
br />p>Nhập vào tên xe input type="text" name="name" value="{data.init}" />/p>
input type="submit" value="Lưu dữ liệu" />
/form>
br>
table width="60%" border="1" style="border-collapse: collapse;margin:auto;text-align:center" cellspacing="0" cellpadding="5">
tr style="background:#f7f7f7">
td>ID/td>
td>Name/td>
td>Edit/td>
td>Delete/td>
/tr>
{d:block name="loaixe" loop="0"}
tr>
td>{data.id}/td>
td>{data.name}/td>
td>{data.edit}/td>
td>{data.delete}/td>
/tr>
{d:/block}
/table>
/body>
/html>
Kết quả:

Tổng kết:
Với ví dụ trên chúng ta đã ứng dụng được toàn bộ các chức năng của DFramework, từ sử dụng biến, block cho tới cơ sở dữ liệu, tất cả các hoạt động của website đều sẽ xoay quanh các chức năng cơ bản này.
Phân tích một số chức năng cơ bản trên website ta sẽ thấy như sau:
+ Trang sản phẩm: là lấy toàn bộ dữ liệu trong database sản phẩm và hiển thị lên website
+ Trang tin tức: là lấy toàn bộ dữ liệu trong database tin tức và hiển thị lên website
+ Xem chi tiết sản phẩm: là lấy 1 dữ liệu trong database sản phẩm và hiển thị
+ Đăng ký thành viên: là lưu lại thông tin người sử dụng đã nhập vào database user
+ Đăng nhập vào website: là lấy dữ liệu từ database user và so sánh với thông tin đã nhập vào
+ Đổi mật khẩu đăng nhập: là cập nhật lại thông tin đã lưu trong database user
Website càng lớn thì sẽ càng nhiều chức năng cho người sử dụng nhưng tất cả phần lập trình đều quay về 4 chức năng cơ bản trên.
Đến đây chúng ta đã hoàn thành được các phần cơ bản cho DFramework, trong các phần tiếp theo chúng ta sẽ đi vào các chức năng chi tiết hơn như cache lại website để tăng tốc độ truy cập, xây dựng cơ chế bảo mật cho các chức năng liên quan đến cơ sở dữ liệu.