Проблема | Получение случайных значений из БД, как их не повторять - PullRequest
0 голосов
/ 31 августа 2011

Я создаю сайт, который получает случайные видео с БД. Моя проблема в том, что мой код для получения случайного видео следующий:

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

И я не хочу, чтобы пользователь видел это видео до тех пор, пока не будет воспроизведено еще 3 (по крайней мере) видео.

Есть ли у вас какие-либо предложения о том, как это сделать? Так работает мой сайт.

  1. HTML-AJAX ( ВЫЗОВ ДЛЯ ВИДЕО URL )
  2. PHP ( СЛУЧАЙНОЕ ВОЗВРАТ. ВИДЕО URL ) Одно видео.
  3. AJAX ( ДИСПЛЕЙ ВИДЕО )

[Изменено] Другая проблема, с которой я сталкиваюсь, заключается в том, что мне нужно вернуть только один URL-адрес видео, потому что так выглядит мой вызов 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);
}

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Вы можете просто использовать (мы возьмем пятнадцать, поэтому нам не нужно так много запрашивать сервер):

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

Отдайте эти пятнадцать браузеру и разрешите ему запрашивать видео. Как только он увидит пятнадцать, он может запросить у сервера еще три. Он может пропустить те, которые уже воспроизводятся, сохраняя идентификаторы воспроизводимого видео.

Если вы доставляете результаты через 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 = [];
1 голос
/ 31 августа 2011

Можно ли отправить идентификатор видео клиенту? Затем оттуда клиент (Javascript) запрашивает видео. Вот как это можно сыграть:

  1. Ajax список видео идентификаторы
  2. вставить их в массив в javascript (var toWatch)
  3. Случайный массив
  4. Получить первое видео
  5. Удалить идентификатор из первого массива. Возможно, вы захотите сохранить след этого идентификатора в другом массиве
  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); }
...