[php] Zufallsbanner ausgeben

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hi ich habe eine Funtion geschrieben mit der ich aus einer Datenbank die Grafiken und die Links auslese und diese dann per Zufall ausgebe. Aber das komische ist das die Zufallsfunktion teilweise ein bischen hängt. Alle Paar male kommt eine Fehlermeldung.

PHP:
function getbanner($cat) 
{
$sqlquery = "SELECT id,cat,grafik,url,hits FROM advertise WHERE cat='".$cat["1"]."'";
$query=mysql_query($sqlquery);
while($row=mysql_fetch_assoc($query)) 
	{ 
		$code[] = "<a href=\"".$row['url']."\"><img src=\"".$row['grafik']."\" border=\"0\"></a>";
	}
$i = rand(1, count($code)); 
floor($i);
$banner =  $code[$i];
return $banner;
}

Es kommt dann eine Notice: Undefined offset: $banner = $code[$i];
Und die ausgabe ist dann leer :(
 
Zuletzt bearbeitet:
Das liegt daran, dass manchmal count($code) als Index ausgewählt wird.
Ändere einfach folgende Zeile:
$i = rand(1, count($code) - 1);
 
Kurzer Tipp am Rande... wieso berechnest du für alle Banner die URL schon im Voraus? Wäre doch sinnvoller, die Zahl der Banner zu ermitteln und dann die Zufallszahl und dann nur den benötigten Banner auslesen und den Code zurückgeben. (Edit: Die Funktion zum Ermitteln der Rückgabeergebnisse müsste mysql_num_rows oder so ähnlich heißen. )

Die Ursache für dein Problem dürfte aber daran liegen, dass Arrays in PHP nullbasiert sind, d.h. der erste Wert hat den Index 0. Dein rand-Befehl liefert aber mindestens 1. Der Index-Bereich eines Arrays mit z.B. 4 Werten ist 0-3, deine rand-Funktion liefert aber Werte, die von 1-4 gehen können. Deshalb musst du von der berechneten Zahl noch 1 abziehen (oder eben den rand von 0 bis count($code)-1 durchführen ist eigentlich wurscht wie du es machst...
Der anschließende floor-Befehlt bewirkt gar nichts (müsste heißen "$i = floor($i);"), aber den kannst du wohl eh weglassen.

Allerdings solltest du die Zuweisung von $banner ändern in
Code:
$banner = $code[$i-1];

Edit: Und noch ein Tipp: Vielleicht wäre eine Überprüfung, ob überhaupt Banner gefunden wurden, sinnvoll, bevor $code ausgelesen und zurückgegeben wird.
Code:
if ($code != null) {
  $banner = $code[$i];           (bzw: $banner = $code[$i-1])
} else {
  $banner = "";
}
 
Zuletzt bearbeitet:
cR@zY.EnGi.GeR schrieb:
Das liegt daran, dass manchmal count($code) als Index ausgewählt wird.
Ändere einfach folgende Zeile:
$i = rand(1, count($code) - 1);
Und $code[0] wird immer ignoriert... also wenn dann schon von 0 bis count($code)-1.
 
Ich habe 3 Banner in der Datenbank. Aber nun Switcht er immer nur zwischen 2en
 
quicksilver schrieb:
Ich habe 3 Banner in der Datenbank. Aber nun Switcht er immer nur zwischen 2en
Dann sag uns doch mal, was du gemacht hast... wenn du das gemacht hast, was cR@zY.EnGi.GeR vorgeschlagen hat, dann sag ich nur: Lies doch mal die anderen Antworten....
 
Das ist nun die Funktion. Und er gibt weiterhin nur 2 Banner aus :(

PHP:
// Banner aus der Datenbank auslesen
function getbanner($cat) 
{
$sqlquery = "SELECT id,cat,grafik,url,hits FROM advertise WHERE cat='".$cat["1"]."'";
$query=mysql_query($sqlquery);
while($row=mysql_fetch_assoc($query)) 
	{ 
		$code[] = "<a href=\"".$row['url']."\"><img src=\"".$row['grafik']."\" border=\"0\"></a>";
	}
$i = rand(1, count($code)-1);
floor($i);
if ($code != null) {$banner = $code[$i-1];} else {$banner = "";}
return $banner;
}

Edit: So nun geht es .. habe unten das hier angepasst($banner = $code[$i-1]) nun gehts 1a!! Danke euch
 
Zuletzt bearbeitet:
Bist du dir sicher, dass der Code alle 3 anzeigt?

Weil du darfst nur an einer Stelle -1 hinsetzen, entweder im Rand-Befehl (aber dann bitte auch die 1 vorne in 0 ändern), oder in $code[$i-1].
Hast du überhaupt verstanden, warum sich das alles so verhält? Ich glaube nicht...
rand(x, y) liefert eine Zufallszahl von x bis y, also rand(1, 3) liefert 1, 2 oder 3 (das ist der Aufruf wie er bei dir anfangs stattgefunden hätte, also rand(1, 3) ).
floor rundet eine Gleitkommazahl ab. Macht hier keinen Sinn, rand liefert nur Ganzzahlen (laut meiner Dokumentation).
Dein Array mit einer Länge von 3 hat Index-Werte von 0 bis 2 (0 bis count-1).
Wir müssen also die Zufallszahl um 1 nach unten verschieben, das schaffen wir entweder in dem wir den rand-Befehl ändern:
rand(1 - 1, count($code) - 1)
so müsste es eigentlich heißen, denn wir wollen ja nicht die Zahl der Ergebnisse beeinflussen, sondern nur den Wertebereich, also müssen wir auch vorne 1 abziehen (rand(1, 2) liefert ja nur noch 1 oder 2... genau das Problem, das du vorher beschrieben hattest).
Oder eben wir ziehen beim Zugriff auf das Array vom Index 1 ab...
$banner = $code[$i-1];

Bitte nicht mischen und nicht beides machen...


So müsste es doch auch gehen:
PHP:
// Banner aus der Datenbank auslesen
function getbanner($cat) 
{
$sqlquery = "SELECT id,cat,grafik,url,hits FROM advertise WHERE cat='".$cat["1"]."'";
$query=mysql_query($sqlquery);
while($row=mysql_fetch_assoc($query)) 
	{ 
		$code[] = "<a href=\"".$row['url']."\"><img src=\"".$row['grafik']."\" border=\"0\"></a>";
	}
$i = rand(1, count($code));
if ($code != null) {$banner = $code[$i-1];} else {$banner = "";}
return $banner;
}
 
Zuletzt bearbeitet:
1668mib schrieb:
Und $code[0] wird immer ignoriert... also wenn dann schon von 0 bis count($code)-1.
Stimmt hast recht, hab ich übersehen. :)
 
Noch eine bessere lösung:

$sqlquery = "SELECT id,cat,grafik,url,hits FROM advertise WHERE cat='".$cat["1"]."' ORDER BY RAND() LIMIT 1";

Liefert eine zufällige Zeile ;)
 
Hallo,

warum gehst du die Sache denn so kompliziert an und verarbeitest ersteinmal alle Datensätze, wenn MySQL dazu doch schon die passende Funktion bietet. ;)

PHP:
function getbanner($cat) 
{
  $abfrage = mysql_query("SELECT id, cat, grafik, url, hits FROM advertise WHERE cat='".$cat["1"]."' ORDER BY RAND() LIMIT 0, 1");
  $banner = mysql_num_rows($abfrage);
  
  if(empty($banner))
  {
    return "";
  }
  else
  {
    $ds = mysql_fetch_array($abfrage);
    
    return "<a href=\"".$ds['url']."\"><img src=\"".$ds['grafik']."\" border=\"0\"></a>";
  }
}
MfG mh1001

// Huch, wieder einmal zu langsam ;)
 
Zurück
Oben