PHP(Grocery CRUD)| Mysql在两个数字之间生成唯一且随机的数字

时间:2017-09-30 09:59:22

标签: php mysql codeigniter grocery-crud

我在Mysql中创建了一个使用此列的表

  • secretNumber(主键和AI)
  • 名称
  • 日期
  • 等...

我的想法是,当我要在此表中添加新项目时,会自动生成“密码”,但必须有3个要求:

  • 唯一号码
  • Randon number everyime我添加了一个新项目
  • 介于0-1000000之间

试图使用像uniqid()这样的功能;和mt_rand();但没有成功。

2 个答案:

答案 0 :(得分:0)

你可以创建0-1000000之间的tmptable 当你插入到表中时,使用tmptable,之后必须使用此表中的行删除它。 或转发查询,但这是慢慢因为每次创建临时表。如果你创建一次temptable,那么它可能是快速的过程。

  

CREATE TEMPORARY TABLE IF NOT EXISTS listtable(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,tmp INT NOT NULL);   SET @s = CONCAT(' INSERT INTO listtable(tmp)VALUES',REPEAT('(1),',1000000),'(1)&#39 );   PREPARE stmt1 FROM @s;   执行stmt1;   SELECT id FROM listtable WHERE id NOT IN(从表中选择id)按rand()limit 1排序;   DROP TABLE listtable;

答案 1 :(得分:0)

首先要考虑的逻辑:要实现此目的,您必须在杂货杂货控制器的方法中添加 callback_before_insert()函数。在此回调函数中,您将创建所需的随机数,然后将其添加到$ post_array变量,然后将$ post_array返回到控制器的方法(在杂货杂货店的官方页面上已经有示例)。 因此,在您控制器的某个位置添加以下内容:

function _create_unique_secret_number()
{
    /*Create a random secret_Number between 0 and 1000000
     * and assign it to a variable
     */
    $random_unique_secret_number = mt_rand( 0, 1000000 );

    /* Now make sure that your random secret number is not already "in use"
     * which means that the generated id is already stored in your table.
     */
    $query = $this->db->where( 'secretNumber', $random_unique_secret_number )
                      ->get_where( 'your_table_name_goes_here' );

    if( $query->num_rows() > 0 )
    {
        $query->free_result();

        // Try again in case the randomly generated number above is in use
        return $this->create_unique_secret_number();
    }

    $post_array['secretNumber'] = $random_unique_int;
    return $post_array;

}

/* And finally call the function inside your controllers' method.
 * I mean inside the method that is handling your table.
 */
$crud->callback_before_insert( array ($this, '_create_unique_secret_number')  );

然后,您可以通过访问enter code here $ post_array ['secretNumber']值来访问杂货堆控制器中生成的数字。