创建随机令牌,检查是否有重复

flo*_*eft 1 php loops for-loop

我有一个PHP脚本,可以生成随机令牌(AZ,az,0-9):

    function token($length) {

    $characters = array(
    "A","B","C","D","E","F","G","H","J","K","L","M",
    "N","P","Q","R","S","T","U","V","W","X","Y","Z",
    "a","b","c","d","e","f","g","h","i","j","k","m",
    "n","o","p","q","r","s","t","u","v","w","x","y","z",
    "1","2","3","4","5","6","7","8","9");

    //make an "empty container" or array for our keys
    $keys = array();

    //first count of $keys is empty so "1", remaining count is 1-6 = total 7 times
    while(count($keys) < $length) {
        //"0" because we use this to FIND ARRAY KEYS which has a 0 value
        //"-1" because were only concerned of number of keys which is 32 not 33
        //count($characters) = 33
        $x = mt_rand(0, count($characters)-1);
        if(!in_array($x, $keys)) {
           $keys[] = $x;
        }
    }

    foreach($keys as $key){
        $random .= $characters[$key];
    }

    return $random;
Run Code Online (Sandbox Code Playgroud)

}

工作完美,但我希望能够检查某个数据库,以确保以前从未使用过相同的令牌.如果有,它会在输出之前立即重新创建一个新令牌.

我知道我可以使用此脚本来检查重复:

$check = mysqli_query($mysqli, "SELECT ".$table.".token FROM ".$table." WHERE ".$table.".token = '".$random."'");

        if(mysqli_num_rows($check) > 0){

        //ERROR: DUPLICATE TOKEN, CREATE A NEW TOKEN NOW...

        }
Run Code Online (Sandbox Code Playgroud)

我只需要帮助将它们全部添加在一起,这样如果在数据库中找到重复项,它将循环返回并再次尝试.

Nik*_*kiC 6

使用do while循环:

do {
    $random = token(LENGTH);
} while (mysqli_num_rows(mysqli_query(YOUR_LOOKUP_QUERY)));
Run Code Online (Sandbox Code Playgroud)

PS:您可以简化令牌代码:

function token($length) {
    $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789';
    return substr(str_shuffle($characters), 0, $length);
}
Run Code Online (Sandbox Code Playgroud)


Gum*_*mbo 5

将令牌创建和检查放入do … while循环中:

do {
    $random = token(10);
    $check = mysqli_query($mysqli, "SELECT ".$table.".token FROM ".$table." WHERE ".$table.".token = '".$random."'");
} while (mysqli_num_rows($check) > 0);
Run Code Online (Sandbox Code Playgroud)

顺便说一句:您可以token按如下方式简化您的功能:

function token($length) {
    $characters = array(
        "A","B","C","D","E","F","G","H","J","K","L","M",
        "N","P","Q","R","S","T","U","V","W","X","Y","Z",
        "a","b","c","d","e","f","g","h","i","j","k","m",
        "n","o","p","q","r","s","t","u","v","w","x","y","z",
        "1","2","3","4","5","6","7","8","9");
    if ($length < 0 || $length > count($characters)) return null;
    shuffle($characters);
    return implode("", array_slice($characters, 0, $length));
}
Run Code Online (Sandbox Code Playgroud)