具有PHP和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的屏幕截图
相关文章