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
Đấ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 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
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
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)
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
https://q2a.dothanhlong.org/?qa=153/php-list-all-images-in-a-folder&show=153#q153
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
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
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
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ừ.
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
Giờ thì insert vào thôi^^
Đang insert thì bị lỗi thế này
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 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
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
Kết quả
Sau khi chạy tool
Kiểm tra trong Database đã có 3316 record (Thế là đủ :v )
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^^
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-]]>
Warning: Undefined variable $comments_number in /shared/webdir2/dothanhlong.org/wp-content/themes/business-hub/comments.php on line 35
Warning: Undefined variable $comments_number in /shared/webdir2/dothanhlong.org/wp-content/themes/business-hub/comments.php on line 39
0 thoughts on “[Tutorial part 3] Xây dựng viettabs.cf – Thiết kế, Import dữ liệu vào Database”