Em primeiro lugar, a ideia de armazenar strings com escape no banco de dados parece estranha. O MySQL é capaz de armazenar strings de caracteres arbitrários e até mesmo armazenar sequências binárias com segurança.
Agora sobre o mapeamento de títulos reais para URLs bonitos e vice-versa. A ideia de converter o título em uma string amigável ao URL e depois voltar não é a maneira comum de resolver seu problema, porque é muito difícil tornar essa conversão reversível. A maneira usual de resolver esse problema é ter uma coluna separada no banco de dados que contém o título do livro modificado para ser amigável ao URL. Além disso, os valores nestas colunas devem ser exclusivos. A tabela poderia ficar assim:
+-----+-----------------------------+----------------------------+
| BID | book_title | book_title_url |
+-----+-----------------------------+----------------------------+
| 1 | Why Can't I Be You: A Novel | why-can-t-i-be-you-a-novel |
+-----+-----------------------------+----------------------------+
Você deve indexar sua tabela por essas colunas e usá-la em vez de
book_title
na consulta SQL dentro do seu viewbook.php
roteiro assim:SELECT * FROM books WHERE book_title_url='$booktitle'
Onde
$booktitle
contém o título do livro recebido via $_GET['booktitle']
e escapou corretamente para evitar injeções de SQL. Assim, seus lindos URLs serão parecidos com
http://www.example.com/title/why-can-t-i-be-you-a-novel
e eles serão reescritos pelo Apache para algo como http://www.example.com/viewbook.php?booktitle=why-can-t-i-be-you-a-novel
. Novamente, essa é a maneira comum de como as URLs bonitas geralmente são implementadas. espero que funcione para você também.
Para registros existentes, você pode preencher
book_title_url
coluna por algo assim:UPDATE books SET book_title_url=REPLACE(REPLACE(REPLACE(book_title, " ", "-"), ":", "-"), "'", "-");