我试图弄清楚当我保存时如何避免在数据库的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"
感谢
答案 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%';
然后,您只需要过滤掉非example
或example-[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
)