2011-08-31 63 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