[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database

Sau loạt bài viết về ý tưởng xây dựng ứng dụng tra cứu tabs số GP5 Guitar, nay mình tiếp tục phần thứ 3 của công cuộc thực hiện ý tưởng này^^

[Ý tưởng] Xây dựng trang chia sẻ tab số Guitar pro

[Chia sẻ] Download hơn 3000 tabs guitar pro

[Tutorial part 1] Xây dựng viettabs.cf – Đăng ký Hosting, Domain, Upload data

[Tutorial part 2] Xây dựng viettabs.cf – Thư viện Web đọc file guitar tab pro

Sau bài thư viện Web để đọc file Guitar tab pro thì mình đã đọc và hiển thị thành công tab guitar lên Web. Mình cũng đã deploy lên cái Hosting free hôm trước mình đăng ký

http://viettabs.cf/demo.html

Cơ mà như hôm trước mình demo trước có 1 bài “Ngày xưa ơi”, thì trong file demo.html mình config chỗ data-file thành đường dẫn đến file ngay xua oi.gp5 như hình.

Vậy theo cách này thì mỗi file gp5 sẽ là một file html tương ứng. Bạn có thấy vấn đề gì chưa?

OMG!!! Mình có hơn 3000 file tab guitar, chẳng lẽ cứ phải sửa và save as thành 3000 file html. kaka

Ngày xưa lúc làm trang Web đầu tiên, mình có mục nghe nhạc và mình từng làm như thế. Công nhận xưa siêng thật, giờ biết PHP rồi thì làm biếng hơn rồi. kaka

http://trangxoa.likesyou.org/web/data/nhac%20anh.html

[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
Đấy, mấy bài nhạc này là mình làm hoàn toàn thủ công với HTML đấy, siêng chưa :v

Giờ không siêng vậy nữa, chúng ta có PHP và chúng ta sẽ dùng nó.

Tạo Database Guitar

Giờ hình dung cái trang demo.html của mình sẽ là template chung để hiển thị tab. Tất cả các trang tab đều có cùng chung cấu trúc như vậy, chỉ khác nhau chỗ khai báo tên tab guitar thôi.

Vậy đường dẫn đến file tab sẽ là một biến “động” mà ta sẽ chèn vào bằng PHP. Cơ mà danh sách các giá trị cho  biến này sẽ lấy từ đâu ra, chúng ta cần có một Database để lưu trữ các giá trị này.

Ok, vậy giờ thiết kế Database. Vậy Database này sẽ có những thông tin gì?

Thiết kế Database guitar tab Database

Đầu tiên là cần có tên tab guitar để thế vào cái template kia (demo.html)

Thứ 2 là cần có các thông tin giúp có thể tạo chức năng tìm kiếm được. Ơ, cơ mà mình chỉ có mỗi thông tin tên tab thôi chứ ngoài ra không có thông tin gì nữa thì làm sao?

Uh thì… dùng mỗi tên tab file để search thôi

Mình còn muốn có chức năng để biết tabs nào được xem nhiều nhất (hot tabs). Vậy sẽ có chỗ để lưu thông tin lượt xem :v

Tạo Database guitar

Database của mình sẽ tên là viettabs, và mình sẽ dùng MySQL để làm Database Server vì cái Hosting kia chỉ hỗ trợ MySQL thôi ^^

viettabs

Tạo Database
Tạo Database
Tạo Database
Tạo Database

Tạo các bảng lưu thông tin

Như nãy lúc thiết kế, mình có 2 chức năng chính là lưu thông tin tab để hiển thị và tìm kiếm, cái thứ 2 là thông tin về lượt xem để xây dựng chức năng hot tabs

Bảng lưu các tabs của mình sẽ tên tabs, trong này sẽ có các thông tin như

  • Tên tab (tên file name)
  • Tên bài hát để search (sẽ chuyển từ tên tab file sang tên không dấu, viết thường)
  • Lượt xem
  • id của bài hát
Tạo các bảng lưu thông tin
Tạo các bảng lưu thông tin

Import dữ liệu vào Database

Tạo xong bảng để lưu dữ liệu rồi, giờ thì lấy dữ liệu ở đâu để đưa vào :v

Import dữ liệu vào Database
Import dữ liệu vào Database

Trả lời: Chúng ta sẽ nhập tên 3000 file guitar tab vào, haha (giỡn thôi chứ nhập chắc đến tết Công Gô chưa xong :v )

Giờ chúng ta sẽ viết một cái tool đọc hết danh sách file trong thư mục tabs rồi insert vào Database (3316 file)

Danh sách tab guitars
Danh sách tab guitars

Hồi trước lúc làm trang Trắng Xóa Danh ngôn mình có note một hàm dùng để duyệt hết danh sách ảnh trong một thư mục, giờ có thể sử dụng lại được

http://trangxoa.com/danhngon/

Hàm lấy hết danh sách file trong thư mục
Hàm lấy hết danh sách file trong thư mục
Hàm lấy hết danh sách file trong thư mục
Hàm lấy hết danh sách file trong thư mục

https://q2a.dothanhlong.org/?qa=153/php-list-all-images-in-a-folder&show=153#q153

Tool đọc danh sách file guitar tabs

Tool đọc danh sách file guitar tabs
Tool đọc danh sách file guitar tabs
Tool đọc danh sách file guitar tabs
Tool đọc danh sách file guitar tabs

Ok, vậy là lấy được danh sách các file rồi. Giờ insert danh sách này vào Database thôi^^

Insert guitar tabs to Database

Để đưa được dữ liệu vào trong Database chúng ta sẽ dùng lệnh Insert SQL

Insert guitar tabs to Database
Insert guitar tabs to Database

https://www.w3schools.com/php/php_mysql_insert.asp

Ở đây, mình đã viết sẵn hàm Insert để sử dụng cho nó ngắn gọn hơn là mỗi lần muốn insert lại phải gõ lại lệnh SQL kia

Insert guitar tabs to Database
Insert guitar tabs to Database

Bệnh cạnh đó, mình cũng có một hàm dùng để chuyển hết các ký tự đặc biệt, chuyển chữ hoa thành chữ thường để dùng insert vào cột searchname

Tại sao dữ liệu mình dùng để tìm kiếm mình lại đưa về không dấu, không ký tự đặc biệt và viết thường?

Lý do vì mình sẽ không biết người dùng nhập cái gì vào ô tìm kiếm. Do vậy mình sẽ chuyển hết những gì họ nhập về một kiểu chung với cái mình có để so với nhau cho chắc. Và chuẩn chung cho dữ liệu của mình với keyword người dùng nhập vào là text phải ở dạng viết thường, không ký tự đặc biệt, không dấu. haha

Vậy thì mình có một hàm mà trước kia mình viết cho SEO. Đó là seo_friendly_url

seo_friendly_url
seo_friendly_url

Công dụng loại bỏ hết ký tự đặc biệt, chuyển chữ hoa thành chữ thường đồng thời cũng loại bỏ hết dấu của từ.

seo_friendly_url
seo_friendly_url

Vấn đề về id của bài hát

Do id (ở đây mình có cột id, và mình cho nó tự động tăng khi một record được insert vào) là mã định danh của từng bài. Do vậy nó rất quan trọng để chúng ta xác định được bài hát. Nhưng nếu chúng ta cứ để nó tự động tăng (như mình đang set) thì sẽ rất dễ bị crawl dữ liệu. Người nào thích vọc họ sẽ chạy một cái vòng lập từ 0 đến khi error là lấy được hết dữ liệu.

Vậy mình sẽ tạo một cột mã, với giá trị là md5 radom một cái gì đó :v. Đố ai dịch ra được :v

Cột mới của mình sẽ là tabcode

[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
Giờ thì insert vào thôi^^

Đang insert thì bị lỗi thế này

Lỗi addslashes insert dữ liệu vào Database
Lỗi addslashes insert dữ liệu vào Database

Lỗi này là do trường filename có chứa ký tự đặc biệt là dấu nháy đơn ‘

Dấu này làm cho SQL không biết đâu là chuỗi, đâu là biến. Cụ thể các kiểu chuỗi thế này sẽ bị

05 Je t’aimais, je t’aime, je t’aimerai

Để giải quyết ta thêm lệnh addslashes để xử lý chuỗi cần insert

https://www.w3schools.com/php/func_string_addslashes.asp

Kết quả xử lý xong sẽ thành

05 Je t\’aimais, je t\’aime, je t\’aimerai

Sửa xong, chạy được rồi thì đang chạy được hơn 1000 record thì gặp lỗi

Lỗi maximum thời gian xử lý của PHP
Lỗi maximum thời gian xử lý của PHP

Lỗi này do mặc định thời gian xử lý của PHP là 30 giây thôi. Mình chạy tool này 30s mới được hơn 1000 record, trong khi dữ liệu là hơn 3000, do vậy nó không đủ thời gian xử lý => lỗi

Vậy mình tạm thời tăng maximum thời gian xử lý của PHP cho file này luôn

tăng maximum thời gian xử lý của PHP
tăng maximum thời gian xử lý của PHP

https://q2a.dothanhlong.org/?qa=168/maximum-execution-time-php

Thêm đoạn ini_set ở đầu file

Database thì ta Truncate để xóa hết record đã import lúc đầu

 Truncate để xóa hết record đã import
Truncate để xóa hết record đã import

Kết quả

Sau khi chạy tool

[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
Kiểm tra trong Database đã  có 3316 record (Thế là đủ :v )

[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database
Test thử tìm kiếm một tab nhạc thử, ví dụ tìm tab có tên Yesterday

Kết quả có 6 tabs có liên quan đến Yesterday. Vậy là Ok rồi^^

Test thử tìm kiếm một tab nhạc thử
Test thử tìm kiếm một tab nhạc thử

Vậy là tạm xong phần Database.

Phần sau mình sẽ hướng dẫn viết giao diện ứng dụng, kết nối ứng dụng với Database^^

-soiqualang_chentreu-