[PHP] Bewertungssystem entwickeln

Drucken
( 51 Votes )
Hauptkategorie: Programmieren Kategorie: PHP
Erstellt am 02.08.2012 Zuletzt aktualisiert am 09.08.2012 Geschrieben von Jonny132
Auf vielen Blogs / Homepages (wie auch hier) gibt es die Möglichkeit den Inhalt einer Seite zu bewerten.
In diesem Tutorial zeige ich euch, wie ihr ein solches Bewertungssystem selber mittels PHP und MySql realisieren könnt. Zum Produktiv-Beispiel.

Dazu müsst ihr eine neue Tabelle 'ratings' mit folgenden Definitionen auf eurer Datenbank anlegen:
  • contentid INT(11) Primary Key - Stellt die ID der angezeigten Seite dar, somit kann jede Seite eine individuelle Bewertung bekommen.
  • ratingcount INT(11) - Die Anzahl der abgegebenen Stimmen
  • ratingsum INT(11) - Die Summe der abgegebenen Bewertungen
  • ratinglastip VARCHAR(100) - Enthält die IP-Adresse des letzten Benutzer der den Inhalt bewertet hat


SQL - Definition der Tabelle 'ratings':

CREATE TABLE IF NOT EXISTS `ratings` (
  `contentid` int(11) NOT NULL,
  `ratingcount` int(11) NOT NULL,
  `ratingsum` int(11) NOT NULL,
  `ratinglastip` varchar(100) NOT NULL,
  PRIMARY KEY (`contentid`)
)
Erstellt nun eine neue Datei mit dem Namen 'rating.php'. Diese enthält die Logik und Ausgabe der Bewertungen.
Die folgenden Codeschnipsel müssen in ein '<?php' und '?>' - Tag eingeschlossen werden.

Grundgerüst und Logik:
$contentId = 0;

$currentRating = 'non';
$ratingMax = 5;
$ratingMin = 1;

$ratingCount = 0;
$ratingSum = 0;
$ratingLastIp = '';

$server = 'IhrMySqlHost';
$username = 'UserName';
$password = 'UserPasswort';
$database = 'Datenbank';

if(isset($_GET['contentid']) && is_numeric($_GET['contentid']))
{
  $contentId = $_GET['contentid'];
}

if(isset($_GET['rating']) && is_numeric($_GET['rating']))
{
  $currentRating = $_GET['rating'];
  if(($currentRating < $ratingMin) || ($currentRating > $ratingMax))
  {
    $currentRating = 'non';
  }
}

OpenConnection();

echo GetRatingValueLinks();

GetContentRating();


if($currentRating != 'non')
{
  if($ratingCount > 0)
  {
    if(GetIp() != $ratingLastIp)
    {
      UpdateCurrentRating();
    }
    else
    {
      echo ' Sie haben bereits eine Stimme abgegeben! ';
    }
  }
  else
  {
    InsertNewRating();
  }
}

if($ratingCount > 0)
{
  echo ' Durchschnittliche Bewertung: ' . number_format(($ratingSum / $ratingCount), 2) . ' Stimmen abgegeben: ' . $ratingCount;
}
else
{
  echo ' Es wurde noch keine Stimme zu diesem Content (' . $contentId . ') abgegeben! ';
}

mysql_close();

Am Anfang der Datei erstellen wir ein paar globale Variablen, die den Einstellungen dienen:
  • contentId - Hier können Sie die default-Id angeben
  • currentRating - Diesen Wert müssen Sie auf 'non' lassen
  • ratingMax - Geben Sie an welcher (Bewertungs-)Wert das Maximum ist
  • ratingMin - Geben Sie an welcher (Bewertungs-)Wert das Minimum ist
  • ratingCount, ratingSum, ratingLastIp - Werden im laufe der Ausführung gesetzt
  • server, username, passwort, database - Ihre Verbindungsdaten zur Datenbank

 


