Gå til innhold

Tilfeldig bilete frå ein uorganisert database.


Anbefalte innlegg

Skrevet

Hei eg har ei nettside med ein funksjon som hentar eit tilfeldig bilete frå ein uorganisert database. Det eg kunne tenkt meg var at same bilete ikkje kjem opp 2 gangar. Håpar nokon har eit svar på dette.

 

 

-InnFjording

Videoannonse
Annonse
Skrevet

Her er koden. Eg skal innrømme at eg skreiv delar av den frå ei toturial side, men dette er då koden i si heilhet.

 

<?
$imglist='';
 $img_folder = "images/Random/";

 mt_srand((double)microtime()*1000);

$imgs = dir($img_folder);

while ($file = $imgs->read()) {
  if (eregi("gif", $file) || eregi("jpg", $file) || eregi("png", $file))
    $imglist .= "$file ";

} closedir($imgs->handle);

$imglist = explode(" ", $imglist);
$no = sizeof($imglist)-2;

//generate a random number between 0 and the number of images
$random = mt_rand(0, $no);
$image = $imglist[$random];

echo '<a href="http://nordfjordgs.net/links.php"><img src="'.$img_folder.$image.'" border=0 ></a>';
?>

Skrevet
class RandomImageDispenser {
 public $extensions = array("jpg", "png", "gif");
 public $images = array();
 public $imagedir = "";
 public $index = 0;

 public function __construct($dir) {
   $this->createImageList($dir);
 }

 public function getImage() {
  $array_length = sizeof($this->images);
  $img = $this->images[$this->index++ % $array_length];
  return $this->imagedir . $img;
 }

 public function createImageList($dir) {
   $this->imagedir = $dir;
   $this->images = array();
   $this->index = 0;

   $imgs = dir($dir);

   while ($filename = $imgs->read()) {
     $file_ext = pathinfo($filename, PATHINFO_EXTENSION);
     if (in_array(strtolower($file_ext), $this->extensions)) {
       $this->images[] = $filename;
     }
   }
   shuffle($this->images);
 }
}

$shuffle = new RandomImageDispenser("path_to_images");

while (true) {
 echo "Image : " .$shuffle->getImage() . "\n";
}

Skrevet (endret)

echo '<a href="http://nordfjordgs.net/links.php"><img src="'.$img_folder.$image.'" border=0 ></a>';

 

til

 

echo '<a href="http://nordfjordgs.net/links.php"><img src="'.$shuffle->getImage().'" border=0 ></a>';

 

Som vist her:

 

while (true) {
 echo "Image : " . $shuffle->getImage() . "\n";
}

 

Siden du ikke har vist hele koden, kan jeg ikke gi så mye mer info

 

Edit : Du har ikke svart på hva du mente med "Det eg kunne tenkt meg var at same bilete ikkje kjem opp 2 gangar." - er det per side, per bruker, per session, per dag, per inge torkelsen?

 

Også.. Var ikke meningen å bruke "while (true)" loop'en i siden direkte :p Som du sikkert kan gjette, så vil den aldri avslutte ;)

Endret av Terrasque
Skrevet (endret)

Jeg forstår ikke helt hva du vil.

 

Er det slik at du ønsker at det skal komme opp et helt nytt bilde hver gang?

 

Da lurer jeg gjerne på hvem dette skal gjelde for; er det bare slik at siden skal vise et nytt bilde hver gang, eller skal hver nye bruker få en mulighet til å se bildene de ikke enda har sett?

 

Edit: har du tilgang på MySQL? Da blir jo alt mye lettere.

Endret av Notelitten
Skrevet (endret)

Putt class'en i egen fil, og på sider du trenger den, gjør dette:

session_start();
include 'classfil.php'

if (!isset($_SESSION['randimage'])) {
 $_SESSION['randimage'] = new RandomImageDispenser("path_to_images");;
}
$shuffle = $_SESSION['randimage'];

 

Så er det bare å bruke "$shuffle->getImage()" hver gang du trenger en bilde url.

 

Edit : hvor mange bilder har du i den mappen, forresten? Og, hvor mange bilder vil hver bruker sannsynligvis se?

