Thao tác với cơ sở dữ liệu - kết hợp php và mysql


tự học php nâng cao 22/07/2015 Cùng chuyên mục

Tìm hiểu quy trình làm việc giữa php và mysql: kết nối tới cơ sở dữ liệu, thực thi truy vấn, xử lý kết quả...

Những lợi ích khi lưu trữ dữ liệu với cơ sở dữ liệu:

- Dữ liệu được lưu trữ tập trung nên dễ dàng quản lý
- Bảo mật
- Các hệ quản trị cơ sở dữ liệu cung cấp nhiều thao tác quản trị mạnh mẽ và phong phú
- ...

PHP hỗ trợ việc truy cập tới cơ sở dữ liệu với nhiều hệ quản trị cơ sở dữ liệu như Mysql,
Mssql, Oracle,...với nhiều driver như mysql, mysqli, PDO, ODBC,...Từ phiên bản php 5.3
trở đi, thư viện mysqli được khuyến khích thaythế cho mysql. Bài này giới thiệu cách thức
thao tác tới cơ sở dữ liệu sử dụng thư viện mysqli.

QUY TRÌNH THAO TÁC VỚI CƠ SỞ DỮ LIỆU:

  1. Kết nối tới CSDL
  2. Xây dựng câu truy vấn
  3. Thực thi câu truy vấn
  4. Xử lý kết quả trả về
  5. Ngắt kết nối

KẾT NỐI TỚI CƠ SỞ DỮ LIỆU

Để thao tác tới cơ sở dữ liệu, trước hết cần phải kết nối được tớimáy chủ cơ sở dữ liệu
(database server), cụ thể ở đây kết nối tới Mysql server. Để đảm bảo việc kết nối thành
công cần có các thông tin sau:

- user: tên truy cập
- password: mật khẩu truy cập
- host: tên miền hoặc ip của máy chủ cơ sở dữ liệu
- [tùy chọn] database: tên cơ sở dữ liệu sẽ thao tác

Sử dụng hàm mysqli_conect() để tạo kết nối tới cơ sở dữ liệu: 

mysqli_connect(string $host, string $username, string $passwd, string $dbname,int port, int socket)

Trong đó:
- host: là tên miền hoặc địa chỉ IP của mysql server như 'localhost', '127.0.0.1'
- dbname[tùy chọn] tên cơ sở dữ liệu sẽ được lựa chọn để thao tác
- port[tùy chọn] cổng kết nối tới mysql server - mặc định là 3306
- socket [tùy chọn]: kết nối kiểu socket, (ít dùng)

Ví dụ: Kết nối tới mysql server, host: localhost, username: my_user, password: my_pass, database: my_db

<?php
//tạo liên kết tới mysql server
$link = mysqli_connect('localhost', 'my_user', 'my_pass', 'my_db');
//nếu kết nối thất bại $link = NULL và sẽ báo lỗi
if (!$link) {
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}
echo 'Kết nối thành công... ';
mysqli_close($link);
?>

Hàm mysqli_close() - dùng để ngắt kết nối
Lưu ý: không quên ngắt kết nối tới cơ sở dữ liệu để tiết kiệm tài nguyên và bảo mật.

THỰC THI CÁC LỆNH TRUY VẤN:

Cú pháp:
$lien_ket_csdl->query(string $stament);
Ở đây biến $lien_ket_csdl được tạo ra bởi hàm mysqli_connect(), $stament: là câu lệnh truy vấn
theo cú pháp của mysql ( bạn cần có kiến thức về truy vấn cơ sở dữ liệu).

Lưu ý
: Nếu khi tạo liên kết tới mysql server chưa có tham số database_name hoặc muốn sử dụng
database khác sử dụng hàm:
mysqli_select_db(string $dbname): kết quả trả về là TRUE nếu thành công

TẠO BẢNG - CREATE TABLE:

Việc tạo bảng vẫn thực hiện bình thường như khi truy vấn bằng các công cụ như phpmyadmin,
mysql command... chỉ khác là câu lệnh truy vấn được thực hiện thông qua driver của php. 

Ví dụ: Tạo bảng user với các trường sau: user name, user id, user_age

