具有PHP和PDO的独特配置文件插件

2022-03-24 00:00:00 unique slug mysql pdo

我正在使用一个类生成要插入的字符串名称配置文件,然后使用SQL命令告诉我要在INSERT命令中使用的唯一值是什么,问题是该命令不能正常工作,有时可能会返回已经存在的值.

这就是我用来生成slug的类:(Composer需要channel aveer/slug)

这是示例代码:

use ChannaveerSlugSlug;

$string = "john doe";
$slug = Slug::create($string);

$profile_count_stmt = $pdo->prepare("
                    SELECT
                        COUNT(`id`) slug_count
                    FROM
                        `advogados_e_escritorios`
                    WHERE
                        `slug_perfil` LIKE :slug
                ");

$profile_count_stmt->execute([
    ":slug" => "%".$slug."%"
]);

$profile_count = $profile_count_stmt->fetchObject();

if ($profile_count && $profile_count->slug_count > 0) {
    $profile_increment = $profile_count->slug_count + 1;
    $slug = $slug . '-' . $profile_increment;
}

echo 'Your unique slug: '. $slug;
// Your unique slug: john-doe-5

这是脚本运行时的表内容:

您知道如何改进SELECT命令以防止它从数据库返回现有的插件吗?


解决方案

您应该检查数据库中是否存在该辅助程序。如果它已经存在,则可以附加一些随机字符串,如下所示

$slug = Slug::create($string);

$slugExists = "DB query to check if the slug exists in your database then you may return the count of rows";

//If the count of rows is more than 0, then add some random string

if($slugExists) {
/** NOTE: you can use primary key - id to append after the slug, but that has to be done after you create the user record. This will help you to achieve the concurrency problem as @YourCommenSense was stating.   */
    $slug = $slug.time(); //time() function will return time in number of seconds
}

//DB query to insert into database

我的博客文章(StackCoder)也遵循了同样的原则。即使是LinkedIn也遵循同样的方式。

以下是LinkedIn URL的屏幕截图

相关文章