PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Client soll iFrame auf dem Server neu laden


Popopinsel
2009-08-12, 09:44:42
Hallo zusammen,

meine iFrame-Bastelei geht munter weiter: Angenommen ich habe einen Server, auf dem xampp drauf ist. Auf diesem Server sind zwei Webseiten zu erreichen, Seite A und Seite B.

Seite A wird auf/von dem Server selbst aufgerufen und zeigt Informationen in einem iFrame an. Seite B wird von einem Client im Netz aufgerufen. Über Seite B können Informationen in eine Datenbank geschrieben werden, die auf Seite A auf dem Server angezeigt werden.

Jetzt möchte ich gerne auf Seite B, also der Seite, die der Client aufruft, einen Button haben, der bei einem Click den Server dazu bringt, einen iFrame auf der Seite A, die er ja selbst anzeigt, neu zu laden.

Ist das so möglich (ich denke ich weiß um die Problematik von Server- und Client-seitigem Code, aber es soll ja auch etwas (php-Code?) auf dem Server ausgeführt werden) und wenn ja, wie?

Ich bedanke mich schonmal im vorraus! =)

The_Invisible
2009-08-12, 12:17:19
also wenn ich das richtig verstanden habe: du willst einem besucher aufzwingen ein iframe zu reloaden wenn der "admin" nen button drückt.

das geht leider nur indirekt, du hast ja keinen direkten zugriff auf den browser des besuchers. du könntest aber auf besucherseite zb per javascript und ajax eine bestimmte seite auf einen bestimmten status pollen lassen (jede sekunde oder so) und dann reloaden.

wenn falsch verstanden bitte vergessen.

mfg

Popopinsel
2009-08-12, 14:49:01
Es ist genau anders herum! =) Ich möchte dass der Server gezwungen wird, einen iFrame auf der nur bei ihm geöffneten Seite A zu reloaden, wenn der Benutzer auf der von ihm geöffneten Seite B einen Button betätigt.

Es ist so, dass der Server dazu dient, Seite A für "Laufkundschaft" darzustellen. Jetzt soll man per Remote (der Benutzer auf Seite B) den im iFrame von Seite A dargestellten Inhalt reloaden (für die "Laufkundschaft").

darph
2009-08-12, 15:24:08
Ich glaube, du hast das Konzept mit der Server/Clientarchitektur und der Zustandslosigkeit des HTTP-Protokolls noch nicht so ganz umrissen.


Es ist völlig Wumpe, ob der Webserver (also die Software) und der Client (also die Software) auf der gleichen physikalischen Maschine laufen oder nicht: Das geht so nicht, das ist so nicht vorgesehen. Es sind immer noch getrennte Server/Clients.

Was du machen könntest, wäre ein AJAX-Skript basteln, welches in regelmäßigen Abständen pollt, ob es sich selbst neu laden (also die Anfrage neu stellen) soll.

DanMan
2009-08-12, 18:16:16
Was du machen könntest, wäre ein AJAX-Skript basteln, welches in regelmäßigen Abständen pollt, ob es sich selbst neu laden (also die Anfrage neu stellen) soll.
Dafür brauch er ja kein AJAX. Er lässt mit setInterval() den Iframe regelmäßig neu laden. Besser gehts wohl nicht.

Popopinsel
2009-08-12, 20:30:02
Dafür brauch er ja kein AJAX. Er lässt mit setInterval() den Iframe regelmäßig neu laden. Besser gehts wohl nicht.

Richtig, so hab ich es z.Z. gelöst. Aber ich würde den Refresh auch gerne von einem Client aus auslösen lassen.

DanMan
2009-08-12, 23:09:39
Richtig, so hab ich es z.Z. gelöst. Aber ich würde den Refresh auch gerne von einem Client aus auslösen lassen.
Tust du doch damit. :confused:

Außerdem, wie soll das gehen:
Seite A wird auf/von dem Server selbst aufgerufen
Der Server surft also selbst im Internet? Interessant.

Popopinsel
2009-08-13, 08:22:28
So, um das ganze nochmals zu verdeutlichen, hänge ich eine kleine Skizze an.

Zur Erläuterung:

Der Server wird von niemandem bedient und dient nur dazu, Seite A auf einem großen Monitor für Passanten anzuzeigen. Über ein LAN sollen Clients auf Seite B gehen können, von wo aus sie u.a. über einen Button den iFrame von Seite A (auf dem Monitor des Servers) neu laden lassen können.

Ich hoffe mein Vorhaben ist nun klar! =)

The_Invisible
2009-08-13, 09:35:06
naja, trotzdem greift man immer als client auf eine website zu.

es ändert sich daher nichts an der problemstellung und den schon angebotenen lösungen.

mfg

