Создайте уникальное сообщение

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

Затвор автоматически создается на лету, зависит от заголовка сообщения.

Пример: если заголовок сообщения является «тестом», то слизень будет «проверять»,

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

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

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

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

  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" 

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

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

 $i = 1; $baseSlug = $slug; while(slug_exist($slug)){ $slug = $baseSlug . "-" . $i++; } return $slug; в $i = 1; $baseSlug = $slug; while(slug_exist($slug)){ $slug = $baseSlug . "-" . $i++; } return $slug; 
 <?php $oSlug = 'Test'; $slug = $oSlug; $count = 1; while(slug_exist($slug)){ $slug = $oSlug.'-'.$count++; } print 'The slug i got is: '.$slug; ?> в <?php $oSlug = 'Test'; $slug = $oSlug; $count = 1; while(slug_exist($slug)){ $slug = $oSlug.'-'.$count++; } print 'The slug i got is: '.$slug; ?> 

Если у вас есть полный доступ к вашему db и как логика магазина в db, вы можете

  • добавить уникальный индекс в slug и исключить catch при вставке
  • добавить триггер на вставку, чтобы сделать работу по генерации slug для вас

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

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

 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 изменился, если они изменили заголовок, но вы не хотите, чтобы он менял или увеличивал / уменьшал числовой суффикс, если пользователь этого не делает.

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

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

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