ORDER BY RAND() 总是在 IE 上给出相同的行

Posted

技术标签:

【中文标题】ORDER BY RAND() 总是在 IE 上给出相同的行【英文标题】:ORDER BY RAND() always gives same row on IE 【发布时间】:2013-03-11 19:04:09 【问题描述】:

我有一个 javascript 函数(由一个按钮调用),它对 php 文件执行 ajax 请求。 php 文件连接到数据库并从我的数据库中回显一个随机行。负责这个的php代码:

$value = $db->get_row("SELECT * FROM mytable ORDER BY RAND() LIMIT 1");
echo $value;

一切正常!在所有浏览器(IE 除外)上,我每次都可以按下按钮并获取随机行。但是在 IE 上它给了我相同的行,直到我刷新页面。 我在所有版本的 IE 上都试过了,直到我刷新页面,行才会改变。

知道它可能是什么吗?

提前致谢!

这里有更多代码:

function getdata()
    var data = $.ajax(
            url: "getmydata.php",
            async: false
        ).responseText;

    passdata(data); 

编辑:我知道 ORDER BY RAND 不好,但我只有 10 行!

【问题讨论】:

为什么是async: false 可能缓存在客户端。 SQL 查询不受用户代理的影响。 @GNi33:如果我错了,请纠正我?同步请求可以锁定ajax状态和浏览器。 @NabRaj 你是对的。这使得async: false 令人困惑:) @NabRaj 确切地说,此函数将阻塞直到 Ajax 调用完成,请考虑使用回调函数。至于您的问题,您是否尝试过在呼叫中添加更改参数?喜欢data: 'cacheParam' : Math.floor(Math.random()*1000)? 【参考方案1】:

是的,IE 因积极缓存请求和忽略 HTTP 标头而不缓存内容而臭名昭著。在我们的应用程序中,当我们有一个必须从服务器刷新的 AJAX 请求时,我们在 url 中使用一个缓存破坏随机数:

url: "getmydata.php?rand="+Math.random()

?用于添加querystring parameters,不处理对请求没有影响。由于url每次都是唯一的,所以永远无法缓存。


编辑:正如@GNi33 所指出的,jQuery.ajax 中已经内置了一个功能,可以将名为cache 的参数设置为false 来强制缓存破坏:

var data = $.ajax(
    url: "getmydata.php",
    cache: false,    /* ADD THIS to prevent IE caching */
    async: false
).responseText;

这些解决方案中的任何一个都足够了。

【讨论】:

我的想法也是,只记得这甚至内置在jQuery .ajax - 函数中,使用cache - 属性并将其设置为false 感谢 mellamokb 和 GNi3,他们成功了!我在请求中添加了 Math.random() 和 cache: false 。干杯! @NabRaj:请注意,应用这两种解决方案是多余的,因为它们都同样足够。 @NabRaj 不需要同时设置它们,只需使用cache:false 就足够了 :) 因为在幕后,jQuery 除了设置这样的参数之外什么也没做 再次感谢,删除了 Math.random()。我更喜欢缓存:假!干杯!

以上是关于ORDER BY RAND() 总是在 IE 上给出相同的行的主要内容,如果未能解决你的问题,请参考以下文章

ORDER BY RAND() 似乎不是随机的

ORDER BY RAND()函数在mysql中执行需要很长时间[重复]

MySQL 查询优化与 group by 和 order by rand

mysql order by rand() 性能问题及解决方案

MySQL:ORDER BY RAND() 的替代方案

改进MySQL Order By Rand()的低效率