Variablen weitergeben - eleganteste Art

Hallo Leute,

mein Problem beginnt schon bei der Unterforen-Wahl :slight_smile:

Und zwar habe ich eine SQL-Abfrage, bei dem die Informationen zu einer Gruppe ausgegeben werden.
Über eine Button „bearbeiten“ gelangt der Nutzer in die Seite zum bearbeiten.
Da ich hier nicht nochmal alle Werte abfragen möchte, weil ich dies ja zuvor bereits tat, möchte ich diese weitergeben.

Nur was ist da der sinnvollste Weg? Einfach alles Infos durch die URL weitergeben?
Sessions und Local.storage wäre ja auch denkbar, sowie die Variablen via JS zu übermitteln.

Wie macht ihr das so?

Auf jeder neuen Seite (bei jeder Request) neu abfragen.
Alles andere wäre ein schwerwiegendes Sicherheitsproblem.

Grundregel Nummer 1:
Traue nie dem Client.

Okay, dann geht es nicht anders.
Ich habe halt nur Angst, dass die Server irgendwann zu langsam werden könnten und wollte von vornherein die Abfragelast verringern.

Solange du nicht Imense Mengen an Daten hast, wird sowas bei jedem normalen DBMS nicht auftreten. Zudem wirst du ja kaum immer alle Daten brauchen.

Nein, immer nur Teilmengen.
Aber das kleine Projekt, an dem ich arbeite, wird entweder der totale Flopp (wäre auch egal, weil die Kosten trotzdem erstmal gering sind) oder aber ich habe rasend schnell neue Nutzer, die zwar alle immer nur einzelne kleine Abfrage machen, aber Kleinvieh macht bekanntlich ja auch Mist.
Und nichts ist ärgerlicher als, als in der heutigen Zeit mehrere Sekunden auf einen Seitenaufbau zu warten.

Mist, jetzt kann ich meinen alten Beitrag weder bearbeiten noch löschen …

Und zwar möchte ich folgendes erreichen:
die Variablen, die ich durch die Datenbank-Abfrage erhalte, sollen irgendwie in globale Variablen umgewandelt werden, so dass ich diese sowohl mit PHP als auch mit javscript weiterverarbeiten kann.

Beispiel:
Ich rufe meine Profildaten ab, bspw. Vorname.
Dann gehe ich auf eine andere Seite, die soll sich die globale Variable holen und mir bspw. „Hallo Bourbon“ auswerfen.
Meine Versuche sind bisher grandios gescheitert.
So wollte ich bspw. eine globale Variable mit einem Titel erstellen und zum test in einer anderen Datei ausgeben:
[PHP]$GLOBALS[„var_titel“]= $var_titel;[/PHP]
hier dann die Ausgabe in der anderen php-Datei:
[PHP] echo $GLOBALS[„var_titel“];[/PHP]
aber nichts funktioniert … grr

Ich glaube, du suchst Sessions

Wenn du etwas über mehrere Seiten „behalten“ willst, musst du $_SESSION verwenden.

Das soll jedoch nicht heißen, dass dein Vorhaben gut ist.
Aber ich denke, das wirst du dann schon noch merken.

Wenn du unbedingt meinst du musst Daten cachen, dann mach das clientseitig.
Serverseitig bringt dir das nichts - außer Probleme.

ja, mit Sessions hat es bisher auch immer gut funktioniert, leider gibt es da in Zusammenhang mit dem Framework7 einige Probleme, daher wollte ich bestimmte Teile eher clientseitig cachen.

Wo genau besteht das Risiko? Die Daten werden ja nur gelesen und nicht weiter verarbeitet. Macht es einen Unterschied, ob ich die Variable $titel nun aufgrund der erneuten DB-Abfrage angezeigt bekomme oder dadurch, dass sie gecached habe, weil die vorher eh schon abgefragt wurde?

Anmerkung:

Vielen Dank schon mal für die sehr hilfreiche Antwort. Als ich den Name gelesen habe, hatte ich erst einmal ein mulmiges Gefühl, wurde aber angenehm überrascht und weiß dies zu schätzen :wink:

Nicht an den Symptomen basteln, die Ursache beseitigen! Warum sollten damit keine Sessions funktionieren?

Ja klar, ich bin ja immer noch an der Sache mit den Sessions dran.
So richtig weiß noch nicht einmal der Macher vom Framework7, warum das so nicht geklappt.
Auch wenn es hier vielleicht nicht hin gehört, aber ich kann ja mal kurz das Problem beschreiben.

Ich sehe meine Gruppenübersicht, dann klicke ich auf eine Gruppe und erstellte eine Session mit der Gruppen-ID. Will ich dann die Gruppendetails bearbeiten, werde ich wiederum weitergeleitet und frage die DB nochmals ab, wobei ich dann ja die Gruppen-ID brauche.
Und nun zum Problem:
Die Gruppen-ID wird nicht erneuert. Klicke ich auf irgendeine andere Gruppen, bleibt der Werte der Session trotzdem immer gleich.
Erst, wenn die komplette Seite neugeladen wird (durch drücken von F5), kann der Session ein neuer Wert hinzugefügt werden.

Schön beschrieben, aber das hilft uns hier nicht weiter. Da wird wohl ein Fehler in den Scripten sein, aber die kennen wir nicht.

