生成一个10位随机数并插入到mysql中?

7

我正在尝试在页面加载时生成一个随机的10位数字,并将其插入到mysql中,因此每次页面刷新或加载时都应该插入不同的10位数字到数据库中。但是目前它只是一遍又一遍地插入相同的10位数字。

请问有人能告诉我哪里出了问题吗?谢谢。

<?php
    session_start();
    $db_hostname = 'localhost';
    $db_database = 'hewden1'; 
    $db_username = 'root';
    $db_password = '';
    $db_server = mysql_connect($db_hostname, $db_username, $db_password)    
            or die("Unable to connect to MySQL: " . mysql_error());
    mysql_select_db($db_database)   
    or die("Unable to select database: " . mysql_error());

    $num0 = (rand(10,100));
    $num1 = date("Ymd");
    $num2 = (rand(100,1000));
    $num3 = time();
    $randnum = $num0 . $num1 . $num2 . $num3;


    $sql="INSERT INTO supplier_session (session_number)
    VALUES ('$randnum')";

    $result = mysql_query($sql); 
    ?>

我一直得到的数字是:2147483647

这个数字是32位带符号整数类型(int)的最大值。如果超过这个范围,那么它就会变成负数,并且程序可能会出现意料之外的错误。

插入的是什么数字?如果只想要会话 ID,请使用 session_id - Halcyon
1
没有错误,因为我说代码正在工作,它正在插入一个10位数字,我只是希望每次得到不同的数字而不是每次都得到相同的数字,这就是我目前得到的。 - user3584968
1
请不要使用 mysql_ 函数。它们已经被弃用很长时间,不再受支持。您的代码也容易受到 SQL 注入攻击。您得到 2147483647 是因为这是可能的最高 32 位有符号整数。 - h2ooooooo
在插入之前打印查询。你的代码似乎没有错误。 - Ocean
12个回答

38

尝试获取一个十位数的随机数

$randnum = rand(1111111111,9999999999);

谢谢,问题已解决。等8分钟后我会接受它。 - user3584968
7
为什么是 1111111111 而不是 1000000000 - h2ooooooo
1
@h2ooooooo 你可以使用任何数字吗? - Rakesh Sharma

5

您需要更改列类型。您尝试插入的数字超过了该列的最大值(在您的情况下,SIGNED INT - 2147483647)

SIGNED INT - 2147483647
UNSIGNED INT - 4294967295

SIGNED BIGINT - 9223372036854775807
UNSIGNED BIGINT - 18446744073709551615

3
您看到的数字 2147483647 是因为这是存在的最高有符号32位整数(二进制为1111111111111111111111111111111)。这也是常量PHP_INT_MAX的内容。
只需使用带有循环和mt_rand()函数的字符串即可:
<?php

for ($randomNumber = mt_rand(1, 9), $i = 1; $i < 10; $i++) {
    $randomNumber .= mt_rand(0, 9);
}

var_dump($randomNumber); //eg. string(10) "9152676628"

DEMO


2

如果你想的话,也可以尝试这个。它不会生成随机数,而是生成随机字符串。

private string generaterandomnumber()
        {
            string Rand1 = RandomString(8);
            string Rand2 = RandomString(8);
            docNum = Rand1 + "-" + Rand2;
            MD5 md5 = new MD5CryptoServiceProvider();
            md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(docNum));

            //get hash result after compute it
            byte[] result = md5.Hash;

            StringBuilder strBuilder = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                //change it into 2 hexadecimal digits
                //for each byte
                strBuilder.Append(result[i].ToString("x2"));
            }
            return strBuilder.ToString();
        }

不需要点踩!!!谢谢

1

您应该考虑使用mt_rand函数,它可以提供更好的分布范围。

在您的代码中,您没有使用完整的10位数字范围,尝试像这样:

$MIN_SESSION_ID = 1000000000;
$MAX_SESSION_ID = 9999999999;

$randId = mt_rand($MIN_SESSION_ID, $MAX_SESSION_ID);

echo $randId;

0
请使用以下代码。
$x = 10; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = rand($min, $max);

尝试更详细地阐述你的答案。仅仅发布没有任何上下文或解释的代码块并不是一个好的答案。 - Xaver Kapeller

0

使用 PHP 的 mt_rand() 函数代替 rand()

<?php
echo mt_rand();
?>

0
function random_num ($len)
{
 $ch = "0123456789";
 $l = strlen ($ch) - 1;
 $str = "";
 for ($i=0; $i < $len; $i++)
 {
     $x = rand (0, $l);
     $str .= $ch[$x];
 }
 return $str;
}

0

你的数字生成代码没有问题。试着在变量定义之前将它们取消设置,看看是否能解决问题。

unset($num0, $num1, $num2, $num3);
$num0 = (rand(10,100));
$num1 = date("Ymd");
$num2 = (rand(100,1000));
$num3 = time();
$randnum = $num0 . $num1 . $num2 . $num3;

你可以使用`rand`函数通过以下代码生成一个十位数:`rand(1111111111,9999999999)`。

0
当我运行你的脚本时,每次都会得到不同的数字。 为什么不使用 uniqid() 函数?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接