从数据库中的数组元素集生成随机数

时间:2018-04-24 06:52:35

标签: php mysqli

我想从一组数组元素中生成非重复的随机数。我的数组元素来自数据库。喜欢这个

$b1 = "SELECT id FROM datacards WHERE id<>".$dcard."";
$b2 = mysqli_query($con, $b1) or die (mysqli_query($con));
while($b3 = mysqli_fetch_array($b2))
{

$ids[] = $b3['id']; 
}
$Myarray=implode("," , $ids);   

我必须从Myarray生成2个不重复的随机数。 Myarray包含来自1 to 60的(ids)整数,除了1个

的数字

$b1 = "SELECT id FROM datacards WHERE id<>".$dcard."";

我该怎么做?

2 个答案:

答案 0 :(得分:1)

$b1 = 'SELECT `id` FROM `datacards` WHERE `id` <> ' . (int)$dcard . ' ORDER BY RAND() LIMIT 2';

这应排除一个id并选择2个随机ID。

或者使用oop预备语句(假设$ _GET ['dcard']):

if (!empty($_GET['dcard']) && ctype_digit($_GET['dcard'])) {
    $db = new mysqli('localhost', 'username', 'password', 'database');
    if ($stmt = $db->prepare('SELECT `id` FROM `datacards` WHERE `id` <> ? ORDER BY RAND() LIMIT 2')  &&
        $stmt->bind_param('i', $_GET['dcard']) &&
        $stmt->execute() &&
        $stmt->bind_result($id)
    ) {
        while($stmt->fetch()){
            $ids[] = $id;
        }
        $stmt->close();
    }
} else {
    echo 'Missing/Invalid input data.';
}

或者您可以在查询中使用GROUP_CONCAT()并检索单个对象。

答案 1 :(得分:1)

未经测试,但希望它能让您使用预准备语句,并使用Royal Bg建议的ORDER BY RAND()

$query = 'SELECT id FROM datacards WHERE id <> ? ORDER BY RAND() LIMIT 2';
$stmt = mysqli_prepare($con,$query) or die( mysqli_error($con) );
mysqli_stmt_bind_param($stmt, 's', $dcard);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_array($result))
{
    $ids[] = $row['id']; 
}
$Myarray = implode("," , $ids);

请注意,由于必须重新排序匹配的所有行,ORDER BY RAND()对于大数据来说非常慢。最好先计算表中的行数,然后生成一个介于0和行数减1之间的数字。此数字将表示数据库中记录的索引。然后在0和行数减去2之间生成另一​​个随机数。这将代表数据库中的另一个记录索引。如果第二个索引等于或大于第一个索引,则在其值中加1。使用此算法,您将从数据库中获得两个完全随机的非重复索引。然后你ORDER BY field(id, ?, ?) LIMIT 2将两个问号标记为要选择的ID,以及要选择它们的顺序。您可以在手册中找到MySQL的FIELD功能:
https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_field