Weiß nicht ob das das Problem ist, aber laut http://www.idangero.us/framework7/docs/init-app.html#.VRFjAnralW8 hat Framework7 einen Cache. Wäre naheliegend dass damit das Problem zusammenhängt.

Ja das hängt auch mit dem Cache zusammen, leider klappt nur das cache-ignore: true nicht.
Hey ich wollte jetzt gar nicht bezwecken, dass ihr jetzt mit darüber schaut.
Mir ging es jetzt nur im die globalen Variablen.

Ich glaube du unterschätzt die Datenbank bzw. die Server Performance mächtig oder ich habe dein Anliegen falsch verstanden.

So wie ich das verstanden habe, machst du eine Datenbank Abfrage, um alle Gruppen in der Übersichtsseite anzuzeigen. Nun möchtest du auf „Gruppe editieren“ klicken und auf der neuen Seite keine weitere Abfrage mehr machen, sondern am Besten die Daten von vorhin mitnehmen.

Globals würde ich schon einmal empfehlen zu vergessen. 1. sind die nur zur Laufzeit gültig und 2. Bad-Practice.
Sessions würden gehen, aber sind auch Bad-Practice. Mit Sessions solltest du nur wirklich IMMER wieder kehrende Sachen speichern wie z.B. Username oder irgendwelche Werte die du später mal für checks brauchst.

Statt in den SQL-Abfragen zu sparen, solltest du lieber auf eine performante Query setzen.

Statt:

$sql = $db->query( 'SELECT * FROM ..' );
$fetch = $sql->fetch();
$sql2 = $db->query( 'SELECT * FROM .. WHERE .. = ' . $sql['.._id'] );
$fetch2 = $sql2->fetch();

solltest du lieber die volle Macht ausnutzen, auch wenn die Faulheit einem was anderes sagt.

$query = $db->query( 'SELECT id, name, .. , .. FROM groups JOIN [...] ON ( groups.id = [...].group_id )  );
$groups = $query->fetch_all();

// Die "Gruppe Editieren" Seite hat dann als $_GET Variable die Gruppen ID und mach selbst eine Query, statt die von vorhin, also von der anderen Seite, mitzunehmen..
$group_id = intval( $_GET[ 'group_id'] );
$query = $db->prepare( 'SELECT id, name, .. , .. FROM groups JOIN [...] ON ( groups.id = [...].group_id ) WHERE groups.id = :group_id );
$query->execute( array( ':group_id' => $group_id ) );
$group = $query->fetch();

Also selbst wenn du ALLE Spalten auswählst, nicht „*“ verwenden.
Bei Relationen mit anderen Tabellen (LEFT/RIGHT/INNER) JOIN verwenden, auch wenn es anfangs kompliziert aussieht, ist es relativ einfach zu verwenden und SEHR mächtig! Dadurch senkt man die Anzahl der Queries und kann die Vorteile der schnellen Datenbanken ausnutzen.

Wenn du dich daran halltest, sollte es nicht im Geringsten etwas ausmachen, dass du zwei Queries mit ähnlichen Inhalten auf zwei unterschiedlichen Seiten machst. Besser als die Daten als Sessions zu übergeben oder anderweitig…

gruß

Also wenn ich dich und deinen Code richtig verstanden habe, solle ich das so machen.

DB-Abfrage aller Gruppen eines Benutzers.
Danach DB-Abfrage der Details zur einer Gruppe mit der Group-ID X (Bedingung, dass Nutzer Mitglied ist)
auf der Editieren-Seite nochmal eine DB-Abfrage mit Group-ID X (selbe Bedingung).
Falls du das genau so meinst, dann mache ich das bisher auch so.

Ich gebe die Group-ID von der groupdetails.php via URL an die groupdetails_edit.php?group-ID=X weiter und start da eine neue DB.

Okay, jetzt haben mir mehrere Leute bestätigt, dass die Datenbank das schafft.
Vielleicht habe ich die wirklich immer unterschätzt. :slight_smile:

Prinzipiell halt so viele Queries wie man Daten braucht, aber nach Möglichkeit reduzieren.
D.h. wenn du einmal die Gesamten User anzeigen lassen willst und die Gesamten Gruppen, dann hast du eben 2 Queries. Willst du aber die Gesamten Gruppen in der ein User drinnen ist, kannst du die Beziehung zwischen beiden ausnutzen und daraus eine einzige Query machen, indem du JOINs verwendest.

Letztens habe ich erst mit nur einer Query 4 unterschiedliche Tabellen miteinander verknüpft und konnte so sämtliche Daten bekommen und das in einer sehr kurzen Zeit.

Die Query sah dann auch dementsprechend etwas Komplex aus, aber wenn man die Query Schritt für Schritt aufbaut, ist es gar nicht so schwer und wenn man es erst einmal kapiert hat, kommt man sogar in einer komplexen Query zu Recht.

Lg

Okay, genauso verfahre ich auch.
Bspw. habe ich eine Tabelle für die Account-Daten
eine Tabelle, in denen die ganzen Gruppeninformationen stehen
und eine dritte Tabelle, in der den einzelnen Gruppen-IDs die IDs der jeweiligen Nutzer zugeordnet werden