SQL Abfragen in Klassen

Valkyri

Grünschnabel
Hallo,

ich bin hier relativ neu in dem Forum, gelesen habe ich als unregestrierter user viel, geschrieben noch nie. Ich befasse mich seit einiger Zeit (5-6 Jahre) mit php, jedoch eher als Hobby, immer mal wieder ein wenig, momentan bin ich dabei eher für "lernzwecke" ein kleines Browsergame zu programmieren, dabei habe ich eine Klasse welche die daten des Spiele accounts verarbeitet, zb. Resourcen und Truppen ect. pp. diese stehen in einer Datenbank, die ungefähr so aussieht:

Code:
GUID   | Name  |  res1  | res2 | actionId  | actionEnd | [...] |
-------|-------|--------|------|-----------|-----------|-------|
1      | Alf   | 1500   | 150  |     1     | 156489756 | [...] |
2      | Joh   | 3251   | 356  |     5     | 156489698 | [...] |
3      | Alex  | 2156   | 666  |     9     | 156485768 | [...] |
4      | Bernd | 9563   | 574  |    12     | 156486987 | [...] |
5      | Karl  | 6351   | 635  |     1     | 156489990 | [...] |
(nur so als beispiel, sie sieht nicht ganz so aus...)

nun gibt es 3 möglichkeiten für mich (die mir einfallen).

1. Ich lade die komplette Spalte des Benutzers bei der Initzialisierung ein, und habe alle daten parat wenn Sie gebraucht werden.
Nachteil: Lädt leider auch daten die natürlich nicht gebraucht werden (zb. wenn er auf einer Seite ist wo die resourcen nicht angezeigt werden habe ich Sie trotzdem mit geladen - unnütze SQL belastung mmn.)
Vorteil: Nur eine "SELECT" abfrage, alle anderen DB querys währen dann UPDATE / INSERT / DELETE, jenach spalte, sehr einfach zu "warten"

oder

2. Ich lade für jede Seite spezifische Daten, zb. mit $a->getRes(); gibt es eine DB abfrage welche nur die res1, res2, res3 betrifft, rest lässt er dann aussen vor!
Nachteil: ggf. viele Abfrage, wenn man viel wissen muss für die Seite!
Vorteil: es wird nicht viel mehr geladen als notwendig!, relativ einfach zu warten im betrieb


3. eine Klasse für Datenbank zugriffe schreiben, welche die benötigten daten sammelt und dann eine variable Datenbank abfrage macht!
Vorteil: Nur eine Datenbank abfrage, nur die Daten die man benötigt.
Nachteil: mmn. sehr fehleranfällig, es muss nur eine andere Klasse kommen die etwas braucht was man gerade nicht beachtet hat und es entstehen fehler UND es ist sehr wartungsintensiv, da man bei jeder seite egenau schauen muss was gebraucht wird, bevor man es lädt!



was denkt Ihr währe am sinnvollsten oder gibt es methoden die ich so noch nicht bedacht habe

mfg
Valkyri
 
Ich bin zur Zeit selbst dabei, ein Browsergame zu programmieren und mache mir seit langem über die selbe Frage Gedanken.

Unter "Coders-Talk" findest du meine derzeitige Lösung. Ich lade beim Login alle Daten des Users in meine Klasse. Die Klasse wird dann serialisiert in die Session gespeichert und dann von dort aus immer aufgerufen. So habe ich für die Daten jeweils nur eine Datenbankabfrrage pro Session.

Ich wurde hier von Wolfsbein aber auf eine Sache hingewiesen, dass die Session möglicherweise langsamer(?) ist, bzw. der Speicher der selben natürlich sehr klein ist. Die größe ist in meinem Fall aber uninteressant, da ich nur wenige (atm 2) Klassen so speichere.
 
Das ist eine Interessante Idee, die kompletten daten in die Session zu laden und nur UPDATE, INSERT und DELETE über abfragen zu machen, darauf bin ich noch nicht gekommen ;)

ich danke erstmal für die anregung, ich werd mir deinen thread im Coders Talk mal zu gemüte führen ;)
 
Ich hätte dann auch noch eine Lösung: ich habe eine eigene Sessionverwaltung geschrieben, in welcher ich die Sessiondaten als serialisiertes Array speichere. An diesem Objekt kann man Änderungen vollziehen, welche gespeichert werden. Diese werden mit den bisherigen Daten verglichen und somit wird erst am Ende (im Destruktor) die Datenbank abgefragt. Heißt: wenn es keine Änderungen gibt, gibt es keine Datenbankabfragen.
 
  • Gefällt mir
Reaktionen: Joe
Ich hätte dann auch noch eine Lösung: ich habe eine eigene Sessionverwaltung geschrieben, in welcher ich die Sessiondaten als serialisiertes Array speichere. An diesem Objekt kann man Änderungen vollziehen, welche gespeichert werden. Diese werden mit den bisherigen Daten verglichen und somit wird erst am Ende (im Destruktor) die Datenbank abgefragt. Heißt: wenn es keine Änderungen gibt, gibt es keine Datenbankabfragen.

benutzt du dafür serialize() oder hast du deine eigene funktion zum serializieren gebaut?


bzw. gibt es eine möglichkeit eine instanz einer Klasse von einer seite zur nächsten weiter zu geben, dann bräucht man nur bei dem __construct() die daten aus der DB lesen und wenn änderungen kommen nur speichern und in der Klasse abändern!
 
Zuletzt bearbeitet:
Dann muss ich doch einmal fragen, da ich selbst nie mit serialize() gearbeitet habe, wo ist dervorteil? warum soll ich das net einfach in ein Multidimensionales $_SESSION Array speichern, wenn es serialized eh da rein kommt, wo ist da der vorteil?
 
Wie gesagt: ich speichere meine Daten nicht in dem PHP-eigenen Sessionsystem, sondern speichere meine Daten in eigenen Sessiondateien, weshalb bei denen nicht die Möglichkeit besteht, dass ich Arrays einfach so speichern kann. PHP übernimmt das normalerweise selber, deshalb siehst du das nicht.
 
Ah okay,

ich werde mal schauen wie ich es praktiziere am ende, ich werde es generell so schreiben das ich es leicht abändern kann, fals das von mir gewählte System nicht klappt.

ich werde ein gemischtes System anstreben, wo die wichtigsten Daten jedesmal geladen werden (zb. Resourcen/ Schiffe ect. pp.), da sich diese Punkte schnell verändern können, Ausbaustufen der Gebäude/Forschungen/Account Namen/Planeten Namen ect. werde ich in der Session Cachen, und nur neu Abfragen wenn es wirklich notwendig ist (bei Ausbau oder ähnlichem), damit bleiben die wichtigsten Daten immer zu 100% korrekt, aber der Datenbank Transfer wird minimiert!
 
Zurück