[php] jak wybrac losowy wpis z bazy

0

Jak wybrac z bazy losowy wpis np chce zrobic losowe wyswietlanie banera. i jak dodam baner do bazy to zeby sie lowosow jakis wysweitlal wpis z tej bazy jak to zrobic?


A lepiej zrobic akie banery na bazie danych czy lepiej w skrypcie dac ? rotacje banerow bo zawsze to z kazdym przeladowaniem strony bedzie trzeba wyklonywac zapytanie do bazy ? co radzicie ??

0

mozesz tez dac w folderze 'bannery' obrazy ponumerowane 1..n
i pozniej random z tego:

<? 
$n=4; //ilosc obrazkow
$nr=rand(1,$n); //losujemy
echo '<img src="bannery/'.$nr.'.jpg'">';
?>

do tego plik z linkami poszczegolnymi

0

Ja dawno temu robiłem losowe wyświetlanie banerów, na czystej losowości, bez żadnych ratio i tak dalej. Banery były w bazie danych, gdzie była m.in. ilość kliknięć, czas wyświetlania dozwolonego, ścieżka do obrazka, ścieżka do linka i tak dalej.

Funkcja wyglądała tak:

  
function generate_ad()
  {
           $db = new mySQL();
           // pobierz losowy naer z bazy który jest aktywny (ma więcej lub 0 klinięć lub wyświetleń, a jego expiration time jest większy
           // niż czas obecny lub równy 0
           $result = $db->Query("SELECT ad_id, ad_title, ad_image_url, ad_views, ad_point_value FROM " . CHEPRE_PREFIX . "ads WHERE ad_clicks >= 0 AND " .
                                "ad_views >= 0 AND (ad_expiration_time >= NOW() OR ad_expiration_time = '0000-00-00 00:00:00') ORDER BY RAND() LIMIT 1;");
                     
           if ($db->Num_rows($result) == 0)
              return '<a href="[ciach]">[ciach]</a>';
              
           $fld = $db->Fetch_array($result);
           
           // jeżeli są ogranicznia ilości wyświetleń to zmniejsz licznik wyświetleń o jeden dla wybranego banera
           if ($fld["ad_views"] > 1)
           {
              $db->Query("UPDATE " . CHEPRE_PREFIX . "ads SET ad_views = ad_views -1 WHERE ad_id = " . $fld["ad_id"] . ";");
           }
           elseif ($fld["ad_views"] == 1)
                  $db->Query("UPDATE " . CHEPRE_PREFIX . "ads SET ad_views = -1 WHERE ad_id = " . $fld["ad_id"] . ";");
           // zwróc kod HTML do obrazka
           return '<a href="click.php?id=' . $fld["ad_id"] . '"><img src="' . $fld["ad_image_url"] . '" alt="Chepre Ad System" title="' . $fld["ad_title"] . '" /></a>';
           
  }

$db to obiekt klasy MySQL, chodzi o to samo, co normalne funkcje dostępu do bazy danych.

0

Abyś nie musiał się przejmować zmianą kodu po każdym dodaniu bannera do folderu (czyli podawaniem ilości bannerów w zmiennej $n) proponuję małe ulepszenie do kodu - liczenie ilości bannerów w folderze (warunek - nie może tam być innych plików poza bannerami!)

<? 
$sciezka = "bannery/";

$katalog = opendir($sciezka);
while ($plik = readdir($katalog)) {
if (($plik<>".")&&($plik<>"..")&&(!is_dir($sciezka.$plik))) {
$n++; // n - ilosc obrazków
}
}
closedir($katalog);


$nr=rand(1,$n); //losujemy
echo '<img src="bannery/'.$nr.'.jpg'">';
?>
0

A nie prosciej cos takiego:

SELECT * FROM tabela ORDER BY rand() LIMIT 1

Zwroci z bazy losowy wiersz i tylko go wyswietlic ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1