Userpoints, was ist das, wie geht das?

Begonnen von Andi, 17 Mai 2002, 21:46:30

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

Andi

Userpoints, was ist das, wie geht das? Eine kurze Erläuterung

Da immer wieder die gleichen Fragen auftauchen, will ich hier mal versuchen zu erklären, wie das ganze mit den Userpoints funktioniert.

Die Userpoints der einzelnen User werden aktualisiert, wenn das Modul "Your_Account" aufgerufen wird und die Daten des entsprechenden Users angezeigt werden. Dabei ist es unerheblich, ob der User selbst seine Daten anzeigen lässt, oder ob ein anderer User dessen Daten ansieht.
Die Aktualisierung geschieht durch den Aufruf mehrer sql-Abfragen an die Datenbank.

Nachfolgend der entsprechende Code im Modul Your_Account+:

$result = sql_query("select ratingdbid from $prefix"._downloads_votedata." where ratinguser='$uname'", $dbi);
$downloads = sql_num_rows($result, $dbi);
$result = sql_query("select tid from $prefix"._pollcomments." where name='$uname'", $dbi);
$umfragen = sql_num_rows($result, $dbi);
$result = sql_query("select ratingdbid from $prefix"._links_votedata." where ratinguser='$uname'", $dbi);
$links = sql_num_rows($result, $dbi);
$result = sql_query("select tid from $prefix"._comments." where name='$uname'", $dbi); #kommentare
$kommentare=sql_num_rows($result, $dbi);
$result = sql_query("select sid from $prefix"._stories." where informant='$uname'", $dbi); #ariktel
$artikel=sql_num_rows($result, $dbi);
$resultx=sql_query("select uid from $user_prefix"._users." where uname='$uname'", $dbi);
$gbu=sql_fetch_array($resultx, $dbi);
$uid=$gbu["uid"];
$resultgb1=sql_query("select gid from $prefix"._userguest." where wer='$uname'", $dbi);
$gb1 = sql_num_rows($resultgb1, $dbi);
$resultgb2=sql_query("select gid from $prefix"._userguest." where touser='$uname'", $dbi);
$gb2 = sql_num_rows($resultgb2, $dbi);
$result= sql_query("select pid from $prefix"._xmb_posts." where author='$uname'", $dbi);
$fposts=sql_num_rows($result, $dbi);
$result= sql_query("select tid from $prefix"._xmb_threads." where author='$uname'", $dbi);
$fthreads=sql_num_rows($result, $dbi);
$userpoints=($artikel*5)+($kommentare*1)+($fposts*2)+($fthreads*3)+($gb1*2)+($gb2*1)+($umfragen*2)+($downloads*2)+($links*2);


Der Reihe nach:


?   $result = sql_query("select sid from $prefix"._stories." where informant='$uname'", $dbi); #ariktel

Das z.B. ist der Funktionsaufruf der Abfrage, welche die Tabelle nuke_stories ( $prefix"._stories." ) ausliest. In dieser Tabelle sind die Artikel gespeichert.
Die eigentliche sql-Abfrage ist der Sting "select sid from $prefix"._stories." where informant='$uname'" .
Das Feld "sid"  definiert die eindeutige ID des Datensatzes.
Der String  " where informant='$uname'" ist die Bedingung, dass nur diese Artikel ausgelesen werden, welche von dem entsprechenden User geschrieben wurden. Der Username ist in der Variablen $uname gespeichert, welche am Anfang des Scripts als Parameter übergeben wird. Die Ergebnismenge der Abfrage wird dann in der Variablen $result gespeichert
Die Abfrage selbst wird in der Funktion sql_query() ausgeführt. Diese Funktion ist in der Datei /includes/sql_layer.php definiert. (Hierzu weiter unten noch etwas!)


?   $artikel=sql_num_rows($result, $dbi);
Hier wird jetzt die vorher ermittelte Ergebnismenge aller gefundenen Datensätze (Artikel) der Funktion sql_num_rows() übergeben.
Diese Funktion ist wieder in der besagten sql_layer.php definiert. Sie macht nichts anderes, als die Anzahl der Datensätze zu ermitteln und diese Anzahl als Funktionswert wieder zurückzugeben. Dieser Funktionswert wird dann in der Variablen $artikel zwischengespeichert.

!   Also: Es wird die Anzahl der Artikel gezählt, die der entsprechende User geschrieben hat.



?   $userpoints=($artikel*5)+($kommentare*1)+($fposts*2).............;

Am Ende des Codes haben wir jetzt mehrere gefüllte Variablen ($umfragen, $artikel, $fthreads, usw.). Diese werden jetzt jeweils mit einem Punktefaktor multipliziert, dann alles zusammengezählt und in der Variablen $userpoints gespeichert.
Eine ganz einfache Rechnung:
Userpunkte = (Anzahl Artikel * 5 Punkte) + (Anzahl Kommentare * 1 Punkte) + (Anzahl Forumbeiträge * 2 Punkte) + .... usw.

!   Diese Punktzahl wird dann, (weiter unten im Code) in der Tabelle nuke_userpoints für den entsprechenden User eingetragen. Das wars.


Fehlersuche:
Im Zusammenhang mit den Userpoints und dem Your_Account Modul entsteht eigentlich immer der gleichen Fehler:
    Warning: Supplied argument is not a valid MySQL result resource
    in /blablabla/htdocs/includes/sql_layer.php on line 235

