Сделайте пост-слиток уникальным


У меня есть несколько функций, которые работают не так, как я хотел.

Пуля автоматически создается на лету в зависимости от названия поста.

Пример: Если заголовок сообщения "тест", то слаг будет "тест"

Моя проблема в том, что, если их запись дублирует заголовок сообщения "тест", что означает, что пуля тоже будет дублироваться. По этой причине я создал 2 функции, чтобы справиться с этим за меня.

Эта функция проверяет, является ли пуля существуют в базе данных

function slug_exist($x){
    global $db;
        $sql = "SELECT post_name FROM posts WHERE post_name=\"$x\"";
        $query = $db->select($sql);
            if($db->num_rows() > 0){
                return true;
    }
}

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

    if(slug_exist($slug)){
        $rand = rand(10,50);
        $slug = $slug."-".$rand;
            return $slug;
    }

Ну, когда слизняк получит уникальное имя слизняка, это будет похоже Example: test-244

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

**Example:**

Post Title is "Test"
Slug is "test-1"

Post Title is "Test"
Slug is "test-2"

Post Title is "Test"
Slug is "test-3"

Это единственный способ, которым я знаю, как объяснить подробно, пожалуйста, дайте мне знать, если вы не уверены, что я делаю. Спасибо!

 5
Author: mcuadros, 2013-12-07

4 answers

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

$i = 1; $baseSlug = $slug;
while(slug_exist($slug)){
    $slug = $baseSlug . "-" . $i++;        
}

return $slug;
 10
Author: mcuadros, 2013-12-07 09:59:36
<?php
$oSlug    = 'Test';
$slug     = $oSlug;
$count = 1;
while(slug_exist($slug)){
    $slug = $oSlug.'-'.$count++;
}
print 'The slug i got is: '.$slug;
?>
 4
Author: 0xAli, 2013-12-07 09:48:11

Если у вас есть полный доступ к вашей бд и вам нравится хранить логику в бд, вы можете

  • добавьте уникальный индекс в исключение slug и перехватите исключение при вставке
  • добавьте триггер при вставке, чтобы выполнить за вас работу по генерации пуль
 1
Author: ishenkoyv, 2013-12-07 10:00:10

Я работал над своим в течение нескольких часов, прежде чем наткнулся на это. Этот вопрос немного помог мне, но в итоге я получил нечто немного другое;

Я также создал функцию, чтобы проверить, существует ли уже слизняк;

function slugExist($slug){
    global $db;
    $query = $db->query("SELECT * FROM `blog-posts` WHERE `slug` = '".$slug."'");
    $results = $query->num_rows;
    if($results > 0){
        return true;
    }else{
        return false;
    }
}

Для публикации новой статьи или публикации (в зависимости от того, что вы делаете) У меня есть следующее;

    $slug = furl($_POST['title']);

    $CheckSlug = $db->query("SELECT * FROM `blog-posts` WHERE `slug` LIKE '".$slug."%'");
    $numHits = $CheckSlug->num_rows;
    if($numHits > 0){
        $slug = $slug.'-'.$numHits;
    }

Это намного проще в исполнении, так как нет цикла, и это очень чисто. Но что, если вы редактируете существующий пост? Вы хотите, чтобы пуля менялась, если они меняют название, но вы не хотите, чтобы она меняла или увеличивала/уменьшала числовой суффикс, если пользователь этого не делает.

Итак, используя несколько сообщений, я закончил этим;

$slug = furl($_POST['title']);

if($slug != $oldSlug){                      // 1. If the slug of the new title is different to the old one, proceed to adding suffix
    $i = 1; $baseSlug = $slug;              // 2. Set counter and baseSlug vars.
    while(slugExist($slug)){                // 3. Start a loop to keep adding to the numeric value until an empty one is found
        $slug = $baseSlug . "-" . $i++;     // 4. Set the new slug variable to the base with a new number
        if($slug == $oldSlug){              // 5. If the slug with the added number matchs the existing slug, then we dont want to change it
            break;                          // 6. Break the loop to prevent additional numeric changes to the slug
        }
    }
}

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

 1
Author: Tarquin, 2015-10-21 02:42:01