Speichern von Werten im User-Objekt?

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
Nuramon
Mitglied
Beiträge: 250
Registriert: 05.02.2012 21:45
Wohnort: Solingen
Kontaktdaten:

Speichern von Werten im User-Objekt?

Beitrag von Nuramon »

Huhu ihr.

Ich bastel im Moment an einem Mod, und da ist mir eine wichtige Frage aufgekommen.
Ich habe eine eigene Datenbanktabelle angelegt, in der werden User-IDs mit zugeordneten Zahlwerten gespeichert.
Jetzt brauche ich an sehr vielen Stellen das Ergebnis, ob ein Datensatz mit Userid->Zahlwert existiert oder nicht.
Bisher mache ich da jedes mal eine kleine SQL-Abfrage mit verknüpfter WHERE-Bedingung.
Die kostet aber sicherlich - trotz dass sie maximal nur ein Ergebnis zurückliefert - Zeit, oder?

Ist es möglich, die zugehörigen Werte im $user-Objekt zu speichern? Oder einfach irgendwo global zu hinterlegen, damit ich sie in fast allen php-Dateien benutzen kann?
dachte an sowas wie

Code: Alles auswählen

if(in_array(5,$user->data['array_list']) 
Danke schonmal für die Hilfe.
(Ich werde sicherlich noch tausende Fragen haben^^)
Das Pinke Forum
Das Pinke Forum - werde Teil einer freundlichen Community, die dir bei Fragen rund um Liebe, Sex, Ernährung, Schule oder bei Problemen aller Art zur Seite steht! Verfasse Beiträge, erstelle Threads und lern nette Leute kennen; kostenlos und toll betreut.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: Speichern von Werten im User-Objekt?

Beitrag von Miriam »

Zum Speichern der Werte kannst Du sicherlich das Objekt $user heranziehen / benutzen.
Meiner Meinung nach ist das aber wenig hilfreich, denn das Objekt enthält nur Daten des angemeldeten Users und nicht des Users allgemein (also nicht des Posters / Members etc. pp.).
Für eine "globale" Lösung könnte es ein guter Ansatz sein, eine entsprechende Funktion in der /includes/functions.php zu definieren, die die Daten in Abhängigkeit von der (abgefragten) User-ID bereitstellt.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
Nuramon
Mitglied
Beiträge: 250
Registriert: 05.02.2012 21:45
Wohnort: Solingen
Kontaktdaten:

Re: Speichern von Werten im User-Objekt?

Beitrag von Nuramon »

Miriam hat geschrieben:Zum Speichern der Werte kannst Du sicherlich das Objekt $user heranziehen / benutzen.
Meiner Meinung nach ist das aber wenig hilfreich, denn das Objekt enthält nur Daten des angemeldeten Users und nicht des Users allgemein (also nicht des Posters / Members etc. pp.).
Für eine "globale" Lösung könnte es ein guter Ansatz sein, eine entsprechende Funktion in der /includes/functions.php zu definieren, die die Daten in Abhängigkeit von der (abgefragten) User-ID bereitstellt.
Was dann aber hieße, dass ich bei jeder Variablenabfrage (die ich dann über die Funktion abwickle) trotzdem eine Datenbankabfrage habe, oder?
Genau das wollte ich ja versuchen zu minimieren.
Ich habe Angst, dass zu viele Datenbankabfragen generell zu viel Zeit kosten...

Generell brauche ich in den meisten Fällen auch wirklich nur die Daten des angemeldeten Users selber, sodass ich dann wohl aus der Tabelle alle Werte mit user_id = $user->data['user_id'] auslesen werde, und genau diese wollte ich als Array im Userobjekt speichern.
Oder ist das generell nicht so sinnvoll?

########

ach mensch, ich erzähle einfach mal meinen Plan, vielleicht wird das dann klarer und ich kriege ein paar Ideen.
Ich bastel im Moment ein Achievement-System und es läuft bisher ziemlich gut, denke ich.
Wenn ein User einen Erfolg bekommt, dann wird seine userID mit der entsprechenden achievementID in der Datenbank gespeichert, in einer extra Tabelle.
Die Überprüfung, ob ein User so einen Erfolg errungen hat, findet an diversen Stellen statt, je nach Erfolg. Zum Besipiel in der posting.php für die Anzahl der Beiträge, etc.
Damit aber nicht jedes mal geguckt wird, ob ein User das Achievement schon hat oder noch schlimmer, ob er es jetzt bekommen würde, wollte ich eben überprüfen, ob das nicht schon erreicht ist und dann den Code einfach überspringen.

Gerade bei etwa 100 geplanten Erfolgen, wo teilweise 20 in einer Datei nacheinander abgearbeitet werden, ist es doch wichtig zu gucken, dass schon erreichte einfach nciht ausgeführt werden, oder?
Das Pinke Forum
Das Pinke Forum - werde Teil einer freundlichen Community, die dir bei Fragen rund um Liebe, Sex, Ernährung, Schule oder bei Problemen aller Art zur Seite steht! Verfasse Beiträge, erstelle Threads und lern nette Leute kennen; kostenlos und toll betreut.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: Speichern von Werten im User-Objekt?

Beitrag von Miriam »

Ob es sinnvoll ist oder nicht, kannst Du nur entscheiden.

Scheibar geht es hier auch um Performance-Fragen: Das User Objekt wird jedes mal erstellt und alle dafür notwendigen SQL Queries werden auch jedesmal ausgeführt. Deiner Idee folgend, würden auch die zusätzlichen SQL Queries für Deine Modifikation jedesmal mit ausgeführt, obwohl das garnicht notwendig ist. Von daher meine ich, daß die Abfrage / Ausführung der Queries performanter ist, wenn sie im Bedarfsfalle ausgeführt werden.
Wenn Du nun noch geschickt Indizes setzt und die Abfragen entsprechend den erwarteten Ergebnissen einschränkst, dann bist Du mit einer separaten Funktion besser beraten.

Ich habe das gerade mal getestet: Ein SELECT in einer DB mit 394285 Einträgen. Es wurden 20727 Einträge zurück gegeben. Insgesamt auerte die Abfrage 0,0007 Sek.
Da sollte der DB Server Deine 20 Ergebnisse relative schnell bereitstellen können.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
Nuramon
Mitglied
Beiträge: 250
Registriert: 05.02.2012 21:45
Wohnort: Solingen
Kontaktdaten:

Re: Speichern von Werten im User-Objekt?

Beitrag von Nuramon »

Miriam hat geschrieben:Ob es sinnvoll ist oder nicht, kannst Du nur entscheiden.

Scheibar geht es hier auch um Performance-Fragen: Das User Objekt wird jedes mal erstellt und alle dafür notwendigen SQL Queries werden auch jedesmal ausgeführt. Deiner Idee folgend, würden auch die zusätzlichen SQL Queries für Deine Modifikation jedesmal mit ausgeführt, obwohl das garnicht notwendig ist. Von daher meine ich, daß die Abfrage / Ausführung der Queries performanter ist, wenn sie im Bedarfsfalle ausgeführt werden.
Wenn Du nun noch geschickt Indizes setzt und die Abfragen entsprechend den erwarteten Ergebnissen einschränkst, dann bist Du mit einer separaten Funktion besser beraten.

Ich habe das gerade mal getestet: Ein SELECT in einer DB mit 394285 Einträgen. Es wurden 20727 Einträge zurück gegeben. Insgesamt auerte die Abfrage 0,0007 Sek.
Da sollte der DB Server Deine 20 Ergebnisse relative schnell bereitstellen können.
Ich kann es leider auch nicht selbst entscheiden ._.
Dafür hab ich zu wenig Programmierpraxis, denke ich, deshalb frag ich hier ja um Hilfe.

Ja, es geht um Performance. Gut, jetzt wo du es sagst... Wir hätten halt bei jedem Seitenaufruf einmal alle Achievements abrufen vs. Achievements einzeln abrufen, und das nichtmal immer alle. Vermutlich ist zweiteres wirklich performanter.

Meinst du mit der Function sowas in der Art?

Code: Alles auswählen

// MOD Achievements
function get_userachievement($user_id, $achievement_id = false)
{
    if($achievement_id != false)
    {
        $sql = 'SELECT *
                FROM
                    phpbb_userachievements
                WHERE
                    achievement_id='.$achievement_id.'
                AND
                    user_id='.$user_id.'';
        $result = $db->sql_query($sql);

        while ($row = $db->sql_fetchrow($result))
        {
            $db->sql_freeresult($result);
            return true;
        }
        $db->sql_freeresult($result);
        return false;
    }
    else
    {
        $sql = 'SELECT *
                FROM
                    phpbb_userachievements
                WHERE
                    userid='.$user_id.'';
        $result = $db->sql_query($sql);

        $achievements = array();
        while ($row = $db->sql_fetchrow($result))
        {
            $achievements[] = $row['achievement_id'];
        }
        $db->sql_freeresult($result);
        return $achievements;
    }
}
// END Achievements  

Aaaah, und gleich die nächste Frage.
Jetzt ist es so, dass es tatsächlich auch Achievements gibt wie "Bekomme 50 Antworten auf ein von dir erstelltes Thema", wo ich das jetzt nicht beim aktiven User selbst im Code überprüfen kann. Gerade weil ich möchte, dass ein User beim Erringen eines Erfolgs direkt ein Popup bekommt...
Wo genau könnte ich so eine Überprüfung dann machen?
Am Besten auch in der posting.php mit topic_author_id?

Dann müsste ich aber noch eine Datenbanktabelle anlegen, wo für jeden User beim Seitenaufruf überprüft wird, ob er ein neues Achievement bekommen hat, damit das dann angezeigt werden kann...
Ach mensch, ich seh schon, viel Arbeit für mich :D
Das Pinke Forum
Das Pinke Forum - werde Teil einer freundlichen Community, die dir bei Fragen rund um Liebe, Sex, Ernährung, Schule oder bei Problemen aller Art zur Seite steht! Verfasse Beiträge, erstelle Threads und lern nette Leute kennen; kostenlos und toll betreut.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: Speichern von Werten im User-Objekt?

Beitrag von Miriam »

ob er ein neues Achievement bekommen hat,
Dazu müßtest Du einen Historie anlegen.
Z.B., indem Du eine Spalte hast displayed_achievement, in der Du das letzte, dem User angezeigte Achievement speicherst und eine Spalte meinetwegen recent_achievement, in der die (in Abwesenheit des jeweiligen Users) neuen aufgelaufenen Errungenschaften gespeichert werden. Wenn dann der User online kommt, vergleichst Du beide Spalten und im Falle einer Anzeige (hervorgerufen durch Ungleichheit) aktualisierst Du die Spalte displayed_achievement.
Kannst es auch anders machen... War nur eine mögliche Idee.

Ein Wort zu Deinem Code (ohne die logische Funktion zu testen):
  • Code: Alles auswählen

        global $db, $config; // sonst kennt die Funktion das Objekt $db nicht und es funktionieren keine DB Abfragen
        if($achievement_id) // wenn sie nicht false ist, wie vorgegeben, dann kann sie nur noch true sein, wenn eine ID übergeben wurde.
        {
            $sql = 'SELECT user_id
                    FROM ' . USER_ACHIEVEMENTS_TABLE . " 
                    WHERE achievement_id = $achievement_id
                        AND user_id = $user_id";
            // Definiere eine Tabelle in der includes/constants.php, hier: USER_ACHIEVEMENTS_TABLE oder benutze $table_prefix,
            // so umgehst Du das Problem frei wählbarere Tabellenpräfixe.
            // Die Notation und Layout der SQL Query erfolgen nach den Vorgaben in der /docs/coding-guidelines.html
            
            $result = $db->sql_query($sql);
    
            $return = ($db->sql_fetchrow($result)) ? true : false; 
            // Du brauchst keine WHILE Schleife, wenn Du nur überprüfen willst, ob es ein Ergebnis gibt oder nicht. 
            // return beendet die Schleife ohnehin.
            $db->sql_freeresult($result);
            return $return;
        } 
Ach mensch, ich seh schon, viel Arbeit für mich
Viel Glück.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“