在php中使用rand记忆mysql查询


Memorizing mysql query with rand in php

$query= "select * from table ORDER BY RAND()" ;
$result = mysql_query($query); 
if(!isset($_get['submit']))
    $_SESSION['a']=$result;
else 
    $result=$_SESSION['a'] ;
while ($row = mysql_fetch_array($result)) {
    echo $row["names"];
}
echo "<input name='submit' type='submit' value='Submit'>";
这当然不是所有的代码,但问题在这里:

所以首先我的页面打开了随机顺序的名字(例如:John Dan Mary)

并且在提交表单(将我带到同一页面)之后,它要么(取决于我尝试的解决方案)以不同的随机顺序列出名称(Dan Mary John),要么我得到这个错误:

Warning: mysql_fetch_array() expects parameter 1 to be resource, 
integer(or array) given in C:'wamp...

我希望在提交表单后,名称保持在预提交的顺序中。

mysql_query的结果不能按您想要的方式进行缓存。您需要做的是像这样循环遍历行:

$row = array();
while ($r = mysql_fetch_assoc($row)) {
   $row[] = $r;
}
$_SESSION['rows'] = $row;

这将在会话中很好地传递并可重用。

除此之外,table是保留关键字。使用反号转义

如果你想要技术上的原因,从mysql_query返回实际上是一个MySQL资源指示器,它是一个整数。每个新的脚本实例,这些都被重置。这就是它失败的原因。

p。S: ORDER BY RAND()的性能非常差。寻找替代方案!

如果你的mysql tablename是"table",那么你是使用保留关键字作为tablename使用反勾操作符

$query= "select * from `table` ORDER BY RAND()" ;

脚本不是在记忆订单,而是在记忆查询记录集。所以rand()函数每次都会重新加载。

if(!isset($_REQUEST['submit']))
{
    $query= "select * from table ORDER BY RAND()" ;
    $result = mysql_query($query); 
    $names = array();
    while ($row = mysql_fetch_array($result)) {
        $names[] = $row['name'];
    }
    $_SESSION['names'] = serialize($names);
}
echo implode(', ', unserialize($_SESSION['names']));
echo "<input name='submit' type='submit' value='Submit'>";

您应该生成名称的随机顺序,将其保存到会话中,然后使用会话来输出名称,而不是查询

你得到的错误是当你没有任何结果返回,但你正试图提取结果无论如何。在尝试获取结果之前,您应该使用mysql_num_rows检查结果集。

如果您希望结果以提交给数据库的顺序返回,我建议按主键排序(假设您使用user_id或其他ID作为主键)