удобные URL-адреса, надежные с базой данных - PullRequest
1 голос
/ 21 ноября 2011

У меня есть база данных, содержащая таблицу с именем песен с полем заголовок .Теперь, если мой URL-адрес 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 не ограничивалось определенным количествомзначений (может иметь пробелы, подчеркивание, тире, ну что угодно)?

Ответы [ 4 ]

5 голосов
/ 21 ноября 2011

Используйте что-то вроде /1234/name-of-page/, где 1234 - это идентификатор первичного ключа строки, а name-of-page игнорируется вашим сценарием.

Это дает ссылку непосредственно на первичный ключ записи втаблица, которая даст вам несколько преимуществ:

  1. Нет необходимости иметь дубликаты полей идентификатора.
  2. Быстрая индексация по SELECT запросам.
  3. Вы по-прежнему получаетечитабельность и преимущества SEO "красивого" URL.

Вы можете заметить, что сам StackOverflow делает именно это:

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

Что, вероятно, получает ренаписано что-то вроде:

question.php?id=8211267

3 голосов
/ 21 ноября 2011

Просто добавьте другое поле, в котором будет сохранено точное имя, используемое в URL.А когда у вас есть «дубликаты» - просто добавьте их с помощью _2, _3 и т. Д. Или дайте возможность пользователю редактировать и дать другое имя вручную.

1 голос
/ 21 ноября 2011

То, что вы пытаетесь достичь, определенно является неправильным путем, у вас могут быть сотни вариантов для поиска в вашей базе данных, а также это плохо для SEO.

Начните с установки правила, согласно которому все URL-адреса должны разделять пробел _, так делается большинство URL-адресов сайта (например, digg.com).

Затем создайте отдельное поле, в котором хранится URL-адрес, например,

title     | url
song name | song_name

Затем выполните поиск на основе поля URL.

По старым причинам вы также можете заменить любые пробелы на _ в вашем скрипте поиска, когда вы получите заголовок из GET перед выполнением запроса к базе данных.

0 голосов
/ 21 ноября 2011

хорошо, если вам нужны пробелы в URL, люди будут кодировать его для транзита.если вместо замены всех _ пробелами, просто используйте uridecoder (не могу вспомнить точный заголовок).это все еще позволило бы для мест, которые будут напечатаны.На дисплее, показанном в ссылке, вы не можете сделать str_replace для преобразования% 20 в пробелы?

Либо у этого есть версия заголовка, удобная для компьютера (которая не использует пробелы,подчеркивает) и удобный для пользователя столбец с пробелами

...