Haben Sie diese Einstellungen gesetzt, kommt die eigentliche Logik.
Zuerst werden die contentId und die aktuelle Bewertung aus den Get-Parametern ausgelesen (falls der User eine Bewertung abgegeben hat. Wir achten mittels der is_numeric-Funktion darauf, dass die Werte Numerisch sind. Zusätzlich wird überprüft, ob die aktuelle Bewertung innerhalb der Gültigkeit ist.

Dann öffnen wir die Verbindung zur Datenbank (Hilfsfunktion OpenConnection), geben die Links aus die der User zur Bewertung benutzen kann (Hilfsfunktion GetRatingValueLinks) und befüllen unsere globalen Variablen mit den Bewertungen aus der Datenbank (Hilfsfunktion GetContentRating).

Enthält das currentRating NICHT den Wert 'non' (der Benutzer hat also eine Bewertung abgegeben) UND ratingCount ist größer 0 (es existiert bereits eine Bewertung zu diesem Content), so überprüfen wir, ob die IP des Benutzer gleich wie die der letzten Bewertung ist (Hilfsfunktion GetIp).
Ist Sie das, hat der User bereits eine Bewertung abgegeben und wir geben eine Fehlermeldung aus. Ist es eine andere IP, wird die Bewertung auf der Datenbank mittels Update geändert (Hilfsfunktion UpdateCurrentRating).
Wurde für diesen Inhalt noch keine Bewertung angegeben ratingCount ist somit 0, fügen wir eine neue Zeile in unsere Tabelle ein (Hilfsfunktion InsertNewRating)

Danach wird noch, jenachdem ob eine Bewertung existiert eine Zusammenfassung der Bewertungen ausgegeben und die Connection zur Datenbank geschlossen.

Das wäre die Logik des Programmes. Kommen wir nun zu den Zahlreichen Hilfsfunktionen.

Hilfsfunktion OpenConnection:
function OpenConnection()
{
  global $server, $username, $password, $database;
  if(!mysql_connect($server,$username,$password))
  {
    die('Verbindung konnte nicht hergestellt werden: ' . mysql_error());
  }

  mysql_select_db($database);
}
Dieser Funktion bedarf es keiner besonderen Erklärung. Die globalen Variablen werden mittels global-Schlüsselwort in diesem Kontext nutzbar gemacht und es wird zur Datenbank verbunden.


Hilfsfunktion GetRatingValueLinks:
function GetRatingValueLinks()
{
  global $contentId, $ratingMin, $ratingMax;
  $ratingValueLinks;
  for($i = $ratingMin; $i <= $ratingMax; $i++)
  {
    $ratingValueLinks .= '<a href="/rating.php?contentid=' . $contentId .
 			 '&rating=' . $i . '">' . $i . '</a>&nbsp';
  }

  return $ratingValueLinks;
}

Hier wird, je nach Einstellung, für jede Bewertungsstufe (immer Einser-Schritte) ein Link generiert, den der Benutzer anklicken kann und somit seine Bewertung abgeben kann.


Hilfsfunktion GetContentRating:
function GetContentRating()
{
  global $contentId, $ratingCount, $ratingSum, $ratingLastIp;
  $sql = 'select * from ratings where contentid=' . $contentId;

  $rating = mysql_fetch_object(mysql_query($sql));

  if(isset($rating))
  {
    $ratingCount = $rating->ratingcount;
    $ratingSum = $rating->ratingsum;
    $ratingLastIp = $rating->ratinglastip;
  }
}
In dieser Funktion werden die Globalen Variablen mit den Werten der Datenbank gefüllt.


Hilfsfunktion GetIp:
function GetIp()
{
  $ip;
  if (!isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  {
    $ip = $_SERVER['REMOTE_ADDR'];
  }
  else
  {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  }
  return $ip;
}
Jenachdem ob sich ein Proxy vor dem Benutzer befindet, ist die IP-Adresse unterschiedlich auszulesen.


Hilfsfunktion UpdateCurrentRating:
function UpdateCurrentRating()
{
  global $contentId, $currentRating, $ratingCount, $ratingSum, $ratingLastIp;

  $ratingSum += $currentRating;
  $ratingCount++;
  $ratingLastIp = GetIp();

  $sql = 'update ratings set ratingsum=' . $ratingSum . 
         ', ratingcount=' . $ratingCount . ', ratinglastip=\'' .$ratingLastIp . '\' where contentid=' . $contentId;

  mysql_query($sql);
}
Hier werden die Globalen Variablen mit den neuen Werten gesetzt und anschliessend wird das Rating in der Tabelle per Update bearbeitet und gesichert.


Hilfsfunktion InsertNewRating:
function InsertNewRating()
{
  global $contentId, $currentRating, $ratingCount, $ratingSum, $ratingLastIp;
  $ratingLastIp = GetIp();
  $ratingSum = $currentRating;
  $ratingCount = 1;

  $sql = 'insert into ratings values(' . $contentId . ', 1, ' . $currentRating . ', \'' . $ratingLastIp . '\')';
  
  mysql_query($sql);
}
Ist für die bestimmte Seite noch keine Bewertung vorhanden, so wird mittels Insert eine neue Bewertung in der Tabelle angelegt.
 
Somit hätten wir alle benötigten Hilfsfunktionen zusammen.
Ein produktives Beispiel könnt ihr euch HIER ansehen. Um auf Ratings anderer Inhalte zuzugreiffen, können Sie den Get-Parameter 'contentid' beliebig ändern.


    

 

 

    Veröffentlichen Sie ihre Kommentare ...