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 thay thế 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:
- Kết nối tới CSDL
- Xây dựng câu truy vấn
- Thực thi câu truy vấn
- Xử lý kết quả trả về
- 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:
1 | 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ụ 1: Kết nối tới mysql server với các thông tin, host: localhost, username: my_user, password: my_pass, database: my_db
12345678 | //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ụ 2: Tạo bảng user với các trường sau: user name, user id, user_age
1234567891011121314151617181920 | //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.
123456789101112131415161718 | //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ụ 3: Lấy ra tất cả thông tin từ bảng user – kết quả trả ra dạng đối tượng
12345678910111213141516171819 | //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í).
1234567891011121314151617181920 | 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)
12345678910111213141516171819 | 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ụ 4: Thêm 1 user vào cơ sở dữ liệu và xem kết quả có thành công
123456789101112131415 | 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
123456789101112 | 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 charset là unicode 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ấn, hàm này đùng để thiết lập charset cho dữ liệu nhận được từ cơ sở dữ liệu –
Ví dụ 5: Hiển thị tiếng việt (lưu định dạng unicode) vào trong cơ sở dữ liệu mysql bằng php
123456789101112131415161718192021 | 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 …
Giả sử có bảng dữ liệu user:
user_name | user_age |
Hoang Van A | 18 |
Nguyen Van B | 19 |
Le Van C | 20 |
Ví dụ 6: Xóa đi những user có tuổi (user_age) lớn hơn 18
1234567891011121314 | //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_age = 18; //câu truy vấn $sql = "DELETE FROM user where user_age > $user_age" ; if ( $link ->query( $sql )) { echo "Đã xóa các user có user_age > $user_age" ; } else { echo 'Lỗi: ' ,mysqli_error( $link ); } mysqli_close( $link ); |
Ví dụ 7: Đổi tên cho user có tên (user_name) : ‘Hoang Van A’ thành ‘Hoàng Văn An’
123456789101112131415 | //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' ; $sql = "UPDATE user where user_name = '$user_name' SET user_name = 'Hoàng Văn An' " ; //thiet lap ket qua tra ra unicode $link ->set_charset( "utf8" ); if ( $link ->query( $sql )) { echo "Đã đổi tên cho user 'Hoang Van A' " ; } else { echo 'Lỗi: ' ,mysqli_error( $link ); } mysqli_close( $link ); |
1 comments On Thao tác với cơ sở dữ liệu – kết hợp php và mysql
Good (y)