【问题标题】:generate 100 10-digit random numbers and save to database生成 100 个 10 位随机数并保存到数据库
【发布时间】:2017-03-17 18:34:13
【问题描述】:

这是一个非常简单的函数,但它总是给我错误。我正在编写一个脚本来生成 100 个 10 位随机数,但我一直遇到此错误:“检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'rand(1111111111, 9999999999)' 附近使用正确的语法。

这是我的代码

<?php
$cxn = new mysqli("localhost", "CJroot", "password", "random");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
for ($i=0; $i < 100; $i++) { 
    $sql = "INSERT INTO random (random) VALUES 'rand(1111111111, 9999999999)'";
    if(!mysqli_query($cxn,$sql)) {
        die("Error: ".mysqli_error($cxn));
    }
}

/* close connection */
$cxn->close();
?>

【问题讨论】:

  • 'rand 好吧,是的。您需要先生成数字,然后使用变量为其插入。
  • 试过了,同样的错误

标签: php mysql random


【解决方案1】:

你需要像这样连接你的字符串。

$sql = "INSERT INTO random (random) VALUES '" . rand(1111111111, 9999999999) . "'";

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习。
【解决方案2】:

MySQL 抱怨的语法错误(在您的 SQL 语句中)缺少值列表周围的括号。这是无效的:

INSERT INTO ... VALUES 'foo'

应该是

INSERT INTO ... VALUES ( 'foo' )
                       ^       ^

一旦你克服了这个问题,用单引号括起来的值就会被解释为一个字符串文字。在示例代码中,'rand(11111,99999)' 是一个文字,一个字符串。它不是对函数的引用。


如果我们想使用 MySQL RAND() 函数,我们可以这样做:

INSERT INTO random (random) VALUES ( FLOOR(1000000000 + RAND() * 9000000000) )

我们可以执行 100 次,或者,编写返回 100 行的 SELECT 语句并在一次插入中插入 100 行会更有效。

或者:

INSERT INTO random (random) VALUES 
 ( FLOOR(1000000000 + RAND() * 9000000000) )
,( FLOOR(1000000000 + RAND() * 9000000000) )
,( FLOOR(1000000000 + RAND() * 9000000000) ) 
, ...
,( FLOOR(1000000000 + RAND() * 9000000000) ) 

就数据库性能而言,运行单个插入 100 行的 INSERT 语句通常比执行 100 个单独的插入语句更有效。处理 RBAR(逐行处理)可能非常缓慢。

如果需要循环,如果我们一次插入四行,我们只需要循环25次。我们需要执行的语句减少了 75%。

我们可以指定只执行一次的 SQL 文本,在循环之外,然后重复执行相同的 SQL

$sql = "INSERT INTO random (random) VALUES"
     . " ( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )";

for ($i=0; $i < 25; $i++) { 
  if(!mysqli_query($cxn,$sql)) {
    die("Error: ".mysqli_error($cxn));
  }
}

【讨论】:

  • 我的答案中的示例生成了一个值BETWEEN POWER(10,9) AND POWER(10,10)-1。 (1,000,000,000 和 9,999,999,999)。如果您想要范围 1,111,111,111 到 9,999,999,999,请将文字 1000000000 替换为 1111111111 并将 9000000000 替换为 8888888889
【解决方案3】:

您也可以像这样直接使用 MySQL:

INSERT INTO random (random) 
SELECT CAST( (RAND()*(9999999999-1111111111)) AS UNSIGNED)  + 1111111111;

或 100 行:

INSERT INTO random (random)
SELECT  CAST( (RAND()*(9999999999-1111111111)) AS UNSIGNED)  + 1111111111 AS random FROM (
SELECT 0 AS h UNION SELECT 1  UNION SELECT 2  UNION SELECT 3  UNION SELECT 4  UNION SELECT 5  UNION SELECT 6  UNION SELECT 7  UNION SELECT 8  UNION SELECT 9 
) h
CROSS JOIN
( SELECT 0 AS l UNION SELECT 1  UNION SELECT 2  UNION SELECT 3  UNION SELECT 4  UNION SELECT 5  UNION SELECT 6  UNION SELECT 7  UNION SELECT 8  UNION SELECT 9 ) l;

【讨论】:

  • 但我需要循环该函数,以便一次添加 100 个随机数
  • 我已经为 MySQL 中的 100 行直接添加了一个示例。
【解决方案4】:

这很好用

<?php
$cxn = new mysqli("localhost", "CJroot", "password", "random");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$sql = "INSERT INTO random (random) VALUES"
     . " ( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )"
     . ",( FLOOR(1000000000 + RAND() * 9000000000) )";

for ($i=0; $i < 25; $i++) { 
  if(!mysqli_query($cxn,$sql)) {
    die("Error: ".mysqli_error($cxn));
  }
}
$cxn->close();
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多