php - 漂亮链接中的撇号和冒号

标签 php mysql apache .htaccess mod-rewrite

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

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  |
+-----+-------------------------------+

当我列出所有书名时,我再次取消转义字符串,所以它简单地列为:Why Can't I Be You: A Novel

我的 <a>链接显示未转义的标题,以及通过用破折号替换空格并省略撇号和冒号创建的漂亮链接,如下所示:

<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>

所以,解决我的问题。我希望能够列出所有格式化(未转义)的书籍标题,并使用连字符工作的“永久链接”/“漂亮链接”,并将正确的标题返回给 GET 方法。

在我的 .htaccess条目,我有以下 RewriteRule :

RewriteRule ^title/(.*[^/])/?$ viewbook.php?booktitle=$1 [NC,L]

这样做是采用 title/ 之后的“漂亮”链接部分并通过 GET 将其发送到 viewbook.php .例如,对于《麦田里的守望者》一书,以下内容是通过 GET 发送的:The-Catcher-in-the-Rye

没问题,因为在 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

当没有找到撇号时,此方法工作正常,但是,如果标题有撇号或冒号,则此方法无济于事,因为它不会在数据库中找到。我也不想使用 WHERE book_title LIKE '%$booktitle%'viewbook.php必须完全匹配。

我正在寻找一个优雅或简单的解决方案,使我能够通过 RewriteRule 解决这个问题并且不必为 slug 添加额外的表到数据库中或 permalink ,并且我不想在 url 中使用撇号,例如 %27 用于单引号。这是一个大型数据库,数据输入在电子表格中完成,导出为 CSV 并上传到 SQL 数据库。单个条目没有前端以允许诸如 slug 之类的事情或等效的。

我希望我的解释很清楚。

最佳答案

首先,在数据库中存储转义字符串的想法看起来很奇怪。 MySQL 能够存储任意字符的字符串,甚至可以安全地存储二进制序列。

现在关于从真实标题到漂亮 URL 的映射以及返回。将标题转换为 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 |
+-----+-----------------------------+----------------------------+

您应该通过这些列索引您的表格,并在您的 viewbook.php 脚本中的 SQL 查询中使用它而不是 book_title,如下所示:

SELECT * FROM books WHERE book_title_url='$booktitle'

其中 $booktitle 包含通过 $_GET['booktitle'] 接收的书名并正确转义以防止 SQL 注入(inject)。

所以你漂亮的 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/

相关文章:

javascript - 将值从 JQUERY 传递到 PHP,然后输出到 FORM 中的 INPUT

php将数组行重新排列成列以显示在表中

mysql 替换某些条目的字符串片段

javascript - 跨域 REST POST 进行预检但不跟进

javascript - jQuery 选择动态元素

php - Laravel Model函数 “create”和 “insert”有什么区别?

php - CakePHP语句查询

mysql - Matlab 数据库工具箱 - 警告 : com. mysql.jdbc.Connection@6e544a45 不可序列化

php - laravel 和 apache mod_status

apache - 亚马逊 EC2 云托管