保存友好网址时如何避免重复出现的问题

时间:2018-03-28 10:54:08

标签: php

抱歉,我是新来的,真正的php学徒。抱歉我的英语,但我是意大利人。

我试图弄清楚当我保存时如何避免在数据库的slug列中保存重复项。

当我保存新页面时,如果我找到一条我想要保存的slug的行,我会检查数据库。如果它不在那里,我没有问题。如果有,我想通过添加" 1"来保存它。然后" 2"等等。

我试过

$string="example-2";
$string= str_replace("-", "", $string);
$string=filter_var($string, FILTER_SANITIZE_NUMBER_INT);

并且有效,但如果我保存这样的slu ::

$string="my2example-2";

它'没有工作

我无法理解如何在php中分析字符串并理解字符串末尾是否已有数字。

示例:

我第一次保存了一个例子'

然后我想用"例如"保存第二页。 slu ,,所以我查看数据库,我发现有"例如"然后我添加" -1"到我的字符串并保存为"示例-1"。

然后我想保存"例如"再次,我发现它存在"例子"。所以我必须搜索以寻找"例如" 怎么做?

然后我如何识别我已保存的号码 "为例-2"

感谢

2 个答案:

答案 0 :(得分:0)

你应该保留原始的slug然后每次检查数据库的现有条目附加-1,-2等,直到你没有匹配。

$i = 1;
$baseSlug = $slug;

function slug_exists($slug) {
    $query = "SELECT `slug` FROM `table` WHERE `slug`=?";
    $stmt = $dbl->prepare($query);
    $stmt->bind_param("s", $slug);
    $stmt->execute();

    if ($stmt->num_rows > 0) {
        return true;
    } else {
        return false;
    }
}

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

// Save slug in DB

答案 1 :(得分:0)

不是查询数据库以确定slug example是否存在,而是可以获得以example开头的所有slu ::

SELECT slug FROM table WHERE slug LIKE 'example%';

然后,您只需要过滤掉非exampleexample-[0-9]+的值。在某些数据库中,您可以直接执行此操作,但您也可以使用PHP中的regex执行此操作。最后一件事是找到具有最高编号的slug(例如通过先排序),并递增数字部分。

确保您使用的是natural sort ordering

以上链接中的示例:

<?php
$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

asort($array1);
echo "Standard sorting\n";
print_r($array1);

natsort($array2);
echo "\nNatural order sorting\n";
print_r($array2);
?>

<强>结果:

Standard sorting
Array
(
    [3] => img1.png
    [1] => img10.png
    [0] => img12.png
    [2] => img2.png
)

Natural order sorting
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)