Gewichtete SQL-Abfragen

Gewichtete Abfragen werde häufig im Banner-Umfeld benötigt. Also überall da, wo Banner nach bestimmten Kriterien einblendet werden sollen. Wenn man davon ausgeht, das Banner unterschiedlichen Klick-Erfolg haben, dann liegt der Gedanke nahe, genau diese Ba

Gewichtete Abfragen SQL-Abfragen

Dieses Tutorial soll zeigen, wie eine gewichtete Abfrage mit PHP und MySQL realisiert werden kann.

Problemstellung:

Gewichtete Abfragen werde häufig im Banner-Umfeld benötigt. Also überall da, wo Banner nach bestimmten Kriterien einblendet werden sollen. Wenn man davon ausgeht, das Banner unterschiedlichen Klick-Erfolg haben, dann liegt der Gedanke nahe, genau diese Banner häufiger als andere einzublenden. Wie kann man so was realisieren?

Vorbereitungen:

Um überhaupt mit der Datenbank arbeiten zu können, benötigen wir erst einmal eine geeignete Datenbankstruktur. Für unsere Problemstellung "Bannereinblendung" soll uns die folgende Struktur reichen.

#
# Tabellenstruktur für Tabelle `banner`
#

CREATE TABLE banner (
id int(10) unsigned NOT NULL auto_increment,
bannertags varchar(254) NOT NULL default '',
gewicht tinyint(3) unsigned NOT NULL default '0',
views int(10) unsigned NOT NULL default '0',
Name varchar(40) NOT NULL default '',
PRIMARY KEY (id),
KEY gewicht (gewicht)
) TYPE=MyISAM;

#
# Daten für Tabelle `banner`
#