Gast
2009-08-13, 10:21:51
Wie bereits erwähnt ist das was du möchtest eine Client-To-Client-Kommunikation.

Da das auf direktem Wege nicht funktioniert musst du dem Server mitteilen, dass Seite A, welche auf dem Server angezeigt wird, neu geladen werden soll.
Dann gibt es zwei Möglichkeiten. Entweder der Server meldet seinen Clients (in diesem Fall nur der Seite A) einen Event, den Reload (Server Push) oder die Clients fragen regelmäßig den Event ab (Client Poll).
Um nicht immer pauschal die gesamte Seite neu zu laden bietet sich AJAX an.

Weitere Infos: http://en.wikipedia.org/wiki/Reverse_Ajax


Hier mal ein kleines Beispiel mit einem Polling alle 5 Sekunden mittels Ajax: http://www.file-upload.net/download-1823306/reload_example.zip.html

Da in diesem Fall (und in jedem anderen Fall von Polling) die Kommunikation asynchron stattfindet muss auf dem Server der Event zwischengespeichert werden bis dieser von dem Client abgeholt wird. Dies habe ich, der Einfachheit halber, mittels einer Textdatei gelöst welche lediglich ein Flag speichert.

Es gibt garantiert neben den vielen anderen Lösungsmöglichkeiten auch weitaus schönere ;)

Popopinsel
2009-08-13, 10:46:48
Der Link geht leider nich bzw. es wird nur die Download-Seite von file-upload.net heruntergeladen...

darph
2009-08-13, 11:28:35
Dafür brauch er ja kein AJAX. Er lässt mit setInterval() den Iframe regelmäßig neu laden. Besser gehts wohl nicht.
Das wäre natürlich die einfachste Möglichkeit, ja.

Popopinsel
2009-08-13, 11:46:50
Eine andere Idee:

Im iFrame läuft z.Z. ein Flash-Ticker, der sich beim Aufrufen der Seite Daten aus einer SQL-Datenbank holt.

Gibt es nicht auch eine Möglichkeit, die SQL-Datenbank auf Änderungen zu überwachen und in diesem Fall einen iFrame/ein div-Tag zu refreshen?

Gast
2009-08-13, 11:50:28
Der Link geht leider nich bzw. es wird nur die Download-Seite von file-upload.net heruntergeladen...
Bei mir funktioniert der. Das ist natürlich kein Direkt-Link. Dieser wird erst auf der Downloadseite, auf die dieser Link zeigt, angeboten.

Alternativer Download falls der o.g. wirklich nicht funktioniert: http://ul.to/3e3jcs

Gast
2009-08-13, 11:54:30
Eine andere Idee:

Im iFrame läuft z.Z. ein Flash-Ticker, der sich beim Aufrufen der Seite Daten aus einer SQL-Datenbank holt.

Gibt es nicht auch eine Möglichkeit, die SQL-Datenbank auf Änderungen zu überwachen und in diesem Fall einen iFrame/ein div-Tag zu refreshen?

Ist auch "nur" Polling. Was du pollst um den geänderten Zustand zu ermitteln ist dabei irrelevant.

Im Beispiel oben wird mittels Reload-Button auf Seite B auf dem Server ein Flag in eine Datei geschrieben die von Seite A dann gepollt wird.
Genau so könntest du einen Zustand oder Werte über die Seite B in eine Datenbank schreiben statt die Datei zu verwenden. Seite A würde dann eben diese Datenbank pollen.

Popopinsel
2009-08-13, 12:17:06
Und wie polle ich eine SQL-Datenbank auf Veränderungen?

Edit: @Gast: Die von Dir erstellte Seite A läd ja die gesamte Seite neu, falls die gepollte Datei "toggle.txt" eine "1" enthält. Bei mir soll allerdings ein <div> (in dem der Flash-Film läuft) mit der ID "newsbox" refreshed werden. Was muss ich dazu ändern?

Ich weiß ich stelle blöde Fragen...:redface:

darph
2009-08-13, 12:33:57
Und wie polle ich eine SQL-Datenbank auf Veränderungen?Achtung, Pseudocode!

$query = "SELECT value FROM flags WHERE name = 'myflag';";

$result = query($query);

if ($result == "update") {
$query = "UPDATE flags SET value = 'no-op' WHERE name = 'myflag';";
query($query); // wieder zurücksetzen
echo("1");
} else {
echo("0");
}



So. Dein JavaScript ruft jetzt diese PHP-Datei auf, holt sich den Inhalt (hence ajax, kannst du aber auch selbst bauen mit dem xmlhttprequest).

Wenn der Rückgabewert 1 ist, dann ruft das Script die eigene Seite neu auf, wenn nicht, dann nicht.

