制作一个独特的帖子

时间:2013-12-07 09:36:52

标签: php slug

我在放置的功能很少,但是没有按照我的意愿工作。

slug是自动创建的,取决于帖子标题。

  

示例:如果帖子标题是“test”,那么slug将是“test”

我的问题是,如果他们重复输入帖子标题“test”,这意味着slug也会被复制。出于这个原因,我已经创建了2个函数来为我处理这个问题。

此功能检查数据库中是否存在slug

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

当slug获得独特的slug名称时,它就像Example: test-244

我希望slug是按数字顺序而不是随机顺序。

**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"

这是我知道如何详细解释的唯一方式,如果您不确定要采取什么,请告诉我。谢谢!

4 个答案:

答案 0 :(得分:10)

这是一个非常标准的代码,只需要一个小循环:

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

return $slug;

答案 1 :(得分:4)

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

答案 2 :(得分:1)

如果您可以完全访问数据库中的db和类似的商店逻辑,那么

  • 为slug添加唯一索引并在insert
  • 上捕获异常
  • 在插入时添加触发器以便为您执行子弹生成工作

答案 3 :(得分:1)

在我偶然发现之前,我已经在我的工作了几个小时。这个问题对我有所帮助,但我最终得到了一些不同的东西;

我还创建了一个函数来检查slug是否已经存在;

/**
 * Rotates the specified bitmap to the correct orientation. Note that this library requires
 * the following two libraries:
 * 1. <a href="https://code.google.com/p/metadata-extractor/downloads/list">metadata-extractor-2.6.4</a>
 * 2. <a href="https://github.com/drewfarris/metadata-extractor/tree/master/Libraries">xmpcore-5.1.2.jar</a>
 *
 * @param uri The Uri to the photo file.
 * @param bmp The Bitmap representative of the photo file.
 * @return A correctly rotated Bitmap.
 */
private static Bitmap fixOrientation(Uri uri, Bitmap bmp) {
    try {
        InputStream inputStream = mContext.getContentResolver().openInputStream(uri);
        Metadata meta = null;

        if (inputStream != null) {
            try {
                meta = ImageMetadataReader.readMetadata(new BufferedInputStream(inputStream), false);
            } catch (ImageProcessingException e) {
                e.printStackTrace();
            }

            if (meta != null) {
                int orientation = 0;
                ExifIFD0Directory exifIFD0Directory = meta.getDirectory(ExifIFD0Directory.class);

                if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION))
                    try {
                        orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
                    } catch (MetadataException e){
                        e.printStackTrace();
                    }

                switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        bmp = rotateBitmap(bmp, 90);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_180:
                        bmp = rotateBitmap(bmp, 180);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_270:
                        bmp = rotateBitmap(bmp, 270);
                        break;
                }
            }
        }

    } catch (IOException e) {
        Log.d(TAG, "Error opening InputStream from uri: " + uri.toString());
        e.printStackTrace();
    }

    return bmp;
}

对于发布新文章或帖子(取决于你在做什么),我有以下内容;

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

执行起来要容易得多,因为没有循环,它非常干净。但是,如果您正在编辑现有帖子,该怎么办?如果他们更改了标题你想要slu改变,但是如果用户不知道你不希望它改变或增加/减少数字后缀。

所以使用一些帖子我最终得到了这个;

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

我知道这是一个较旧的问题,但我希望这有助于将来至少有一个人。