2017-03-17 285 views
0

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

这是我的代码

<?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(); 
?> 
+1

''rand'好吧,是的。您需要先生成数字,然后使用变量插入它。 –

+0

试过,相同的错误 – Dahlia

回答

2

你需要Concat的您的字符串,像这样

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

仍然是相同的错误 – Dahlia

0

你也可以做到这一点与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; 
+0

但我需要循环功能,所以它一次添加100个随机数 – Dahlia

+0

是 - 或者你使用MariaDB? –

+0

我在MySQL中为100行添加了一个示例。 –

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次,或者,它会更有效写SELECT语句返回100行,并在单个插入中插入100行。

或者:

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

在数据库性能方面,它通常是更有效地运行插入100行,比它要执行100个单独的INSERT语句一个INSERT语句。处理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)); 
    } 
} 
+0

非常感谢:D :) – Dahlia

+0

我的答案中的例子会生成一个值'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,用'1111111111'代替文字'1000000000',用'8888888889'代替'9000000000'。 – spencer7593

0

这工作得很好

<?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(); 
?>