错误的唯一号码长度

时间:2017-10-14 05:04:24

标签: php

每次用户登录时都会生成一个unique安全码:

$code = substr(str_shuffle(str_repeat("0123456789", 4)), 0, 4);

它似乎有效,但有时会生成3个数而不是4个。此问题也发生在rand()过去,然后我决定使用str_shuffle + str_repeat

我也会在db中使用整数数据类型插入此代码,长度为6。

我错了或错过了什么? 或者它是一个错误?

3 个答案:

答案 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);