【问题标题】:user-friendly URLs reliable with the database对数据库可靠的用户友好 URL
【发布时间】:2012-01-02 22:04:30
【问题描述】:

我有一个数据库,其中包含一个名为 songs 的表,其中包含一个字段 title。 现在如果我的网址是http://www.foo.com/songs/xxx(xxx = 歌曲的标题), apache 正在默默地重定向到一个类似于:/song.php?title=xxx 的页面。

为了修饰 URL,我将空格转换为下划线(因为我知道某些浏览器显示 %20 而不是空格,而不是 %20really%20user%20friendly%20ya%20know%20what%20i%20mean)。

如果标题包含空格和下划线(例如DJ_underscore fx)并且脚本将其转换为DJ_underscore_fx sql,则会出现问题:

    select * from songs where songs.title=xxx

找不到。

这是更具体的草图:

  • 脚本获取数据库中的不同标题
  • 将所有空格转换为下划线(例如name_of the song -> name_of_the_song)
  • 将它们作为链接回显(例如<a href="/songs/name_of_the_song">name_of_the_song</a>
  • 用户点击链接并请求文档
  • apache 正在静默重定向(例如/songs/name_of_the_son -> /song.php?title=name_of_the_song)
  • song.php 获取特定数据(例如select * from songs where songs.title=name_of_the_song

好的,您看到数据库中没有看起来像 name_of_the_song 而是 name_of the song 的条目。

如何管理整体,以使我的 URL 保持清晰,并且 title 字段不限于一定数量的值(可以有空格、下划线、破折号,以及任何东西)?

【问题讨论】:

    标签: php sql url user-experience


    【解决方案1】:

    使用/1234/name-of-page/ 之类的东西,其中1234 是行的主键ID,name-of-page 会被您的脚本忽略。

    这提供了一个直接指向表中条目的主键的链接,这将为您带来几个好处:

    1. 不需要有重复的 ID 字段。
    2. SELECT 查询的快速索引。
    3. 您仍然可以获得“漂亮”网址的可读性和 SEO 优势。

    您可能会注意到 StackOverflow 本身就是这样做的:

    /questions/8211267/user-friendly-urls-reliable-with-the-database/

    这可能会被重写为:

    question.php?id=8211267

    【讨论】:

    【解决方案2】:

    只需添加另一个字段以保留 URL 中使用的确切名称。当您有一些“重复”时 - 只需将它们附加 _2、_3 等,或者为用户提供一种编辑方式并手动提供另一个名称。

    【讨论】:

    • 或执行类似/1234/name-of-whatever/ 的操作,其中1234 是对象的ID,name-of-whatever 被脚本忽略。
    • @Polynomial:甚至更好。你应该把它作为一个单独的答案
    • @zerkms 我考虑过这个解决方案,但是由于我花了很多时间来弄清楚我的请求,我现在无法开箱即用,我只是希望有其他解决方案,无论如何谢谢,我只是在等待更多答案,但必须是已检查的答案
    【解决方案3】:

    您试图实现的目标肯定是错误的方式,您可能需要在数据库中查找数百种变体,而且对 SEO 也不利。

    首先设置一个规则,即所有 URL 都有 _ 来分隔空格,这就是大多数站点 URL 的完成方式(以 digg.com 为例)。

    然后创建一个单独的字段来存储 URL,例如

    title     | url
    song name | song_name
    

    然后根据 URL 字段进行查找。

    由于遗留原因,当您在执行数据库查询之前从 GET 收到标题时,您还可以将查找脚本中的任何空格替换为 _。

    【讨论】:

      【解决方案4】:

      好吧,如果你想在 url 中有空格,人们会将它 uri 编码为传输。如果不是用空格替换所有 _ ,只需使用 uridecoder (不记得确切的标题)。它仍然允许输入空格。在显示器上,链接中显示的文本,你不能用str_replace 来转换空格中的 %20 吗?

      具有计算机友好版本的标题(不使用空格,但使用下划线)和具有空格的用户友好列

      【讨论】:

        猜你喜欢
        • 2015-03-29
        • 1970-01-01
        • 2012-04-25
        • 2013-01-29
        • 2018-11-09
        • 2012-07-05
        • 2010-11-07
        • 2015-01-31
        • 2011-07-30
        相关资源
        最近更新 更多