检查DB中是否存在随机生成的代码,如果是,则重新生成

时间:2014-12-27 19:07:49

标签: php laravel

我正在上传图片并将其名称保存到数据库中。

我这样生成他们的名字:

$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.

这是漫长的一天,只是无法绕过这一个。

2 个答案:

答案 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,这很简单且非常有用