Generovaní náhodneho obrázku.

Chtěl bych se zeptat jestli by mi někdo neporadil jak vytvořit script který po zadáni URL př.(fotky/dovolena/) načte „link“ (nahodného) obrázku a ten uloží do databáze… (pro později použiti jako náhled galerie).
I když sem na netu dost dlouho hledal, tak nic co by mi prosvětlilo můj problém nemám .
<HTML>Já to vidím takto:

<ol>
<li>zjistím seznam obrázků a jejich počet = n</li>
<li>vygeneruju náhodné číslo mezi 0 a n-1, to budiž číslo x</li>
<li>obrázek[x] je vámi hledaný obrázek</li></ol></HTML>
//zjistis kolik mas v danem adresari obrazku

$m=0;
$handle=opendir('./fotky/dovolena');
while (($file = readdir($handle))!==false) {
$m++;
}
closedir($handle);

//nevim proc ale vzdy ti to hodi o 2 soubory vice (teda mne jo) tak ty 2 odectes
$pocet_obrazku=number_format($m-2);

//tedka uz jen vygenerujes nahodnou fotku

$nahodna_fotka=rand(0,$pocet_obrazku);

//tedka uz jen zobrazis nahodnou fotku
echo "<img src=lala.cz/fotky/dovolena/$nahodna_fotka.JPG";

Ulozeni do databaze ti vysvetlovat nebudu, to snad uz zvladnes ;)
<HTML><em>//nevim proc ale vzdy ti to hodi o 2 soubory vice (teda mne jo) tak ty 2 odectes</em>


Tak bych doporučoval to rychle vypátrat. Dále nechápu smysl použití funkce number_format(). Mnohem čistší řešení prvních cca 8 řádků:

<code>
$pocet_obrazku=0;
$handle=opendir('./fotky/dovolena');
while (($file = readdir($handle))!==false) {
  if($file != '.' && $file != '..') $pocet_obrazku++;
}
closedir($handle);
</code>


K další části kódu: Martn předpokládá, že jsou fotky pojmenovány 1.JPG, 2.JPG atd. To nemusí být pravda. Proto celý skript je třeba přepsat takto:

<code>
$pocet_obrazku=0;
$obrazky = array();
$handle=opendir('./fotky/dovolena');
while (($file = readdir($handle))!==false) {
  if($file != '.' && $file != '..') {
    $pocet_obrazku++;
    $obrazky[] = $file;
  }
}
closedir($handle);
$x = rand(0, $pocet_obrazku);
echo('<img src="./fotky/dovolena/'.$obrazky[$x].'">');
</code>


Je tu však stále jeden problém - v adresáři musí být pouze obrázky. Jinak je potřeba vnitřní podmínku cyklu upravit třeba na substr($file, -4) == '.jpg' nebo tak nějak.</HTML>
Pánove děkuju moc :)
jeste snad poznamku: proc zbytecne v kazde iteraci cyklu inkrementovat pocet_obrazku, kdyz pak muzem jednou udelat count($obrazky)
Pokud v adresari mas jen obrazky, tak si dej pozor na kopirovani na server - teda jen pokud mas windowsy (vytvari skryte zbytecne thumbs.db soubory,ktery by ti pak mohl delat neplechu ;) )

=Martn=
Ten to cislo zvetseno o 2 je zpusobeno tim, ze funkce opendir() ti vrati i . (jako aktualni adresar) a .. (jako rodicovsky-nadrazeny adresar).

=Tonik=
Jak psal Martn, musis pak jeste odecist 2 (prave kvuli . a ..). Ale je to nejlepsi reseni (pokud v adresari jsou jen obrazky ..)
<HTML>Freeze: tak zrovna tvoje připomínky jsem předem dávno zpracoval ve svém příspěvku, stačí si ho přečíst.

Tonik: dobrý postřeh.</HTML>
já používám tohle - soubor random_img.php:

$random_img = Explode(",", $_SERVER['QUERY_STRING']);
$rand = Rand(1, Count($random_img)) - 1;
$img = page_root.$random_img[$rand];

if(File_Exists($img)) {
$size = GetImageSize($img);
if(Is_Numeric($size[2]) && $size[2] < 17 && $size[2] > 0) {
Header("Content-type: {$size['mime']}");
$open = FOpen($img, 'r');
FPassThru($open);
FClose($open);
}
else {
Header('Content-Type: image/jpeg');
ReadFile(error_img);
exit;
}
}
else {
exit;
}

konstanty page_root a error_image je třeba nahradit kořenem stránek a cestou k chybovému obrázku 404.

Stačí pak například použít tag <img src=random_img.php?a_01.png,a_05.png,a_06.png> a ono to zobrazí náhodný obrázek s toho použitého seznamu. Nevýhoda je nutnost vygenerování toho seznamu (lze ale snadno upravit). Jinak to lze použít i v statických HTML nebo css dokumentech.
Panové vim že to asi bude o5 úplná maličkost ale i přesto vás chci poprosit o pomoc.

Potřeboval bych přidat do podmínky substr($file, -4) == '.jpg' je to pro výběr .jpg souboru z adresáře, popisoval to Nípal ale nějak sem nepochopil. Spiš neumím to.


<?PHP
$pocet_obrazku=0;
$handle=opendir('./dovolena');
while (($file = readdir($handle))!==false) {
if($file != '.' && $file != '..') $pocet_obrazku++;
}
closedir($handle);

$pocet_obrazku=0;
$obrazky = array();
$handle=opendir('./dovolena');
while (($file = readdir($handle))!==false) {
if($file != '.' && $file != '..') {
$pocet_obrazku++;
$obrazky[] = $file;
}
}
closedir($handle);
$x = rand(0, $pocet_obrazku);
echo('<img src="./dovolena/'.$obrazky[$x].'">');
?>
Tak třeba ten první příklad, který uvádíš:

$pocet_obrazku=0;
$handle=opendir('./dovolena');
while (($file = readdir($handle))!==false) {
if(substr($file, -4) == '.jpg') $pocet_obrazku++;
}
closedir($handle);

vzhledem k tomu, že je určen konkrétní typ souboru tak není potřeba filtrovat ty dva adresáře a stačí odfiltrovat je to, co má na konci '.jpg'.

Jen by bylo asi vhodné ošetřit možnou různou velikost písmen - záleží na kontextu, tak např.:

$pocet_obrazku=0;
$handle=opendir('./dovolena');
while (($file = readdir($handle))!==false) {
if(substr(strtoupper($file), -4) == '.JPG') $pocet_obrazku++;
}
closedir($handle);