簡體   English   中英

生成100個10位隨機數並保存到數據庫

[英]generate 100 10-digit random numbers and save to database

這是一個非常簡單的功能,但始終會給我錯誤。 我正在編寫一個腳本以生成100個10位隨機數,但我仍然遇到此錯誤:“在第1行中'rand(1111111111, 9999999999)'檢查與您的MySQL服務器版本相對應的手冊以在'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();
?>

您需要像這樣連接字符串。

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

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行並在單個插入中插入100行的SELECT語句會更有效。

要么:

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));
  }
}

您也可以使用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;

這很好

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM