PHP PDO唯一随机数生成器

时间:2015-08-21 02:52:24

标签: php mysql pdo

您好首先请将此问题视为新手,因为我可以设置ID字段并添加zerofill,因此它看起来像000001,000002等堡垒。但我所做的是错误的,系统已经很大,所以请考虑我的问题。我有一个名为accounts的表,其中包含Class A{ A(){ this(10); System.out.println("No Arg constructor"); } A(int x){ System.out.println("Int arg constructor"); } } Class B extends A{ public static void main (String arg[]){ B b=new B(); } } 字段和id字段。现在我所做的就是这样(顺便说一下,我使用的是瘦框架):

sponsorID

上面的代码将检查帐户表中是否已存在号码,如果存在,则会再次生成一个随机数,直到它在帐户表中变为唯一或不存在。我创建了$db = new db(); $sponsorIDrandom = mt_rand(100000, 999999); $bindCheck = array( ":sponsorID" => $sponsorIDrandom ); $sponsorIDChecker = $db->select("accounts", "sponsorID = :sponsorID", $bindCheck); $generate_SID = null; do { $generate_SID = mt_rand(100000, 999999); } while (in_array($generate_SID, array_column($sponsorIDChecker, 'sponsorID'))); $db->insert("accounts", array( "sponsorID" => $generate_SID )); 字段sponsorID,因此它不会接受重复值。

现在问题是我发布的代码。我认为它会让unique唯一,因为我使用了$generate_SID函数,所以它会检查数组中是否已经存在一个值并再次生成一个数字,直到它是唯一的但我确实收到了幸运它试图插入已存在的随机数并且没有生成新的随机数的错误。

有谁能告诉我是否有解决方案?或者我应该重新修改上面的代码,以便它不会输入现有的in_array?先感谢您。

1 个答案:

答案 0 :(得分:0)

根据我的理解,您尝试在表中插入唯一的ID,但生成器只运行一次,或者它会告诉您该数字已经存在。

我从未使用过苗条,但在您的代码中,您尝试对单个记录执行SELECT操作,因为您生成一个随机数,然后向数据库请求此编号:

$sponsorIDrandom  = mt_rand(100000, 999999);
$bindCheck        = array(
    ":sponsorID" => $sponsorIDrandom
);
$sponsorIDChecker = $db->select("accounts", "sponsorID = :sponsorID", $bindCheck);

如果您说sponsorID是UNIQUE。

,则只返回一行或不返回行

然后您尝试生成另一个随机数,并根据此单(或空)记录检查是否重复。

$generate_SID = null;
do {
    $generate_SID = mt_rand(100000, 999999);
} while (in_array($generate_SID, array_column($sponsorIDChecker, 'sponsorID')));

这个循环只执行一次,因为这个第二个随机数在这个记录中的概率(如果有记录的话)几乎没有,如果数据库和你说的一样大,那么碰撞的概率是太高了。

要使此代码工作,您需要加载每条记录或询问新生成的数字(如果数据库每次生成时都存在),不建议使用这两种方法,但由于数据库已经(几乎)已满。 / p>

$sponsorIDChecker = $db->select(...); //use the equivalent of "SELECT sponsorID from accounts" without the WHERE clause, is better to ask for a single column.
$generate_SID = null;
do {
    $generate_SID = mt_rand(100000, 999999);
} while (in_array($generate_SID, ...)); //here you put the result of the query above.

$db->insert("accounts", array(
        "sponsorID" => $generate_SID
    ));

现在,可能会有所帮助:如果您将赞助商ID设置为数据库中的zerofill,如上所述

  

我可以设置一个ID字段并添加zerofill,因此它看起来像000001,000002等堡垒。   然后你可以将mt_rand的最小值降低到0,然后再获得100000个ID。