Kết nối và truy vấn cơ sở dữ liệu MySQL với PDO

Thư viện hỗ trợ kết nối và thực hiện truy vấn đến database MySQL sử dụng PDO.

Cơ sở dữ liệu (database) là linh hồn của website nên việc kết nối, truy vấn dữ liệu thuận tiện và bảo mật cao là những yêu cầu quan trọng nhất. Với bộ thư viện này mọi xử lý liên quan đến MySQL sẽ trở nên đơn giản hơn bao giờ hết.

Khai báo sử dụng thư viện

$soc->use_database(string $host, string $dbname, string $user, string $pass);

Hoặc ngắn gọn hơn:

$soc->use_db(string $host, string $dbname, string $user, string $pass);
BiếnÝ nghĩa
$hostServer kết nối, thường là 'localhost'
$dbnameTên database
$userTên đăng nhập
$pass

Mật khẩu

Truy vấn lấy ra thông tin của 1 tài khoản admin

function login_tpl_select_user($email, $password){  	// Sử dụng SOC PHP Framework  	global $soc;  	  	// Câu truy vấn và dữ liệu của câu truy vấn  	$sql = "SELECT	*  		FROM	`user`  		WHERE	`User_Email`		=	:User_Email  			AND `User_Password`	=	:User_Password  			AND `User_RootAdmin`	=	:User_RootAdmin";  	$pdo = array(  		'User_Email'		=>	$email  		,'User_Password'	=>	$password  		,'User_RootAdmin'	=>	1  	);  	  	// Thực thi câu truy vấn  	$rs = $soc->db->query($sql, $pdo);  	  	// Trả về mảng dữ liệu hoặc mảng rỗng  	return isset($rs[0]) ? $rs[0] : array();  }

Nếu có dữ liệu, kết quả trả về sẽ là mảng 1 chiều với:

  • Key: Tên cột.
  • Value: Dữ liệu của cột.

Truy vấn lấy ra tất cả chuyên mục

function cat_select_tpl_select(){  	global $soc;  	$sql = "SELECT 		*  		FROM		`cat`  		ORDER BY 	`Cat_Order` ASC";  	return $soc->db->query($sql);  }

Trường hợp này do không cần lọc nên chúng ta không cần truyền vào mảng $pdo. Nếu kết quả câu truy vấn có dữ liệu thì sẽ trả về mảng dữ liệu 2 chiều với:

  • Mỗi mảng con là 1 dòng dữ liệu trong bảng.
  • Key: Tên cột.
  • Value: Dữ liệu của cột.

Truy vấn trả về mảng 1 chiều từ 2 cột dữ liệu

function cat_select_tpl_select(){  	global $soc;  	$sql = "SELECT 		`Cat_ID` AS `key`, `Cat_Name` AS `value`  		FROM		`cat`  		ORDER BY 	`Cat_Order` ASC";  	return $soc->db->query($sql, array(), PDO::FETCH_KEY_PAIR);  }

Trường hợp có dữ liệu, kết quả sẽ trả về mảng 1 chiều với:

  • Key: Dữ liệu cột Cat_ID.
  • Value: Dữ liệu cột Cat_Name.

Chạy nhiều câu truy vấn cùng cấu trúc nhưng khác dữ liệu

Liên quan đến tối ưu hiệu suất, khi bạn cần chạy 10 câu truy vấn có cấu trúc giống nhau nhưng chỉ khác dữ liệu thì không nên chạy riêng rẽ từng câu mà gom lại chạy cùng lúc. Ngay dưới chính là code mẫu:

function cat_action_tpl_insert($datas){  	// Sử dụng SOC PHP Framework  	global $soc;    	// Câu truy vấn  	$sql = "INSERT INTO	`cat`  		SET		`Cat_Name`	=	:Cat_Name  				,`Cat_Order`	=	:Cat_Order";  	  	// Chuẩn bị câu truy vấn  	$soc->db->prepare($sql);  	  	// Chạy cùng lúc nhiều câu truy vấn với dữ liệu khác nhau và trả về số câu truy vấn chạy thành công  	$rs = 0;  	foreach($datas as $data){  		$pdo = array(  			'Cat_Name'	=>	$data['Cat_Name']  			,'Cat_Order'	=>	$post['Cat_Order']  		);  		$temp = $soc->db->execute($pdo);  		$rs = $rs+$temp;  	}  	return $rs;  }

Lấy ra ID Auto_Increment được insert cuối cùng

Sau khi chạy câu truy vấn insert, nếu muốn lấy ra ID Auto_Increment cuối cùng thì có thể sử dụng lệnh sau:

$id = $soc->db->lastInsertId();

Bảng mã mặc định và thay đổi bảng mã

Database nên được cài đặt sử dụng bảng mã utf8mb4_unicode_ci để được hỗ trợ đầy đủ ký tự Unicode cũng như có thể sắp xếp và lọc dữ liệu chính xác theo chuẩn Unicode. Mặc định, khi chạy mọi câu truy vấn sử dụng thư viện này đều sẽ thực thi theo bảng mã utf8mb4. Trong trường hợp cần truy vấn sử dụng bảng mã khác thì bạn sẽ phải bổ sung dòng code theo ví dụ này:

$soc->db->query("set names 'utf8'"); 

Với những câu truy vấn nào nằm bên dưới dòng code trên sẽ được thực thi theo bảng mã utf8.

Cài đặt LogSql, lưu lại mọi thay đổi của database

Cài đặt này sẽ giúp lưu lại tất cả mọi câu truy vấn làm thay đổi database theo đúng thứ tự thời gian thực hiện nhằm:

  • Có thể phục hồi lại dữ liệu của database khi cần.
  • Xác định được người dùng nào đã thực hiện thao tác nào vào những thời điểm nào để quy trách nhiệm khi có sự cố phát sinh.
$soc->use_ip();  $custom_data = $soc->ip->getClientIP();  if(isset($_SERVER['HTTP_USER_AGENT'])){  	$custom_data .= PHP_EOL.$_SERVER['HTTP_USER_AGENT'];  }  $soc->db->logSql($table_prefix='LogSql', $custom_data, $fragment='yearly');  

Lưu ý:

  • Đoạn code trên thực hiện cài đặt log lại mọi thay đổi của database kèm theo địa chỉ IP và thông tin user agent của người dùng (để biết được người dùng ở đâu, đang sử dụng trình duyệt gì, thiết bị gì...). Nếu website có chức năng đăng nhập, bạn nên lưu kèm thêm thông tin là mã thành viên của người dùng.
  • $fragment được cài đặt là 'yearly' tức mỗi năm hệ thống sẽ tạo ra 1 bảng để lưu Log riêng cho từng năm. Tên bảng sẽ bắt đầu bằng 'LogSql'.
  • Bạn cần cài đặt LogSql trước khi thực hiện các câu truy vấn thì các câu truy vấn đó mới được lưu vào Log.
09-08-2021

Bài viết liên quan