每次用户登录时都会生成一个unique
安全码:
$code = substr(str_shuffle(str_repeat("0123456789", 4)), 0, 4);
它似乎有效,但有时会生成3个数而不是4个。此问题也发生在rand()
过去,然后我决定使用str_shuffle
+ str_repeat
。
我也会在db
中使用整数数据类型插入此代码,长度为6。
我错了或错过了什么? 或者它是一个错误?
答案 0 :(得分:3)
虽然我无法立即说明为什么您的代码有时只返回3位数字,但我发现自己想知道为什么您不能通过更合理的数字创建这个4位数(称为PIN?)代码rand
?例如,由于您要使用4位数的PIN(介于0000和9999之间),我可能会这样写:
$code = rand(0, 9999);
$code = substr("000$code", -4);
关于其目的(生成一个随机数,保证它的4位数)更清楚,并且比str_repeat
/ str_shuffle
更少深奥。
编辑(学习$code
后插入整数DB字段)
为什么4位数的随机字符串有时会变为3位数?因为您要将值插入整数列。 DB或DB Driver将尝试道德等同于:
$code_to_insert = (int)$code;
此时,如果数字小于1000,您将得到三位数。
此外,如果您运行的代码与目前的代码相当,那么您应该获得2和1的PIN长度:
0 - 9 = ( 10 / 10000) -> 0.1% of the time
10 - 99 = ( 90 / 10000) -> 0.9% of the time
100 - 999 = ( 900 / 10000) -> 9.0% of the time
1000 - 9999 = (9000 / 10000) -> 90.0% of the time
考虑到代码和数据库的当前设置,可能的解决方法可能是确保在拉出数据库 out 时的PIN长度。你可以使用与上面相同的技巧:
$sql = "SELECT code FROM ...";
...
$code = $row['code'];
$code = substr("000$code", -4);
答案 1 :(得分:2)
由于您将结果存储在整数字段中,因此它不会作为数字存储为单独的数字。所以它对前导零没有任何了解。
稍后检索该值时,可以使用str_pad
函数将其转换为带前导零的字符串:
$code = str_pad($num, 4, '0', STR_PAD_LEFT);
另一种选择是将数据库中的数据类型更改为CHAR(4)
而不是INT
。
答案 2 :(得分:0)
试试这个:
$code = str_pad($num, 4, '0', STR_PAD_LEFT);