Endret av Terrasque
Skrevet

Her er heile koden, slik som den ser ut no

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>NordfjordGamingSquad - Løje</title>
<link rel="stylesheet" href="styles.css" type="text/css" />
</head>
<body>
<div id="container">
<?php include("stilar/header.php"); ?>
<?php include("stilar/menu.php"); ?>
</div>

<br>
	<center>
	<?php
	class RandomImageDispenser {
 public $extensions = array("jpg", "png", "gif");
 public $images = array();
 public $imagedir = "";
 public $index = 0;

 public function __construct($dir) {
   $this->createImageList($dir);
 }

 public function getImage() {
  $array_length = sizeof($this->images);
  $img = $this->images[$this->index++ % $array_length];
  return $this->imagedir . $img;
 }

 public function createImageList($dir) {
   $this->imagedir = $dir;
   $this->images = array();
   $this->index = 0;

   $imgs = dir($dir);

   while ($filename = $imgs->read()) {
     $file_ext = pathinfo($filename, PATHINFO_EXTENSION);
     if (in_array(strtolower($file_ext), $this->extensions)) {
       $this->images[] = $filename;
     }
   }
   shuffle($this->images);
 }
}

$shuffle = new RandomImageDispenser("images/Random");

while (true) {
 echo "Image : " . $shuffle->getImage() . "\n";
}
?>
</center><br><br>
<center><script type="text/javascript">
var uri = 'http://impno.tradedoubler.com/imp?type(js)pool(461425)a(1944389)' + new String (Math.random()).substring (2, 11);
document.write('<sc'+'ript type="text/javascript" src="'+uri+'" charset="ISO-8859-1"></sc'+'ript>');
</script></center>
</div><br>

</div>
</body>
</html>

 

Takk for all hjelp so langt ^^

 

Det er no omtrent 3500 bilder i mappa men om ikkje lenge ligger der sikkert snart 5000

Skrevet (endret)

Med så mange bilder bør du kanskje legge inn en

 

 $this->images = array_slice($this->images, 0, 200);

etter shuffle($this->images) linjen.

Det vil begrense til 200 bilder lagret for hver bruker, å loope igjennom. Ellers kan det kanskje slite litt på lagring / minne etterhvert (5000 bildenavn * aktive sessions = masse lagret i sessions).

Endret av Terrasque
Skrevet

Hmm... det ser ikkje ut som om eg klarer å implimitere denne slik det ser ut no. Eg får opp ei feilmelding med denne linja

if (!isset($_SESSION['randimage'])) {

det er sikkert ein heilt banal feil :p

Skrevet (endret)

Her er koden til side der bildet skal postast

 

<?php session_start();
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>NordfjordGamingSquad - Løje</title>
<link rel="stylesheet" href="styles.css" type="text/css" />

</head>
<body>
<div id="container">
<?php include("stilar/header.php"); ?>
<?php include("stilar/menu.php"); ?>
</div>

<br>
	<center>

include 'classfil.php';
if (!isset($_SESSION['randimage'])) {
 $_SESSION['randimage'] = new RandomImageDispenser("images/Random");;
}
$shuffle = $_SESSION['randimage'];
?>
</center><br><br>
<center><script type="text/javascript">
var uri = 'http://impno.tradedoubler.com/imp?type(js)pool(461425)a(1944389)' + new String (Math.random()).substring (2, 11);
document.write('<sc'+'ript type="text/javascript" src="'+uri+'" charset="ISO-8859-1"></sc'+'ript>');
</script></center>
</div><br>

</div>
</body>
</html>

 

Om det er noko meir du treng so berre sei i fra ^^

Endret av InnFjording
Skrevet (endret)

Eg ser eit anna problem ja: du kallar session_start() etter du har skrive ut HTML.

session_start() må kallast før noko som helst anna vert sendt ut til nettlesaren.

 

Edit:

Ein tommelfingerregel kan vere at du tek deg av det meste som må behandlast av PHP øverst i fila, og skriv ut HTML-en på slutten når alt er ferdig prosessert.

Endret av Kjell Arne Steinsvik

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...