Mình học PHP/MySQL mới được hơn nửa năm nay. Bây giờ thì mình đang làm bài tập nhóm cuối khóa.
Làm thì mình vướng vài chuyện không hay: 1 là phải gánh team (nhưng thôi bỏ qua vấn đề này), 2 là dù làm nhiều nhưng vẫn hay mắc mấy lỗi ngớ ngẩn. Trong post này, mình chia sẻ điều số 2.
- Lỗi chính tả, cú pháp
Khi có bug, điều đầu tiên phải làm là kiểm tra lỗi chính tả, mình luôn tự nhắc nhở mình như thế: dấu chấm phẩy, dấu phẩy, tên cột trong bảng có viết đúng không, viết có đúng phương thức không… - Lỗi truy vấn
Khi mà chẳng tìm thấy lỗi chính tả và cú pháp nào mà vẫn sai thì mình chắc chắn đến 80% là có lỗi trong câu truy vấn rồi.
2.1) Tên cột không rõ ràng
Điều này xảy ra khá thường xuyên khi mình thực hiện truy vấn SELECT có phép JOIN. JOIN dùng được khi hai bảng có kết nối bằng khóa ngoại. Vấn đề này sẽ chỉ xảy ra nếu tên cột chứa khóa ngoại của bảng này lại giống hệt với tên cột chứa khóa chính của bảng kia. Trong tình huống đó thì phải chỉ rõ cột thuộc bảng nào: table_name.col_name. Một cách giải quyết khác là đặt tên hai cột khác nhau(mình chọn cách này).
2.2) Thừa, thiếu dấu ngoặc tròn, dấu nháy tên cột trong câu lệnh INSERT INTO. - Prepare Statement
Khi thực hiện truy vấn MySQL trong PHP, 100% mình đều sử dụng Prepare Statement và mình hay vướng vào mấy lỗi kiểu này:
3.1) Thừa thiếu mấy dấu ?
3.2) Phép toán LIKE
Lần đầu dùng phép LIKE cùng với Prepare Statement, mình đã gõ kiểu này:
SELECT * FROM table_name WHERE col_name LIKE "%?%"
Mình đã hi vọng là nó sẽ lấp kí tự vào khi thực hiện Prepare Statement thế nhưng không được. Hóa ra là phải gõ thế này:
SELECT * FROM table_name WHERE col_name LIKE ?
Dấu ? đó sẽ được lấp vào bằng chuỗi %từ_tìm_kiếm%
3.3) Dùng REGEXP BINARY
Phép toán này mình mới biết hôm qua khi tìm kiếm một thôi một hồi trên google về cách tìm kiếm có dấu tiếng Việt. Đại đa số đề cập đến FULLTEXT search(tìm kiếm toàn văn) nhưng mình cứ loay hoay cho tới khi đọc một bài viết khác có đề xuất sử dụng REGEXP BINARY. Ưu điểm của cách này là nó rất dễ hiểu (bản chất là quy đổi hết thành chuỗi nhị phân để so sánh), không cần tạo FULLTEXT KEY, bảng có kiểu lưu trữ là InnoDB cũng được - trong khi FULLTEXT chỉ áp dụng cho MyISAM thì vài phiên bản gần đây InnoDB mới áp dụng.
Tìm kiếm khớp có dấu thì mình viết kiểu:
SELECT * FROM table_name WHERE col_name REGEXP BINARY "^từ_tìm_kiếm$"
Lưu ý trong biểu thức chính quy phải có ^ và $ thì mới là tìm kiếm khớp.
Lỗi Prepare Statement khi dùng REGEXP BINARY của mình cũng tương tự như khi dùng LIKE vậy. Phải làm như sau mới được:
SELECT * FROM table_name WHERE col_name REGEXP BINARY ?
Dấu ? sẽ được lấp bởi chuỗi “^từ_tìm_kiếm$”.
Nói thêm là cái lỗi ngớ ngấn này đã ngốn luôn cả tối hôm qua và sáng ngày hôm nay của mình.
4) JSON
Lỗi này là khi gửi hoặc nhận dữ liệu dạng JSON thì mình quên không sử dụng các hàm json_decode(), json_encode(), hoặc các phương thức JSON.parse(), JSON.stringify()
Nội dung của post này gói gọn trong kiến thức hạn hẹp của mình nhưng mình tin là chúng vẫn có ích.