我想解决一个问题,处理“漂亮的链接”或“永久链接”,列出书名,如:

http://www.example.com/title/The-Catcher-in-the-Rye/

当我处理常规的书名时,例如有简单的单词或空格,没有问题,因为我可以简单地用破折号替换空格,并通过执行反向操作在数据库中查找书名。
然而,当我的书名中要么有撇号-要么有冒号str_replace时,问题就出现了,或者在这个例子中两者都有:
Why Can't I Be You: A Novel

在我的sql数据库中,所有单引号都被转义,因此数据库中的条目如下所示:
+-----+-------------------------------+
| BID | book_title                    |
+-----+-------------------------------+
|   1 | Why Can\'t I Be You: A Novel  |
+-----+-------------------------------+

当我列出所有书名时,我再次取消字符串的缩放,因此它只列出:'
My:链接显示未转义的标题,其中漂亮的链接是通过用破折号替换空格并省略撇号和冒号创建的,如下所示:
<a href="http://www.example.com/title/why-cant-i-be-you-a-novel" title="Why Can't I Be You: A Novel">Why Can't I Be You: A Novel</a>

所以,来谈谈我的问题。我想能够列出所有书籍的标题格式化(未转义),并有“永久链接/漂亮的链接”与连字符的工作,并返回正确的标题,以获取方法。
在我的Why Can't I Be You: A Novel条目中,我有以下<a>
RewriteRule ^title/(.*[^/])/?$ viewbook.php?booktitle=$1 [NC,L]

它所做的是获取.htaccess后面的“漂亮”链接部分,并通过GET toRewriteRule发送它。因此,例如,对于《麦田里的守望者》这本书,以下是通过GET发送的:title/
没问题,因为在php中解决这个问题很简单:
$booktitle = $_GET['booktitle'];
$goodBookTitle = str_replace('-', ' ', $booktitle);

// or we can do it all at once

$booktitle = str_replace('-', ' ', $_GET['booktitle']);

// Send $booktitle to SQL query and find the book

当没有找到撇号时,这个方法可以很好地工作,但是,如果标题有撇号或冒号,这个方法就没有帮助,因为在数据库中找不到它。我也不想使用viewbook.php,因为The-Catcher-in-the-Rye必须是完全匹配的。
我正在寻找一个优雅或简单的解决方案,使我能够通过一个WHERE book_title LIKE '%$booktitle%'来解决这个问题,而不必在数据库中添加额外的表来表示viewbook.phpRewriteRule,而且我不想在url中使用撇号,如%27表示单引号。这是一个大型数据库,数据输入在电子表格中完成,导出到CSV并上载到SQL数据库中。单个条目没有前端允许slug或等效条目。
我希望我的解释清楚。

最佳答案

首先,在数据库中存储转义字符串的想法看起来很奇怪。MySQL能够存储任意字符的字符串,甚至可以安全地存储二进制序列。
现在关于从真正的标题映射到漂亮的网址和回来。将title转换为URL友好的字符串,然后再转换回不是解决问题的常见方法,因为很难使这种转换可逆。解决这个问题的通常方法是在数据库中有单独的列,其中包含修改为对URL友好的书名。还应使此列中的值唯一。桌子可能是这样的:

+-----+-----------------------------+----------------------------+
| BID | book_title                  | book_title_url             |
+-----+-----------------------------+----------------------------+
|   1 | Why Can't I Be You: A Novel | why-can-t-i-be-you-a-novel |
+-----+-----------------------------+----------------------------+

您应该按此列索引表,并在book_title脚本中使用它,而不是在SQL query中使用viewbook.php,如下所示:
SELECT * FROM books WHERE book_title_url='$booktitle'

其中$booktitle包含通过$_GET['booktitle']接收的书名,并正确转义以防止SQL注入。
因此,漂亮的url看起来像http://www.example.com/title/why-can-t-i-be-you-a-novel,它们将被Apache重写为类似http://www.example.com/viewbook.php?booktitle=why-can-t-i-be-you-a-novel的内容。
同样,这也是漂亮的url通常的实现方式。希望对你也有用。
对于现有的记录,您可以通过这样的方式填充book_title_url列:
UPDATE books SET book_title_url=REPLACE(REPLACE(REPLACE(book_title, " ", "-"), ":", "-"), "'", "-");

关于php - 漂亮链接中的使徒和冒号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15390562/

10-10 04:24