2011-08-31 60 views
0

我正在创建一个网站,从数据库中获取随机视频。 我的问题是,我的代码,以获得随机的视频是这样的:问题|从数据库获取随机值,如何不重复他们

select id,content from videos order by rand() limit 1 

而且我不希望用户看到相同的视频,直到其他3个视频(至少)之前进行播放。

你有什么建议如何做到这一点? 这是我的网站目前的工作方式。

  1. HTML,AJAX(呼吁视频网址
  2. PHP(返回随机视频网址)一个视频。
  3. AJAX(显示视频

将帖子 我面临的另一个问题是,我需要回到只有一个视频网址, 因为这是怎么了我的Ajax调用的样子:

success: function(data){ 

      $('#content').html('<div id="ytapiplayer">You need Flash player 8+ and JavaScript enabled to view this video.</div>'); 
      var params = { allowScriptAccess: "always" }; 
      var atts = { id: "ytapiplayer" }; 
      swfobject.embedSWF(data.vidData+"&enablejsapi=1&playerapiid=ytapiplayer?autoplay=1", "ytapiplayer", "500", "405", "8", null, null, params, atts); 
} 

在此先感谢。

+0

在这种情况下,你需要记住视频的在(临时)表中选择之前选择并测试以查看是否未选择重复。 – Johan

+3

从不使用rand()命令。这是一个性能杀手! – Rijk

+0

@Rijk van Wel,那我该用什么? – funerr

回答

1

可以将视频ID发送到客户端吗?然后从那里客户端(Javascript)请求视频。这里怎么会播放:

  1. 阿贾克斯视频列表IDS
  2. 在javascript将其插入阵列(VAR toWatch)
  3. 随机排列
  4. 获取第一视频
  5. 从第一个数组中删除id。你可能想保留该ID的痕迹在其他阵列
  6. 重复4-5

在javascript中它可能看起来像:

$.post("getVideoId.php",function(videoId){ 
    var aVideoToWatch = videoId.split(',').sort(randOrd); 

    for(var x=0; x<aVideoToWatch.length;x++){ 
     $.post("getAVideo(aVideoToWatch[x])",function(){ 
      //play the video 
     }) 
    } 
}) 

// source : http://javascript.about.com/library/blsort2.htm 
function randOrd(){ 
return (Math.round(Math.random())-0.5); } 
+0

是的视频ID实际上发送(回声json_encode (array(“id”=> $ random_vid [0],“vidData”=> $ random_vid [1]));)。尝试与cookie相同的事情,但它不起作用......你是什么意思:“Ajax的视频列表”?什么名单? PHP的作用是什么?回报什么? – funerr

+0

不要使用cookie,如果你在ajax中不刷新页面。代替使用对话框。像imbd。 –

+0

什么是对话框? (我编辑了我的问题,你可以回答吗?) – funerr

1

你可以只使用(我们会抓住十五,所以我们不必查询服务器这么多):

SELECT id, content FROM videos ORDER BY RAND() LIMIT 15 

把那些十五个手段,以允许它请求的视频。一旦它看到了十五,它可以再要求服务器三个。它可以通过存储播放的视频ID来跳过它已播放的内容。

如果您是通过Ajax和JSON交付结果,你可以只返回结果阵列的串联:

<?php 
$query = $pdo->query('SELECT id, content FROM videos ORDER BY RAND() LIMIT 10'); 
$videos = $query->fetchAll(); 
echo json_encode($videos); 
?> 

然后在JS:

(function playRandomVideos() { //Closures are cool 
    $.getJSON('getRandomVideos.php', {success: function(videos) { 
     for(video in videos) { 
      if(video.id in playRandomVideos.played) { 
       continue; 
      } 
      play(video); 
      playRandomVideos.played.push(video.id); 
     } 
     playRandomVideos(); 
    }}); 
})(); 
playedRandomVideos.played = []; 
+0

所以你的意思是:1)选择ID,内容从视频ORDER BR RAND()限制3 2)选择ID,内容从视频ORDER BR RAND()LIMIT 3,3 3)SELECT id,content FROM videos ORDER BR RAND()限制6,3等......? BR代表什么? – funerr

+0

'BR'是'BY'的错字。我建议如果您一次查询三个视频的数据库,它们将是唯一的,因为'ORDER BY'将返回所有行而不重复。所以是的,我认为你正确地理解了我。 –

+0

是的,但这样的事情可能会发生: 第一代:6,11,9然后第二代:9,4,6,这将在第一代后两次显示视频ID 9,我已经测试过。 – funerr