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)
我只需要帮助将它们全部添加在一起,这样如果在数据库中找到重复项,它将循环返回并再次尝试.
使用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)
将令牌创建和检查放入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)