使用 MySQL returns NULL 的随机行选择

Random row selection using MySQL returns NULL

我正在尝试从 MySQL table 中获取随机行,但所有三个尝试:

$query = "SELECT cid FROM table LIMIT 1 OFFSET ".rand(1,$num_rows);
$query = "SELECT cid FROM table OFFSET RANDOM() * (SELECT COUNT(*) FROM table) LIMIT 1";
$query = "SELECT * FROM table ORDER BY RAND() LIMIT 1";


在 mysql_query($query) 中给出 NULL 结果。

在我的 PHP 代码上方,我通过指定 WHERE 从同一行 table 获得一行,所以我不明白为什么我不能随机检索一行。

这是代码片段:

    $query = "SELECT uid,clu FROM uable WHERE un = '$un'";
    $result = mysql_query($query) or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
    $resultid = mysql_fetch_assoc($result);
    $uid = $resultid['uid'];
file_put_contents('debugging.txt',__LINE__.' - $uid = '.var_export($uid,true).PHP_EOL,FILE_APPEND);
    $query = "SELECT * FROM table WHERE uid = $uid AND cn = '$cn'";
    $result = mysql_query($query) or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
    $cr = mysql_fetch_assoc($result);
    $cid= $cr['cid'];
file_put_contents('debugging.txt',__LINE__.' - $cid= '.var_export($cid,true).PHP_EOL,FILE_APPEND);
    $query = "SELECT * FROM fable WHERE cid= '$cid'";
    $result = mysql_query($query) or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
file_put_contents('debugging.txt',__LINE__.' - $result = '.var_export($result,true).PHP_EOL,FILE_APPEND);
    $fr = mysql_fetch_assoc($result);
file_put_contents('debugging.txt',__LINE__.' - $fr = '.var_export($fr,true).PHP_EOL,FILE_APPEND);
    echo  '<form action="'.$_SERVER['PHP_SELF'].’" method="post">';
    if (!$fr) {
        $o= $cn;
        while ($o= $cn) {
//    $ac = mysql_query("SELECT * FROM table") or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
//    $num_rows = mysql_num_rows($ac);
//file_put_contents('debugging.txt',__LINE__.' - $num_rows = '.$num_rows.PHP_EOL,FILE_APPEND);
//    --$num_rows;
//    $query = "SELECT cid FROM table LIMIT 1 OFFSET ".rand(1,$num_rows);
    $query = "SELECT cid FROM table OFFSET RANDOM() * (SELECT COUNT(*) FROM table) LIMIT 1";
//        $query = "SELECT * FROM table ORDER BY RAND() LIMIT 1";
        $resultid = mysql_query($query) or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
        $opr = mysql_fetch_assoc($resultid);
        $o= $opr['cn'];
        }
file_put_contents('debugging.txt',__LINE__.' - $query = '.$query.PHP_EOL,FILE_APPEND);
file_put_contents('debugging.txt',__LINE__.' - $resultid = '.var_export($resultid,true).PHP_EOL,FILE_APPEND);
file_put_contents('debugging.txt',__LINE__.' - $op[\'cid\'] = '.$op['cid'].PHP_EOL,FILE_APPEND);
        $query = "SELECT * FROM table WHERE cid= ".$op;
        $result = mysql_query($query) or die(sqlerror(__LINE__,mysql_errno(),mysql_error()));
        $opr = mysql_fetch_assoc($opr);
        $o= $opr['cn'];
        $od= $opr['description'];
        echo  '<p>'.$op;
        if ($od<> '') {
        echo  ','.$odesc;
        }
        echo  '</p>';
        echo  '<input type="submit" name="continue" id="continue" value="Continue">';
    } else {
        echo  '<p>'.$fr['p'].'</p>';
        echo  '<input type="submit" name="continue" id="continue" value="Continue">';
    }
    echo  '</form>';

结果debugging.txt:
24 - $uid = '4'
29 - $cid = '21'
32 - $结果 = NULL
34 - $fr = 假

这些查询看起来不错,但我认为您从错误的地方开始。当您不确定如何在 SQL 中构建某些内容时,请打开 SQL 客户端(如 SequelPro 或 Navicat)并尝试手动编写一些查询,直到获得您想要的结果。 (这也让你有机会仔细检查相关表格的内容并确保预期的数据在那里。)然后你可以回到 PHP 完全相信 SQL 代码是正确的,所以如果 PHP 有问题(要么是你注入到 Mysql 语句中的变量,要么是你调用该语句的方式)。