Inhalt via XMLHttpRequest tauschen -> Datenbankzugriff PHP
Jonas
- javascript
Hi,
ich schreibe derzeit an einer Bildergalerie. Beim Laden der landing page (bestehend aus einem Login-Formular) werden, sofern Javascript eingeschaltet ist, hidden input fields mit JS relevanten Daten gefüllt und im nachfolgenden Skript (PHP), nach erfolgreichem Login, in eine Session geschrieben. D.h. ich weiß jederzeit, ob Javascript eingeschaltet ist und kann dementsprechend verschiedene Versionen meiner Seiten bereitstellen.
Bei eingeschaltetem Javascript würde ich die Inhalte gerne on-the-fly austauschen lassen. Hierzu verwende ich derzeit folgende Methode:
Die Links meiner Navigation werden beim Laden des Userbereichs mit einem onClick-Event ausgestattet, welches via XMLHttpRequest die entsprechende Sektion lädt. Bei den einzubindenden Inhalten handelt es sich um PHP-Skripte, die auf eine Datenbank zugreifen.
Nun zu meinem Problem:
Beim Laden des Userbereichs wird ein Datenbankobjekt in PHP erstellt. Wenn ich nun den Inhalt dynamisch per Javascript tausche, steht dieses Objekt im angeforderten PHP-Skript natürlich nicht mehr zur Verfügung, da das zu ladende PHP-Skript in den bereits verarbeiteten Userbereich geladen wird. Somit habe ich keinen Zugriff auf meine Datenbank.
Derzeit verwende ich folgende Lösung: Die einzelnen Inhalte meiner Seite (PHP-Skripte, die Datenbankzugriff benötigen) werden geparsed und mittels ob_start()
, ob_get_contents()
in den Cache geschrieben. Aus dem Cache wird dann eine HTML-Seite erstellt und auf dem Server abgelegt. Diese kann ich per XMLHttpRequest laden.
Die Lösung finde ich persönlich sehr unschön, da ich ziemlich unflexibel innerhalb meiner Seiten bin. Bspw. kann ich nicht oder nur begrenzt auf Usereingaben (Formulare, z.B. Filtern von angezeigten Fotos usw.) reagieren, ohne eine neue, statische HTML-Seite schreiben zu lassen, um diese zu laden.
Hat evtl. jmd. einen Ansatz für mich, wie ich dieses Problem etwas eleganter lösen könnte?
Ich hoffe ich habe den Schwerpunkt meines Problems richtig erkannt und somit den passenden Themenbereich gewählt :)
Vielen Dank im voraus und beste Grüße,
Jonas
hi,
Hat evtl. jmd. einen Ansatz für mich, wie ich dieses Problem etwas eleganter lösen könnte?
Was fürn Problem? Mit einer zweckmäßigen Kontrollstruktur in _einem_ Script kannst Du praktisch alles machen, vom Sessionaufbau über DB-Anbindung, Objekterstellung bis hin zur Ausgabe komletter HTML-Seiten mit Login-Formularen oder Responsen für Ajax.
Hotti
Was fürn Problem? Mit einer zweckmäßigen Kontrollstruktur in _einem_ Script kannst Du praktisch alles machen, vom Sessionaufbau über DB-Anbindung, Objekterstellung bis hin zur Ausgabe komletter HTML-Seiten mit Login-Formularen oder Responsen für Ajax.
Ich bin icht sicher ob ich dich richtig verstehe. Du meinst ich sollte meine Seite in einem Skript organisieren? Inklusive Login, Userbereich usw.?
Natürlich ist das mit einigen Kontrollstrukturen möglich, auch das Problem mit der Datenanbindung würde sich lösen. Allerdings müsste ich doch zum Wechseln des Inhalts wieder das gesamte Skript neu laden oder nicht? Spätestens wenn Usereingaben ins Spiel kommen, die Datenbankabfragen erfordern, müsste ich komplett neu laden. Das möchte ich nach Möglichkeit vermeiden.
hi,
.. wenn Usereingaben ins Spiel kommen, die Datenbankabfragen erfordern, müsste ich komplett neu laden. Das möchte ich nach Möglichkeit vermeiden.
Natürlich wird bei Benutzereingaben (Parameter) ein neuer Prozess gestartet. Es sei denn, der läuft schon (FastCGI). Dann hast Du zwei Möglichkeiten, entweder wird eine komplett neu aufgebaute Seite als Response zum Browser geschickt oder nur die Objekte, die in eine bereits ausgelieferte Seite eingebaut werden sollen (Ajax). Auf meiner HP findest Du genügend Beispiele, wo beides geht und auch die Erläuterungen dazu.
Hotti
...oder nur die Objekte, die in eine bereits ausgelieferte Seite eingebaut werden sollen (Ajax). Auf meiner HP findest Du genügend Beispiele, wo beides geht und auch die Erläuterungen dazu.
Hi,
vorerst vielen Dank für deine Antworten. Ich werde mich gleich mal ein wenig umschauen.
Viele Grüße,
Jonas
Gerne schreib ich noch was dazu.
In meinen Scripts mit DB Anbindung prüfe ich, bevor überhaupt was ausgegeben wird, ob das DBHandle erstellt werden kann, wenn nicht, wird auf eine Fallback-Seite umgeleitet.
Andernfalls bekäme ein Benutzer erst nach dem Abschicken eine Fehlermeldung, das wäre fies, zuerst ein Eingabeform zu zeigen und erst dann zu prüfen.
Ein Formular, was ich zum Browser schicke, wird in einer eigenen Sub erstellt und bekommt eine Sammlung von Parametern übergeben, die Sammlung ist ein Objekt und das sieht ganz genauso aus, wie das Objekt, was in einer Ajaxresponse gesendet wird, Pseudocode:
if(CGI-Parameter)
erstelle Objekt mit den Eingaben
sende Formular mit dem Objekt
elseif(Ajax-Parameter)
erstelle Objekt mit den Eingaben
sende Objekt
Hier siehst Du schon, es gibt da was zu kürzen, z.B. so
if(überhaupt Parameter)
erstelle Objekt mit den Benutzereingaben
if(soll die ganze Seite geschickt werden)
print headers, form(object), footer;
elsif(soll das ne AjaxResponse sein)
print headers, object;
else
print headers, html;
Viele Grüße,
Horst Haselhuhn
Gerne schreib ich noch was dazu.
In meinen Scripts mit DB Anbindung prüfe ich, bevor überhaupt was ausgegeben wird, ob das DBHandle erstellt werden kann, wenn nicht, wird auf eine Fallback-Seite umgeleitet.
Andernfalls bekäme ein Benutzer erst nach dem Abschicken eine Fehlermeldung, das wäre fies, zuerst ein Eingabeform zu zeigen und erst dann zu prüfen.
Ein Formular, was ich zum Browser schicke, wird in einer eigenen Sub erstellt und bekommt eine Sammlung von Parametern übergeben, die Sammlung ist ein Objekt und das sieht ganz genauso aus, wie das Objekt, was in einer Ajaxresponse gesendet wird, Pseudocode:
if(CGI-Parameter)
erstelle Objekt mit den Eingaben
sende Formular mit dem Objekt
elseif(Ajax-Parameter)
erstelle Objekt mit den Eingaben
sende ObjektHier siehst Du schon, es gibt da was zu kürzen, z.B. so
if(überhaupt Parameter)
erstelle Objekt mit den Benutzereingaben
if(soll die ganze Seite geschickt werden)
print headers, form(object), footer;
elsif(soll das ne AjaxResponse sein)
print headers, object;
else
print headers, html;Viele Grüße,
Horst Haselhuhn
Hi,
danke für deine Mühe. Allerdings habe ich mich dafür bislang zu wenig mit CGI beschäftigt. Evtl. liegt es daran, dass mir die Lösung für meine Bedürfnisse nicht als optimal erscheint.
Viele Grüße,
Jonas
Moin!
ich schreibe derzeit an einer Bildergalerie. Beim Laden der landing page (bestehend aus einem Login-Formular) werden, sofern Javascript eingeschaltet ist, hidden input fields mit JS relevanten Daten gefüllt und im nachfolgenden Skript (PHP), nach erfolgreichem Login, in eine Session geschrieben. D.h. ich weiß jederzeit, ob Javascript eingeschaltet ist und kann dementsprechend verschiedene Versionen meiner Seiten bereitstellen.
Kannst du machen, solltest du aber lassen. Wenn du mit Javascript automatisch und grundsätzlich an deine Bedienelemente Aktionen ranhängst, und die Bedienelemente so gestaltest, dass sie auch ohne Javascript eine sinnvolle Aktion ausführen, brauchst du keine zwei Seitenversionen zu beachten.
Die per Javascript gestarteten Aktionen verhindern dann einfach, dass die Standard-Aktion, die sich aus dem HTML ergibt, ausgeführt wird, um nicht doppelte Arbeit zu tun.
Nun zu meinem Problem:
Beim Laden des Userbereichs wird ein Datenbankobjekt in PHP erstellt.
Dieses Objekt lebt nicht lange - nur bis zum Skriptende dieses einen Seiten-Requests. Du musst das Objekt also sowieso bei reiner HTML-Navigation für jeden Request neu erstellen.
Wenn ich nun den Inhalt dynamisch per Javascript tausche, steht dieses Objekt im angeforderten PHP-Skript natürlich nicht mehr zur Verfügung, da das zu ladende PHP-Skript in den bereits verarbeiteten Userbereich geladen wird.
Hier ist dein Denkfehler: Dein Request (egal ob Ajax oder sonstwie) erfordert DB-Zugriff, also mach dir das Objekt neu und greife auf die DB zu.
Somit habe ich keinen Zugriff auf meine Datenbank.
Deine eigene Schuld. :)
Derzeit verwende ich folgende Lösung: Die einzelnen Inhalte meiner Seite (PHP-Skripte, die Datenbankzugriff benötigen) werden geparsed und mittels
ob_start()
,ob_get_contents()
in den Cache geschrieben. Aus dem Cache wird dann eine HTML-Seite erstellt und auf dem Server abgelegt. Diese kann ich per XMLHttpRequest laden.
Üble Bastel-Lösung! :(
- Sven Rautenberg
Hi,
Kannst du machen, solltest du aber lassen. Wenn du mit Javascript automatisch und grundsätzlich an deine Bedienelemente Aktionen ranhängst, und die Bedienelemente so gestaltest, dass sie auch ohne Javascript eine sinnvolle Aktion ausführen, brauchst du keine zwei Seitenversionen zu beachten.
Die per Javascript gestarteten Aktionen verhindern dann einfach, dass die Standard-Aktion, die sich aus dem HTML ergibt, ausgeführt wird, um nicht doppelte Arbeit zu tun.
Hast völlig Recht. Wollte zwar zu Anfang auch keine vollkommen unterschiedlichen Versionen schreiben, allerdings haben sich große Teile des Codes unterschieden. Habe mir diesbezüglich nochmal Gedanken gemacht und, wie du sagst, kann ich die Navigation natürlich so gestalten, dass sie sowohl mit, als auch ohne Javascript funktioniert.
Nun binde ich per PHP ein Skript ein, welches je nach übergebenen GET Parametern den entsprechenden Inhalt lädt. Bei ausgeschaltetem Javascript wird die gesamte Seite neu geladen, bei eingeschaltetem JS lediglich das Skript, welches für den Inhalt zuständig ist, dabei aber trotzdem variabel auf übergebene Parameter reagiert und den angeforderten Inhalt einbindet.
Nun zu meinem Problem:
Beim Laden des Userbereichs wird ein Datenbankobjekt in PHP erstellt.
Dieses Objekt lebt nicht lange - nur bis zum Skriptende dieses einen Seiten-Requests. Du musst das Objekt also sowieso bei reiner HTML-Navigation für jeden Request neu erstellen.
Wenn ich nun den Inhalt dynamisch per Javascript tausche, steht dieses Objekt im angeforderten PHP-Skript natürlich nicht mehr zur Verfügung, da das zu ladende PHP-Skript in den bereits verarbeiteten Userbereich geladen wird.
Hier ist dein Denkfehler: Dein Request (egal ob Ajax oder sonstwie) erfordert DB-Zugriff, also mach dir das Objekt neu und greife auf die DB zu.
Vielen Dank! Genau dort war er :) Die Datenbankzugriffe erfolgen jetzt nur noch in den relevanten Modulen. Vor diesem Problem stande ich bislang nie, da ich JS/Ajax bislang komplett gemieden habe.
Somit habe ich keinen Zugriff auf meine Datenbank.
Deine eigene Schuld. :)
In der Tat :)
Derzeit verwende ich folgende Lösung: Die einzelnen Inhalte meiner Seite (PHP-Skripte, die Datenbankzugriff benötigen) werden geparsed und mittels
ob_start()
,ob_get_contents()
in den Cache geschrieben. Aus dem Cache wird dann eine HTML-Seite erstellt und auf dem Server abgelegt. Diese kann ich per XMLHttpRequest laden.Üble Bastel-Lösung! :(
Das war der Grund, weshalb ich hier nach Hilfe gesucht habe :)
Vielen Dank für deine Mühe!
Viele Grüße und einen angenehmen Abend ;)
Jonas