The_Invisible
2009-08-13, 13:17:18
Und wie polle ich eine SQL-Datenbank auf Veränderungen?

Edit: @Gast: Die von Dir erstellte Seite A läd ja die gesamte Seite neu, falls die gepollte Datei "toggle.txt" eine "1" enthält. Bei mir soll allerdings ein <div> (in dem der Flash-Film läuft) mit der ID "newsbox" refreshed werden. Was muss ich dazu ändern?

Ich weiß ich stelle blöde Fragen...:redface:

mit javascript und DOM wissen ist das schnell gemacht. sollen wir dir gleich die anwendung schreiben? ;D

mfg

Popopinsel
2009-08-13, 18:34:30
Ich habs jetzt hinbekommen! :)

Zusatzinfo:

Meine "Seite B" dient dazu, über ein Webinterface News in eine SQL-Datenbank zu schreiben. Dabei besteht ein Eintrag aus dem eigentlichen Text, dem automatisch angefügten Timestamp sowie einer einzigartigen, fortlaufenden ID (auto_increment).

Lösung: (ein großes Danke geht hier an den Gast, dessen "Seite A.php" & "toggle.php" ich als Ansatz genommen habe)

# Der iframe (id='iframe1') auf Seite A beinhaltet ein php-Script (welches mir den Flash-Ticker bereitstellt).

# Ein Javascript auf Seite A sorgt dafür, dass ein php-Script ("toggle.php") jede (1) Sekunde ausgeführt und der Rückgabewert überprüft wird. Wenn dieser "1" ist, dann wird der iframe refreshed (document.getElementsByID('iframe1').parentWindow.reload(); ). Ist er "0", dann nicht.

# Das Script "toggle.php" wiederum überprüft beim Aufrufen zum Einen die SQL-Datenbank und zum Anderen eine Textdatei.

# SQL-Datenbank: Mittels "SELECT MAX(id) FROM news" bekomme ich die höchste ID aus der Datenbank. Diese ist immer die aktuellste, da auch beim ändern eines Eintrags eine neue ID vergeben wird und zwar auch, wenn es bei den IDs zu "Lücken" gekommen ist (durch Löschen von Einträgen).

# Textdatei: Hier wird immer die ID reingeschrieben, welche bei der vorigen Überprüfung die höchste war. Die Textdatei dient quasi als Zwischenspeicher der vorigen Überprüfung, um beim nächsten Versuch einen Vergleichswert zu haben.

# In der "toggles.php" wird also zunächst immer die höchste ID (neuesteID) aus der Datenbank gelesen. Danach lese ich ich die Textdatei aus (alteID). Sollte sich bei der Überprüfung herausstellen, dass alteID und neuesteID sich unterscheiden (die Datenbank wurde also verändert), dann gibt das Script eine "1" aus (echo "1"; ) und der Wert neuesteID wird in die Textdatei geschrieben. Sollten beide Werte gleich sein (keine Veränderung der DB), wird eine "0" ausgegeben.


Es ist also noch besser geworden als ich erwartet hatte, denn ich brauch so nun nicht mal den Button. Sobald eine Änderung an der Datenbank stattgefunden hat, startet der Ticker mit den neuen Daten neu. :D

Vielen Dank Euch allen! Hätte es ohne Euch nicht geschafft!

P.S.: Ich denke, ich hab jetzt auch das Server-/Client-Ding besser verstanden. Sobald ein Browser eine Seite ansteuert, egal ob der Browser auf der selben Maschine wie der Apache (der "Server") gestartet wird oder nicht, ist dieser quasi der Client und führt lediglich den html- und JS-Code aus. Der php-Code hingegen wird für den Client nicht sichtbar auf/von dem Server ausgeführt. Richtig? :redface:

darph
2009-08-13, 18:44:05
Jetzt hat er's verstanden. :)

DanMan
2009-08-13, 19:36:38
Für Referenzzwecke:
Jaxer (http://jaxer.org/)
HTTP Streaming (http://ajaxpatterns.org/HTTP_Streaming)

und evtl:
IFrame Call (http://ajaxpatterns.org/IFrame_Call)

Gast
2009-08-14, 11:25:31
Was mir direkt noch zur Optimierung auffällt:

Du kannst die toggle.php statt 1/0 für (nicht) neu laden auch einfach immer die aktuellste ID aus der DB liefern lassen.

In deinem JavaScript merkst tu dir immer die von toggle.php gelieferte ID. Entspricht die im nächsten Request gelieferte ID nicht der gemerkten (also der gerade angezeigten News) aktualisierst du.

So sparst du dir die Textdatei ;)

The_Invisible
2009-08-14, 13:28:31
naja, irgendwie lustig das jetzt wieder iframes "empfohlen" werden und es früher ja so böse war. :D

mfg