INSERT INTO banner VALUES (1,'<a href="http://www.php-resource.de/" target="_top">
<img src="http://www.php-resource.de/banner/thephpresource468.gif" border="0">
</a>','1','','Banner1');

INSERT INTO banner VALUES (2,'<a href="http://www.php-resource.de/" target="_top">
<img src="http://www.php-resource.de/banner/46860_it.gif" border="0">
</a>','2','','Banner2');

INSERT INTO banner VALUES (3,'<a href="http://www.php-resource.de/" target="_top">
<img src="http://www.php-resource.de/banner/46860_it_2.gif" border="0">
</a>','3','','Banner3');

Tip: Falls Ihr phpmyadmin verwendet, könnt die obigen Anweisungen 1 zu 1 kopieren und in phpmyadmin ausführen.

ID bannertags gewicht views Name
1 <a href="http://www.php-resource.de/" target="_top"><img src="http://www.php-resource.de/banner/thephpresource468.gif" alt="Scripts and Tutorials for Webdeveloper" width="468" height="60" border="0"></a> 1 0 Banner1
2 <a href="http://www.php-resource.de/" target="_top"><img src="http://www.php-resource.de/banner/46860_it.gif" alt="Scripts and Tutorials for Webdeveloper" width="468" height="60" border="0"></a> 2 0 Banner2
3 <a href="http://www.php-resource.de/" target="_top"><img src="http://www.php-resource.de/banner/46860_it_2.gif" alt="Scripts and Tutorials for Webdeveloper" width="468" height="60" border="0"></a> 3 0 Banner3

Hinweis : Die Banner mit einem hohen Gewicht werden später nicht so oft eingeblendet!

Was benötigen wir?

Zuerst erzeugen wir und mit folgendem PHP Script eine zufällige Gewichtung

<?php
srand
((double)microtime()*1000000);
$rand rand(1,3);
?>

Dieser kleine Script liefert uns einen Wert (Gewicht) zwischen 1 und 3. Mit dieser Wert wollen wir nun die dazugehörigen Werte aus der Datenbank lesen. Was aber bedeutet dieser Wert?

Wie funktioniert's

Wenn wir davon ausgehen, das uns das obige Script den Wert $rand=2 liefert, dann würde uns die Abfrage

$sql = "SELECT id, bannertags FROM banner WHERE gewicht<= '$rand' ";

die Banner1 und Banner2 zur Ausgabe anbieten. Banner3 würde nicht von der SQL-Abfrage betroffen sein, da das Gewicht von Banner3 > $rand ist.

Wie bekommen wie nun genau einen Banner aus der Datenbank zurück?

Die PHP-MYSQL-Funktion

mysql_data_seek($sqlbanner,$show_BannerId); 

erlaubt es uns, genau nach einem Eintrag zu suchen bzw. diesen genau anzugeben. Jetzt sind wir in der Lage, aus einer Anzahl von möglichen Banner genau einen auszuwählen. Doch welchen? Dieses überlassen wir wieder dem Zufall.

<?php
srand 
((double) microtime() * 1000000);
$show_BannerId rand(0,$Anzahlbanner-1);
?>

Alles verstanden?

Das folgende Listing zeigt das ganze Script.

FILE:bannerdisplay.php

<?php
//verbindung zur Datenbank herstellen
$dblink =mysql_connect ("localhost","root","");
$select_db=mysql_select_db ("yourDB",$dblink);

//Gewichtung bestimmen
srand((double)microtime()*1000000); 
$rand rand (13);

//Mögliche Banner auslesen. Dieses sind in der Regel mehrere!!
$sql "SELECT id, bannertags FROM banner WHERE   gewicht <= '$rand' ";
$sqlbanner mysql_query($sql,$dblink) or die ("Fehler in SQL : $sql");
$Anzahlbanner =  mysql_num_rows ($sqlbanner);

//aus der so eben erzeigten Liste genau eine zufällige BannerID bestimmen
if($Anzahlbanner == 1) {
    
$show_BannerId 0;
} else {
    
srand ((double) microtime() * 1000000);
    
$show_BannerId rand(0,$Anzahlbanner-1);
}

//Bannertag aus der Datenbank ausgeben
mysql_data_seek($sqlbanner,$show_BannerId);
$ban mysql_fetch_array($sqlbanner);

//Ausgabe im Browser!
echo $show_BannerId;
echo  
$ban[bannertags];
?>

Hinweis : Um das Script zu testen, müssen die Logins, Datenbanken der eigenen Umgebung angepasst werden!

$dblink =@mysql_connect ("local","root","");
$select_db=mysql_select_db ("php-resource",$dblink);

Bernhard Bauder

Author

Erfahrungen

Es sind noch keine Kommentare vorhanden.

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe

Verwandte Beiträge

MySQL Klasse

In meinem kleinen Tutorial zeige ich euch, wie ihr ganz einfach eine kleine MySQL Klasse schreiben könnt. ...

Borlabs

Autor : Borlabs
Kategorie: mySQL-Tutorials

Das 'Nested Sets' Modell - Bäume mit SQL

Das 'Nested Sets' Modell - Bäume mit SQL

Dieses Tutorial beschreibt die 'Nested Sets'-Technik, mit der man solche Bäume mit SQL performant konstruieren kann. ...

gorski@

Autor : gorski@
Kategorie: mySQL-Tutorials

PHP-Scripte offline testen unter Windows

Wenn Sie sich schon mit der Erstellung von dynamischen Websiten beschäftigt haben, wissen Sie vielleicht wie umständlich es ist, die Scripte immer auf den Server Ihres Hosters zu laden um diese testen zu können. ...

webmaster116@

Autor : webmaster116@
Kategorie: Linux & Server Tutorials

PHP cURL-Tutorial: Verwendung von cURL zum Durchführen von HTTP-Anfragen

cURL ist eine leistungsstarke PHP-Erweiterung, die es Ihnen ermöglicht, mit verschiedenen Servern über verschiedene Protokolle wie HTTP, HTTPS, FTP und mehr zu kommunizieren. ...

TheMax

Autor : TheMax
Kategorie: PHP-Tutorials

Spielereien mit Zeit und Datum

Das Rechnen mit Datum und Zeit ist nur selten unproblematisch, PHP stellt uns dafür zahlreiche Funktionen zur Verfügung. Wir wollen uns im folgenden ein paar davon ansehen und an Beispielen erproben. ...

Stephane

Autor : Stephane
Kategorie: PHP-Tutorials

Wie erstelle ich ein LogIn-Skript?

Das folgende Tutorial nutzt eine Datenbank, in der die Benutzerdaten gespeichert werden und eine Session, in der der Benutzer registriert wird. ...

andy@

Autor : andy@
Kategorie: PHP-Tutorials

Was muss ich in WordPress einstellen, damit Google Fonts nicht mehr geladen werden?

Möchten Du WordPress davon abhalten, Google Fonts zu verwenden? Hier erfährst Du, was du dafür in WordPress einstellen musst. ...

admin

Autor : admin
Kategorie: Sonstige Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen