我正在上传图片并将其名称保存到数据库中。
我这样生成他们的名字:
$uniqueImageID = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 15);
现在,我的应用程序很小,我无法想象生成两个相同的代码,但这不是重点。
我正在寻找如何检查匹配行,如果匹配则生成新号码并再次检查。只是无法理解它。
我的想法是创建一个带有循环的函数,该循环检查数据库并继续运行直到找不到匹配项。然后它返回一个实际的唯一代码。
使用Laravel的简单功能是:
function checkForRow($image_file_name_temp) {
$query = DB::table('image_uploads')
->where('image_file_name', $image_file_name_temp)
->first();
$count = count($query);
if ($count > 0) {
return false;
} else {
return true;
}
}
用英语来说:
while (checkForRow($imagecode) == true) {
// keep generating code and checking db
}
OTHERWISE
return $uniqueID.
这是漫长的一天,只是无法绕过这一个。
答案 0 :(得分:3)
我通常使用的方法是使用mysqls unique
索引(我确定你的数据库也有类似的东西)与php异常处理相结合:
public function uniqueInsert($data) {
try {
DB::table('image_uploads')->insert($data);
} catch(PDOException $e) {
//Check if it was a unique key violation
if ($e->getCode() == '23000') {
//Regenerate the unique name and rerun the insert
$data['image_file_name'] = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 15);
$this->uniqueInsert($data);
}
else {
throw $e;
}
}
}
如果你有一个唯一的名称,它在db中已经存在的可能性非常低,那么为每次尝试运行一个额外的查询效率不是很高。我成功地使用这种方法在一秒钟内生成了大约100个&000; 000个独特的条形码。
答案 1 :(得分:0)
尝试使用此Hashids,这很简单且非常有用