Trước hết, ý tưởng lưu trữ các chuỗi thoát trong cơ sở dữ liệu có vẻ kỳ lạ. MySQL có thể lưu trữ các chuỗi ký tự tùy ý và thậm chí có thể lưu trữ các chuỗi nhị phân một cách an toàn.
Bây giờ về ánh xạ từ tiêu đề thực đến URL đẹp và ngược lại. Ý tưởng chuyển đổi tiêu đề thành chuỗi thân thiện với URL và sau đó quay lại không phải là cách phổ biến để giải quyết vấn đề của bạn, vì rất khó để thực hiện chuyển đổi đó có thể hoàn nguyên. Cách thông thường để giải quyết vấn đề này là có cột riêng biệt trong cơ sở dữ liệu có chứa tên sách được sửa đổi để thân thiện với URL. Ngoài ra, các giá trị trong cột này phải là duy nhất. Bảng có thể trông như thế này:
+-----+-----------------------------+----------------------------+
| BID | book_title | book_title_url |
+-----+-----------------------------+----------------------------+
| 1 | Why Can't I Be You: A Novel | why-can-t-i-be-you-a-novel |
+-----+-----------------------------+----------------------------+
Bạn nên lập chỉ mục bảng của mình theo các cột này và sử dụng nó thay vì book_title
trong truy vấn SQL bên trong viewbook.php
của bạn tập lệnh như thế này:
SELECT * FROM books WHERE book_title_url='$booktitle'
Ở đâu $booktitle
chứa tên sách nhận được qua $_GET['booktitle']
và thoát đúng cách để ngăn chặn việc đưa SQL vào.
Vì vậy, các URL đẹp của bạn sẽ giống như http://www.example.com/title/why-can-t-i-be-you-a-novel
và chúng sẽ được Apache viết lại thành một thứ gì đó như http://www.example.com/viewbook.php?booktitle=why-can-t-i-be-you-a-novel
.
Một lần nữa, đây là cách phổ biến mà các URL đẹp thường được triển khai. hy vọng nó cũng sẽ hiệu quả với bạn.
Đối với các bản ghi hiện có, bạn có thể điền book_title_url
cột bởi một cái gì đó như thế này:
UPDATE books SET book_title_url=REPLACE(REPLACE(REPLACE(book_title, " ", "-"), ":", "-"), "'", "-");