Bonjour à tous !

Voila, depuis un petit moment je chercher à trouver une solution à mon problème que voici:

Sur mon site (encore en developpement) j'ai une page personnalisé pour chaque vidéo (ex: www.monsite.com/video.php?id=2) bref, rien de bien compliqué, mais en bas de cette page, j'aimerais avoir 3 vidéos au hasard.

Dans la BDD, j'ai une table video avec un id pour chacune de mes vidéos puis l'id youtube de la video.

Je voudrais faire une requete SQL qui me permet de prendre 3 lignes au hasard dans ma table vidéo. et c'est là où est le probleme !!!

<?php
    $allVideoRecommended = $bdd->prepare("SELECT * FROM video WHERE id_video=?");
    $allVideoRecommended->execute(array($id_alea_video));
?>

il faut que le nombre au hasard corresponde à un VRAI id qui existe.

J'espère avoir été claire ^^

sinon voici mon code mais j'ai une erreur:

<div class="block_videos_recommandees">
    <h3>Vidéos recommandées</h3>

    <?php
    $id_all_video = $bdd->query("SELECT id_video FROM video");
    $id_all_video = $id_all_video->fetchAll();
    $id_alea_video = array_rand($id_all_video, 3);
    $id_alea_video = implode("", $id_alea_video);
    $id_alea_video1 = substr($id_alea_video, 0, 1);
    $id_alea_video2 = substr($id_alea_video, 1, 1);
    $id_alea_video3 = substr($id_alea_video, 2, 1);

    $videoRecommended1 = $bdd->prepare("SELECT * FROM video WHERE id_video=?");
    $videoRecommended1->execute(array($id_alea_video1));
    $recommended1 = $videoRecommended1->fetchAll();

    $videoRecommended2 = $bdd->prepare("SELECT * FROM video WHERE id_video=?");
    $videoRecommended2->execute(array($id_alea_video2));
    $recommended2 = $videoRecommended2->fetchAll();

    $videoRecommended3 = $bdd->prepare("SELECT * FROM video WHERE id_video=?");
    $videoRecommended3->execute(array($id_alea_video3));
    $recommended3 = $videoRecommended3->fetchAll();

    var_dump($recommended1);
        ?>

    <div style="display: inline-block; width: 33%;text-align: center;">
        <a href="/mozorstudio/formations/<?= secur_get($recommended1['0']['small_title_video'])?>-<?= $recommended1['0']['id_video']?>">
            <img class="image_video" style="width: 80%;" src="http://i.ytimg.com/vi/<?= $recommended1['id_youtube_video']?>/mqdefault.jpg" />
        </a>
    </div>

    <div style="display: inline-block; width: 33%;text-align: center;">
        <a href="/mozorstudio/formations/<?= secur_get($recommended2['small_title_video'])?>-<?= $recommended2['id_video']?>">
            <img class="image_video" style="width: 80%;" src="http://i.ytimg.com/vi/<?= $recommended2['id_youtube_video']?>/mqdefault.jpg" />
        </a>
    </div>

    <div style="display: inline-block; width: 33%;text-align: center;">
        <a href="/mozorstudio/formations/<?= secur_get($recommended3['small_title_video'])?>-<?= $recommended3['id_video']?>">
            <img class="image_video" style="width: 80%;" src="http://i.ytimg.com/vi/<?= $recommended3['id_youtube_video']?>/mqdefault.jpg" />
        </a>
    </div>
</div>

2 réponses


Huggy
Réponse acceptée

Bonsoir,
la solution la plus simple c'est

SELECT id_video FROM video  ORDER BY RAND() LIMIT 3;

Mais c'est lent (mais peut être acceptable pour ton application)
une autre solution consiste à récupérer via une requête le MAX(id_video) et le MIN(id_video).
Ensuite tu calcules 3 nombres aléatoires compris entre MIN et MAX. Si tu as des trous dans la numérotation et que tu tombes sur un trou, tu recommences.
Il faut voir comment sont répartis les id_video.

Bonsoir MozorStudio

Je vous propose ceci :

/**
* Fonction qui retourne des valeurs aleatoires d'un tableau.
* @param $array est le tableau qui contient les valeurs.
* @param $number est le nombre de valeur aleatoire à renvoyer.
* @return array
*/
function array_rand_values(array $array, $number)
{
    // conversion de $number en entier.
    $number = intval($number);

    if($number < 1) return array();

    $count = count($array);
    // recuperation aleatoire des clés dans le tableau. 
    $selected_keys = array_rand($array , $number <= $count ? $number : $count);
    // si on à un seul élément, on le met dans un tableau.
    if(!is_array($selected_keys)) $selected_keys = array($selected_keys);

    $result  =  array();
    // Insertion des valeurs aléatoires.
    foreach ($selected_keys as  $key) {
        $result[$key] = $array[$key];
    }
    return $result;
}

Usage :

On veut recuperer trois videos aléatoires.

<?php
$videos = $bdd->query("SELECT * FROM video")->fetchAll();
$trois_videos_aleatoires = array_rand_values($videos , 3);
?>

<?php foreach($trois_videos_aleatoires as $video): ?>
 <div style="display: inline-block; width: 33%;text-align: center;">
        <a href="/mozorstudio/formations/<?= secur_get($video['small_title_video'])?>-<?= $video['id_video']?>">
            <img class="image_video" style="width: 80%;" src="http://i.ytimg.com/vi/<?= $video['id_youtube_video']?>/mqdefault.jpg" />
        </a>
    </div>
<?php endforeach; ?>

En esperant que cela vous soit utile.