Priorität System (in meinen Fall bei Banner)

dr_Alex

Erfahrenes Mitglied
ich möchte für meine Seite ein Banner System nach Priorität haben. Also wie oft ein Banner in vergleich zu den anderen Bannern gezeigt wird.
Die Datenbank ist so aufgebaut:
banner_html
banner_view
banner_view_temp
banner_order

Ich hab jetzt zB drei Banner in der Datenbank:

Banner 1: Priorität=10
Banner 2: Priorität=20
Banner 3: Priorität=30

Jetzt würde ich gerne das bei 60 aktualisierungen der erste Banner 10mal angezeigt wird, der 2te 20 mal usw.
Dabei dürfen sich die Banner nicht wiederholen.

Das war mein erster Code der nicht ging (ziemlich unsauber, ich weiss :)):
PHP:
$res=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND banner_cat='1' AND banner_show='0' ORDER BY banner_id") or die(mysql_error());
if(mysql_num_rows($res)==0){
	mysql_query("UPDATE auktion_banner SET banner_show='0'");
	$res=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND banner_cat='1' AND banner_show='0' ORDER BY banner_id") or die(mysql_error());
}

// alle banner die aktiv sind in die schleife
while($row=mysql_fetch_assoc($res)){
	$array[]=$row;
}
// alle dessen priorität schon ab ist löschen
while(list($key,$value)=each($array)){
	if($value['banner_view_temp']==$value['banner_order']){
		unset($array[$key]);
	}
	if($value['banner_show']==1){
		unset($array[$key]);
	}
}
if(count($array)==0){
	mysql_query("UPDATE auktion_banner SET banner_view_temp='0'");
	$res=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND banner_cat='1' ORDER BY banner_id");
	while($row=mysql_fetch_assoc($res)){
		$array[]=$row;
	}
}
$array = array_values($array);

mysql_query("UPDATE auktion_banner SET banner_view_temp='".($array[0]['banner_view_temp']+1)."', banner_view='".($array[0]['banner_view']+1)."',banner_show='1' WHERE banner_id='".$array[0]['banner_id']."' LIMIT 1") or die(mysql_error());

ok dann hab ich etwas umstruktuirt:

PHP:
function lese_mysql($ok){
	// sicherheit
	global $i;
	$i=$ok+1;
	if($i==100) return false;
	// 
	$res=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND banner_cat='1' AND banner_show='0' ORDER BY banner_order DESC");
	if(mysql_num_rows($res)!=0){
		$res2=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND banner_cat='1' AND banner_show='0' AND banner_view_temp<banner_order ORDER BY banner_order DESC");
		if(mysql_num_rows($res2)==0){
			mysql_query("UPDATE auktion_banner SET banner_view_temp='0',banner_show='0' WHERE banner_view_temp<banner_order");
			lese_mysql($i);
		}else{
			return $res2;
		}
	}else{
		mysql_query("UPDATE auktion_banner SET banner_show='0' WHERE banner_view_temp<banner_order");
		lese_mysql($i);
	}
}
while($row=mysql_fetch_assoc(lese_mysql(1))){
			$banner[]=$row;
			mysql_query("UPDATE auktion_banner SET banner_view_temp='".($row['banner_view_temp']+1)."', banner_view='".($row['banner_view']+1)."',banner_show='1' WHERE banner_id='".$row['banner_id']."' LIMIT 1") or die(mysql_error());
			break 1;
}

Bei den ersten Code die priorität nicht. die banner werden nach einander ausgegeben. Bei den zweiten wird die view_temp nicht zurück gestezt.

normaler weisse würde ich weiter rumexperementieren aber ich hab irgentiwe ne sperre und es kommt gar nichts bei raus.

hoffe um hilfe
danke vorraus
 
schreib doch einfach in die WHERE bedinung rein, dass nur die Banner angezeigt werden solllen, die ihr maximum noch ned erreicht haben. Dann hauste vielleicht noch bisl zufal in die ausleserei rein und schon passt.
 
hab probiert aber der auftragsgeber will nicht das ein banner 2 mal hintereinader gezeigt wird, und bei zufall wird es der fall sein.

dr_alex
 
dann kannst du den letzten banner ja in einer variable speichern und dann überprüfen, ob der aktuelle mit dem übereinstimmt. Wenn ja, dann einfach "weiterknobeln"

Bsp:
PHP:
while ($altesbanner == $neuesbanner) {
   $neuesbanner = knobel();
   }
$altesbanner = $neuesbanner;
 
die sollen nacheinander kommen. also hab jetzt das gemacht. aber der banner, der die höchste priorität hat, wird nicht angezeigt.

PHP:
function get_banner($cat='1',$reset='no'){
	if($reset=='show'){
		mysql_query("UPDATE auktion_banner SET banner_show='0' WHERE banner_view_temp<banner_order AND (banner_cat='$cat' OR banner_cat='-1')");
	}
	if($reset=='view'){
		mysql_query("UPDATE auktion_banner SET banner_view_temp='0' WHERE (banner_cat='$cat' OR banner_cat='-1')");
	}
	$res2=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND (banner_cat='$cat' OR banner_cat='-1') AND banner_show='0' ORDER BY banner_order DESC") or die(mysql_error());
	if(mysql_num_rows($res2)==0){
		get_banner($cat,'show');
	}
	$res3=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND (banner_cat='$cat' OR banner_cat='-1') AND banner_show='0' AND banner_view_temp<banner_order ORDER BY banner_order DESC") or die(mysql_error());
	if(mysql_num_rows($res3)==0){
		get_banner($cat,'view');
	}		
	$res=mysql_query("SELECT * FROM auktion_banner WHERE banner_active='1' AND (banner_cat='$cat' OR banner_cat='-1') ORDER BY banner_order DESC") or die(mysql_error());
	while($row=mysql_fetch_assoc($res)){
		if($row['banner_view_temp']<$row['banner_order']){
			if($row['banner_show']==0){
				$banner[]=$row;
				mysql_query("UPDATE auktion_banner SET banner_view_temp=banner_view_temp+1, banner_view=banner_view+1, banner_show='1' WHERE banner_id='".$row['banner_id']."' LIMIT 1") or die(mysql_error());
				return $banner;
			}
		}
	}
	return false;
}	
$arr=get_banner();
 
Zurück