MYSQL: Дружественные URL-адреса - PullRequest
1 голос
/ 06 декабря 2009

Я хочу сделать запрос, с помощью которого я могу проверить, что URL, который я делаю для новой записи видео, отсутствует в моей базе данных.

Мой текущий запрос:

SELECT Count(videoid) FROM video WHERE titleurl = 'test';

Я храню счетчик в переменной $n Затем проверяю его, используя следующий код PHP

if ($n > 0){
    return $output . "-$n";
}else{
    return $output;
}

Но приведенный выше запрос создает проблему. Допустим

  • 1-й пользователь отправил видео с именем Test, поэтому URL будет http://example.com/video/test/
  • 2-й пользователь отправил видео с именем Test, поэтому URL будет http://example.com/video/test-1/, потому что одна запись с titleurl test уже присутствует, поэтому я добавил в нее 1, который будет test-1
  • 3-й пользователь также добавил запись видео с именем test, но на этот раз URL моего метода будет test-1, что неверно.

Я хочу решить эту проблему, если test уже присутствует, то должно быть test-1, и если другой пользователь создает запись с именем test, тогда url должен быть test-2, потому что test и test-1 уже существуют .

Пожалуйста, дайте метод, с помощью которого я могу решить эту проблему.

Ответы [ 3 ]

5 голосов
/ 06 декабря 2009

дружественные URL - это хорошо, но вы всегда должны также добавлять идентификатор объекта или сохранять уникальную строку в базе данных. Проверьте URL-адреса здесь на stackoverflow, например.

EDIT Я серьезно сомневаюсь, что Google в порядке с короткими номерами, но не любит длинные номера. Вот решение, использующее числа только там, где вы должны: Добавьте еще один столбец, содержащий значение 'id' каждого тестового видео, и создайте уникальный индекс для него и titleurl:

ALTER TABLE video ADD COLUMN titleurl_id UNSIGNED TINYINT NOT NULL;
CREATE UNIQUE INDEX uidx_url ON video (titleurl, titleurl_id);

При создании видео необходимо добавить это значение:

$amount = query("SELECT COUNT(*) FROM video WHERE titleurl='test'");
query("INSERT INTO video(titleurl, titleurl_id) VALUES ('test', $amount + 1)");

Вам нужно будет обратить внимание на результат вашего запроса на вставку, вы можете столкнуться с условиями гонки, если вы сделаете это таким образом (именно поэтому идентификаторы более удобны в URL). Создание URL:

$urlpart = query("
    SELECT IF(
        titleurl_id = 0,
        titleurl,
        CONCAT_WS('-', titleurl, titleurl_id)
    ) AS url FROM video");
0 голосов
/ 06 декабря 2009

Попробуйте создать два поля - одно для исходного URL-адреса и одно для вашего «рассчитанного» URL-адреса.

$c = SELECT COUNT(*) FROM table WHERE original_url = 'test'
UPDATE table SET url='test-$c' WHERE id=...
0 голосов
/ 06 декабря 2009

Моя первая идея - выбрать все URL-адреса, начинающиеся с теста ... WHERE url LIKE 'test%', и проверить, существует ли test - если да, добавить -1 и еще раз проверить, существует ли test-1. Если да, увеличьте счетчик до -2 ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...