<?php
//tạo liên kết tới mysql server
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
//nếu kết nối thất bại $link = NULL và sẽ báo lỗi
if (!$link) {
die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}
echo 'Kết nối thành công... ';
//thực thi lệnh truy vấn
$stament = "CREATE TABLE user( user_id mediumint unsigned not null primary key AUTO_INCREMENT, 
user_name varchar(80), user_age tinyint unsigned default 0);";
if($link->query($stament))
{
echo 'Tạo bảng thành công';
}
else
{
echo 'Lỗi: ',mysqli_error($link);
}
mysqli_close($link);
?>

- Hàm mysqli_error() : trả ra một chuỗi mô tả lỗi. Để tiện lợi, bạn có thể lưu phần code kết nối vào 1 file rồi include khi cần, chẳng hạn: connect_db.php - (lưu ý: file connect_db.php bỏ dòng lệnh
mysqli_close($link);

THÊM DỮ LIỆU VÀO MỘT BẢNG:

Với ví dụ phía trên đã tạo ra bảng user, để thêm dữ liệu ta sử dụng câu truy vấn (statement) insert với giá trị của biến được đưa vào câu truy vấn ( các lần khác, bạn có thể tham khảo cách đưa giá trị biến vào câu truy vấn sql ). Câu truy vấn là một chuỗi, do đó để đưa giá trị của biến vào câu truy vấn sql - cũng tức là đưa giá trị của biến vào chuỗi.

<?php
//gọi file connect_db.php để thực thi kết nối tới cơ sở dữ liệu
require "connect_db.php";
$user_name = 'Hoang Van A';
$user_age = 18;
//sử dụng sprintf để in ra chuỗi có định có định dạng
$sql = sprintf("INSERT INTO user (user_name,user_age) values ('%s','%d');",$user_name,$user_age);
/*bạn cũng có thể viết như sau:
$sql = "INSERT INTO user (user_name,user_age) values ('{$user_name}','{$user_age}');";
*/
if($link->query($sql))
{
	echo 'Chèn dữ liệu thành công';
}
else
{
	echo 'Lỗi: ',mysqli_error($link);
}
mysqli_close($link);
?>

TRẢ RA KẾT QUẢ TRUY VẤN:

Sau khi thực thi câu truy vấn thì biến $link đã giữ kết quả trả ra ( biến $link có kiểu resource). Có 4
dạng dữ liệu trả ra ( kết quả ), tùy theo cách bạn sử dụng:

  • Dạng đối tượng (object)
  • Dạng mảng đánh chỉ số 0, 1, 2, 3
  • Dạng mảng - với các trường (field) của kết quả truy vấn là key
  • Dạng mảng phức hợp

Dạng đối tượng:

- Sử dụng hàm mysqli_fetch_object($result) - biến $result tạo ra từ
hàm mysqli_query() 
Ví dụ: 
Lấy ra tất cả thông tin từ bảng user - kết quả trả ra dạng đối tượng

<?php
//triệu gọi file connect_db.php
include "connect_db.php";
//chuẩn bị câu truy vấn
$sql = "SELECT * FROM user";
//nếu câu truy vấn thành công
if($result = $link->query($sql))
{ 
while($user_info = mysqli_fetch_object($result))
{
//in ra kết quả, $user_info là một object 
printf("Ten: %s - tuoi: %s",$user_info->user_name,$user_info->user_age);
}
mysqli_free_result($result);
}
else
{
echo 'Lỗi: ',mysqli_error($link);
}
mysqli_close($link);
?>

Hàm mysqli_free_result(): để giải phóng bộ nhớ, sử dụng trong trường hợp kích thước kết quả lấyra quá lớn - bình thường mysql server sẽ tự giải phóng bộ nhớ.

Dạng mảng đánh chỉ số 0, 1, 2,.. :

Trong kết quả lấy ra, các trường sẽ theo đánh chỉ số 0,1,2 ... - dùng hàm mysqli_fetch_row() - thứ tự này, tuần tự theo thứ tự của trường (field) trong bảng, tính từ trái qua phải. Ví dụ - bảng user vừa tạo ở trên có 3 trường, vị trí từ trái qua phải là: user_id, user_name, user_age thì user_id sẽ có chỉ số 0, user_name chỉ số 1, user_age chỉ số 2. Trong thực tế - ít khi sử dụng dạng này  (vì bạn phải nhớ vị trí).

<?php
include "connect_db.php";
//chuẩn bị câu truy vấn
$sql = "SELECT * FROM user";
//nếu câu truy vấn thành công
if($result = $link->query($sql) )
{ 
//lấy kết quả truy vấn, trả ra dạng mảng
while($user_info = mysqli_fetch_row($result))
{
//xem cấu trúc biến $user_info
print_r($user_info);
printf("Ten: %s - tuoi: %s",$user_info['1'],$user_info['2']);
}
mysqli_free_result($result);
}
else
{
echo 'Lỗi: ',mysqli_error($link);
}
mysqli_close($link);
?>

Dạng mảng - với các trường là key:

Sử dụng hàm mysqli_fetch_array() - tương nhự như hàm mysqli_fetch_assoc() ( dạng mảng phức hợp) - dạng oject hoặc dạng này, khi sử dụng sẽ có thuận tiện (dễ hiểu)

<?php
	include "connect_db.php";
	//chuẩn bị câu truy vấn
	$sql = "SELECT * FROM user";
	if($result = $link->query($sql) )
	{
		//lấy kết quả truy vấn, trả ra dạng mảng, các trường là key	
		while($user_info = mysqli_fetch_array($result))
		{
			print_r($user_info);
			//xuất ra kết quả
			printf("Ten: %s - tuoi: %s",$user_info["user_name"],$user_info["user_age"]);
		}
		mysqli_free_result($result);
	}
	else
	{
		echo 'Lỗi: ',mysqli_error($link);
	}
	mysqli_close($link);
?>

Lưu ý: Các câu truy vấn INSERT - UPDATE - DELETE sẻ trả ra kết quả là TRUE hoặc FALSE. Hàm mysqli_affected_rows($link) - đếm xem có bao nhiêu dòng chịu tác dụng của câu truy vấn, mặc định bạn có thể không thêm biến $link - tùy chọn $link để chỉ ra tính dòng chịu tác dụng cho kết nối nào.

Ví dụ: Thêm 1 user vào cơ sở dữ liệu và xem kết quả có thành công

<?php
	include "connect_db.php";
	$user_name = "Tran Van B";
	$user_age = 20;
	//chuẩn bị câu truy vấn
	$sql = sprintf("INSERT INTO user (user_name,user_age) values ('%s','%d');",$user_name,$user_age);
	//thực thi câu truy vấn
	if($result = $link->query($sql))
	{
		printf("Đã thêm: %d user",mysqli_affected_rows($link)); 
	}
	else
	{
		echo 'Lỗi: ',mysqli_error($link);
	}
	mysqli_close($link);
?>

- Sử dụng hàm mysqli_num_row() để đếm số dòng được lấy ra

<?php
	include "connect_db.php";
	//chuẩn bị câu truy vấn
	$sql = "SELECT * FROM user";
	if($result = $link->query($sql) )
	{ 
		printf("Số lượng user: %d",mysqli_num_rows($result));
	}
	else
	{
		echo 'Lỗi: ',mysqli_error($link);
	}
	mysqli_close($link);
?>

VẤN ĐỀ HIỂN THỊ TIẾNG VIỆT:

Khi bạn lưu trữ dữ liệu vào CSDL - mặc dù đã chọn charsetunicode nhưng khi truy vấn vẫn không
hiển thị được tiếng việt ( mặc dù đã đặt thẻ meta charset = "utf8"). Để giải quyết vấn đề này, sử dụng hàm set_charset() trước khi thực thi câu truy vấnhàm này đùng để thiết lập charset cho dữ liệu nhận được từ cơ sở dữ liệu - 
Ví dụ:

<?php
	include "connect_db.php";
	//chuẩn bị câu truy vấn
	$sql = "SELECT * FROM user";
	//thiet lap ket qua tra ra unicode
	$link->set_charset("utf8"); 
	if($result = $link->query($sql) )
	{
		//lấy kết quả truy vấn, trả ra dạng mảng, các trường là key	
		while($user_info = mysqli_fetch_array($result))
		{
			print_r($user_info);
			//xuất ra kết quả
			printf("Ten: %s - tuoi: %s",$user_info["user_name"],$user_info["user_age"]);			
		}
		mysqli_free_result($result);
	}
	else
	{
		echo 'Lỗi: ',mysqli_error($link);
	}
	mysqli_close($link);
?>

TƯƠNG TỰ, các bạn có thể sử dụng các truy vấn khác như UPDATE - DELETE ...

TỔNG KẾT

Các bạn cần nắm vững các chủ điểm sau:
- Quy trình thao tác với CSDL
- Cách thức kết nối CSDL
- Cách thực thi câu lệnh truy vấn
- Xử lý kết quả trả về 




Bình luận:


php cơ sở dữ liệu mysql