-Was bedeutet das?
Ganz einfach, die Lösung steht eigentlich schon da, nur kann sie niemand richtig interpretieren.
Wir haben oben gesagt, dass die Datenbankabfragen in der Datei sql_layer.php ausgeführt werden. Tritt bei der Ausführung dieser Abfrage ein Fehler auf, gibt PHP eben genau diese Fehlermeldung aus.

-Na und jetzt?
Im Bezug auf das bereits gesagte, kann es hier nur einen Fehler geben. Eine Tabelle die bei der Generierung der Userpoints aufgerufen wird, kann nicht gefunden werden.

-Welche Tabelle fehlt denn?
Im Your_Account Modul stehen (wie oben) die ganzen Abfragen nacheinander aufgelistet. Schaut z.B. mit phpMyadmin nach, welche, der in den Abfragen aufgerufenen Tabellen wirklich in Eurer Datenbank vorhanden sind und welche nicht.

- was Machen?
Dann kommentiert Ihr die, diese fehlenden Tabellen betreffenden, Codezeilen mit einem Doppelkreuz (#) aus.

- Beispiel:
die Tabelle nuke_xmb_posts fehlt, dann müssten die entsprechenden Zeilen so aussehen
    #$result= sql_query("select pid from $prefix"._xmb_posts." where author='$uname'", $dbi);
    #$fposts=sql_num_rows($result, $dbi);
Die weitere Berechnung ( + (Anzahl Forumbeiträge * 2 Punkte) ) kann unverändert bleiben. Die Variable $fposts wird von PHP automatisch mit 0 belegt. 0 * 2 Punte, ergibt ja null und wird somit einfach beim Rechnen ignoriert.

Dieses Vorgehensweise müsst Ihr solange wiederholen, bis alle fehlenden Tabellen "eliminiert" sind.


Erweiterung:

Das System müsste jetzt eigentlich klar sein, eine Erweiterung ist ganz einfach möglich.
Nehmen wir ein oft gefragtes Beispiel, den Kalender. Die Daten des Kalenders sind in der Tabelle nuke_events gespeichert. In dieser Tabelle wird der Username im Feld informant  gespeichert, der eindeutige Datensatzbezeichner ist das Feld eid .

-Die sql-Abfrage müsste also wie folgt definiert werden:
    "select eid from $prefix"._events." where informant='$uname'"
-Die komplette Zeile zum ermitteln der Ergebnismenge:
    $result=sql_query("select eid from $prefix"._events." where informant='$uname'", $dbi);
-Und die nächste Zeile zum Berechnen der Anzahl und belegen einer neuen Variablen " $Termine ":
    $Termine=sql_num_rows($result, $dbi);
-Diese beiden neuen Zeilen fügen wir, direkt vor der Berechnung der userpoints ( $userpoints=..... ), in den Code ein.
-Die Zeile der Berechnung selbst, erweitern wir noch um den kurzen Rechenstring " +($Termine*2) "
 Die Zeile sieht dann so aus:
  $userpoints=($artikel*5)+($kommentare*1)+($fposts*2)+($fthreads*3)+($gb1*2)+($gb2*1)+($umfragen*2)+($downloads*2)+($links*2)+($Termine*2);
 Hier unbedingt auf das abschliessende Semikolon achten. Das Semikolon ist für PHP, das Zeichen, dass diese Befehlszeile abgeschlossen ist.
-Fertig, das wars schon.
Jeder User, der einen Termin posted, bekommt jetzt 2 Punkte auf sein "Konto" gutgeschrieben.

Der User soll mehr oder weniger Punkte für einen Beitrag bekommen?
Kein Problem, die Berechnung ist ja klar. Soll er für einen Artikel anstatt 5 nur 3 Punkte bekommen, dann ändert einfach den Punktefaktor in der Berechnung: aus $artikel*5 wird $artikel*3 .


Diese Erweiterungen kann man im Prinzip auf alle Daten anwenden, in denen der Username in der zugehörigen Tabelle erfasst ist.
So ist es auch problemlos möglich, ein anderes Forum in die Userpoints mit einzubeziehen. Einfach in den zugehörigen Tabellen nachsehen, wo der Username zu den Postings abgespeichert ist und diese Tabelle nach dem obigen Schema einbasteln.

In manchen Tabellen wird evtl auch die User-ID (uid) des Users abgespeichert. Auch diese Tabellen kann man einbauen.
Die sql-Abfrage müsste dann ungefähr so lauten:
    select xxid from $prefix"._dietabelle." where dieuid='$uid'
Die Variable $uid wird im Code aus der Tabelle nuke_users ermittelt (Vielleicht ist es ja aufgefallen, dass oben eine Abfrage im Code steht, die eigentlich nicht in diese Reihenfolge gehört :-))


Ich hoffe, wir haben die Sache mit den verflixten Userpoints geklärt und Ihr könnt Euch selbst etwas weiterhelfen.

cu Andi

-----------------------------------------

Noch ein Tip zum Weiter/Nachdenken:

Die Abfragen etc. sind hier nicht optimal gelöst.
Es muss pro Tabellenabfrage 2 mal der sql-Server angesprochen werden und in der Abfragedefinition ist eigentlich ein PHP-Syntaxfehler den PHP aber, gutmütig wie es ist, ausbügelt.

Besser ist hier folgendes:

 $result = sql_query("select count(eid) from ".$prefix."_events where informant='$uname'", $dbi);
list($Kalender) = sql_fetch_array($result, $dbi);

Die Anzahl wird direkt in der sql-Abfrage berechnet, und der Teilstring "_events"  gehört eigentlich in den String der Abfragedefinition.
schön´s Grüssle, Andi