Hallo,
ich habe ein PHP-Programm gechrieben, das auf eine
MYSQL-Datenbank-Tabelle zugreift. Nun möchte ich, dass die Seite, die
auf die DB-Tabelle zugreift, wenn ein neuer Datensatz in der DB-Tabelle
erscheint, neu geladen wird. Ist dies möglich?
Flughafen schrieb:> Ist dies möglich?
Ja. Gibt mehre Möglichkeiten wie du das umsetzen kannst. Kommt darauf an
was dir lieber ist, was du genau haben willst,...
Nein so direkt nicht. Du müsstest schon per Java-Script oder sowas eine
Funktion einbauen, die in regelmäßigen Abständen die Seite neu läd oder
beim Server erfragt ob sich etwas geändert hat.
Möglich ist das. Afaik wirst du hierfür jedoch JavaScript benutzen
müssen. Einen konkreten Codeschnippsel kann ich dir leider nicht
liefern, aber vom Ablauf sollte es so aussehen:
1. Dein JS ruft zyklisch ein PHP-Skript auf deinem Server auf. Nennen
wir das Skript mal newData.php. Dieses Skript hat die Aufgabe zu prüfen,
ob neue Datensätze vorhanden sind. Falls ja, liefert es den Text "true"
zurück, falls nein, den Text "false".
2. Dein JS wertet die Rückgabe aus. Ist diese der Text "true" lässt es
die Seite neu laden.
Das wäre die einfachste Implementierung. Aufwändigere Implementierungen
könnten so aussehen, dass newData.php die neuen Datensätze gleich
zurückliefert. z.B. als XML oder JSON, und dein Skript diese dynamisch
zur Seite hinzufügt. Ist etwas aufwendiger und nicht ganz so schnell zu
programmieren, aber vom Ergebnis etwas sauberer, da nicht immer die
Seite komplett neu geladen werden muss.
lebensmittelhändler schrieb:> Und wenn schon Ajax dann mit jQuery
Libraries sind überflüssig, statt ajax braucht man einen XMLHttpRequest,
um einem client vom server aus über änderungen auf dem laufenden zu
halten, nutzt man WebSockets. Ich hab da mal nen WebsocketServer in php
geschrieben, empfehle aber serverseitig nodejs zu verwenden.
Daniel A. schrieb:> Libraries sind überflüssig, statt ajax braucht man einen XMLHttpRequest,> um einem client vom server aus über änderungen auf dem laufenden zu> halten, nutzt man WebSockets. Ich hab da mal nen WebsocketServer in php> geschrieben, empfehle aber serverseitig nodejs zu verwenden.
WebSockets oder SSE, ist eigentlich wurscht. SSE halte ich hier für
einfacher, der Ursprungsposter hat eh kaum Plan vom Thema.
Mit jQuery geht Ajax halt idiotensicher, behandelt Browsersonderfälle
(ok die spielen heute eigentlich keine Rolle mehr) transparent und
benutzt das eh nur noch darüber, wer fummelt denn heute noch von Hand
auf dem XMLHttpRequest Object herum? Das nimmt einfach unnötige Arbeit
ab.
lebensmittelhändler schrieb:> Ja. Gibt mehre Möglichkeiten wie du das umsetzen kannst. Kommt darauf an> was dir lieber ist, was du genau haben willst,...
Dann schreib mal eine.
Peter II schrieb:> nicht wirklich oder nur extrem unständlich.sebi707 schrieb:> Nein so direkt nicht.
Deine Aussage steht im Widerspruch zu diesen beiden.
sebi707 schrieb:> Nein so direkt nicht. Du müsstest schon per Java-Script oder sowas eine> Funktion einbauen, die in regelmäßigen Abständen die Seite neu lädt.
Genau das nervige Neuladen wollte ich umgehen.
Higg schrieb:> 1. Dein JS ruft zyklisch ein PHP-Skript auf deinem Server auf. Nennen> wir das Skript mal newData.php. Dieses Skript hat die Aufgabe zu prüfen,> ob neue Datensätze vorhanden sind. Falls ja, liefert es den Text "true"> zurück, falls nein, den Text "false".> 2. Dein JS wertet die Rückgabe aus. Ist diese der Text "true" lässt es> die Seite neu laden.
Das ist ein guter Ansatz. Wie könnte denn newData.php das Prüfen? Eine
Idee hätte ich dazu, man könnte in der Datenbank eine Spalte TIMESTAMP
einfügen. Angenommen, das Javascript ruft alle 30 Sekunden das
PHP-Script auf, dann muss dieses überprüfen, ob Datensätze innerhalb von
30 Sekunden vor der aktuellen Zeit eingefügt worden sind.
Higg schrieb:> Das wäre die einfachste Implementierung. Aufwändigere Implementierungen> könnten so aussehen, dass newData.php die neuen Datensätze gleich> zurückliefert. z.B. als XML oder JSON, und dein Skript diese dynamisch> zur Seite hinzufügt. Ist etwas aufwendiger und nicht ganz so schnell zu> programmieren, aber vom Ergebnis etwas sauberer, da nicht immer die> Seite komplett neu geladen werden muss.
Wie stellst du dir denn den Aufruf vor?
Ich würde in die Seite mit <?php include("newData.php"); ?> newData.php
einbinden. PHP kann dann ja die Zeit herausfinden. Dann wird immer wenn
die Sekunden 0 oder 30 sind die Datenbank geprüft (s.o.). Wenn neue
Datensätze vorhanden sind, werden sie mit echo() ausgegeben. Das
include() muss an der dafür vohergesehenen Stelle erfolgen.
Flughafen schrieb:> Das ist ein guter Ansatz. Wie könnte denn newData.php das Prüfen? Eine> Idee hätte ich dazu, man könnte in der Datenbank eine Spalte TIMESTAMP> einfügen. Angenommen, das Javascript ruft alle 30 Sekunden das> PHP-Script auf, dann muss dieses überprüfen, ob Datensätze innerhalb von> 30 Sekunden vor der aktuellen Zeit eingefügt worden sind.
date_modified, falls updates auch neu angezeigt werden sollen. index
darauf nicht vergessen falls es "ein paar mehr" datensätze sind.
Da die Änderungen in der DB auch vermutlich nur von PHP kommen, braucht
man eigentlich die DB nicht nach Änderungen zu befragen.
Hier kommt jetzt nur das Problem. das es in PHP keine "globalen"
Variable gibt. Die für alles Sessions und Request gültig sind. Das kann
man aber z.b. mit memcache nachbilden.
Dann braucht man auch nicht ständig die DB zu belästigen.
Als Alternative kann man in einen Trigger in er DB anlegen, diese kann
dann Shell befehle Ausführen und damit PHP benachrichtigen.
Aber alles halt nicht wirklich schön.
Peter II schrieb:> Da die Änderungen in der DB auch vermutlich nur von PHP kommen
Ja. Aber von irgendeinem PHP-Script, dass ich nicht immer in jeder Seite
angeben möchte.
Peter II schrieb:> memcache
Was ist das?
c.m. schrieb:> date_modified, falls updates auch neu angezeigt werden sollen. index> darauf nicht vergessen falls es "ein paar mehr" datensätze sind.
Daraus kann ich nicht viel machen. Kannst du es bitte genauer erklären?
newData.php
Flughafen schrieb:> Die Anzahl der Sterne lässt nicht auf die Länge des Passwortes und> Benutzernamens schließen.
Oh, wie schrecklich! Jetzt ist aus ungefär 8 hoch 36 möglichkeiten < x
hoch 36 geworden! Immerhin hatten wir ganze 0 möglichkeiten die wahre
Identitat von localhost auf deinem PC zu ermitteln! :-)
Flughafen schrieb:> c.m. schrieb:>> date_modified, falls updates auch neu angezeigt werden sollen. index>> darauf nicht vergessen falls es "ein paar mehr" datensätze sind.>> Daraus kann ich nicht viel machen. Kannst du es bitte genauer erklären?http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html
dm enthält das datum der letzten änderung wenn du einen insert und
update trigger anlegst der den aktuellen timestamp im datensatz ablegt.
Rene Schube schrieb:> Die Seite kann sich doch selber aktualisieren.
Ja, aber das nervt aus mehreren Gründen:
1. Bei Scroll-Seiten muss man immer dahin scrollen, wo man gerade war.
2. Inhalte in <textarea> und <input> werden gelöscht.
3. Ladedauer und dadurch entstehende Unterbrechung
Flughafen schrieb:> Rene Schube schrieb:>> Die Seite kann sich doch selber aktualisieren.>> Ja, aber das nervt aus mehreren Gründen:> 1. Bei Scroll-Seiten muss man immer dahin scrollen, wo man gerade war.> 2. Inhalte in <textarea> und <input> werden gelöscht.> 3. Ladedauer und dadurch entstehende Unterbrechung
Dann taugt das Konzept nichts!
Ich habe bei einem Kunden eine Prozess Visualisierung laufen. Die Seiten
werden in 100 - 200 ms komplett neu geladen. Die <textarea> und <input>
automatisch wieder befüllt. Und selbst Bilder malen mit HTML5 Canvas
geht in der Zeit.
Allerdings habe ich das Design auf heutige Bildschirmauflösungen
angepasst und bekomme alles auf eine Seite, ohne Scrollbars.
Die "Unterbrechung" sieht man, "is not a bug is a feature".
Rene Schube schrieb:> Ich habe bei einem Kunden eine Prozess Visualisierung laufen. Die Seiten> werden in 100 - 200 ms komplett neu geladen. Die <textarea> und <input>> automatisch wieder befüllt. Und selbst Bilder malen mit HTML5 Canvas> geht in der Zeit.
Dann schreib mal wie du das machst. Für den Scrollbalken: einfach auf
die Position setzen mit blablabla.php#position auf den <div
id="position"/>.
Peter II schrieb:> Dann braucht man auch nicht ständig die DB zu belästigen.> Als Alternative kann man in einen Trigger in er DB anlegen, diese kann> dann Shell befehle Ausführen und damit PHP benachrichtigen.
Die DB fühlt sich dadurch bestimmt nicht belästigt und irgendwelche
Trigger Lösungen sind doch hier viel zu kompliziert gedacht.
Nach einer HighLoad Seite hört sich das nun nicht an.
Benutz jQuery und dort ist .load() dein Freund.
in dein JS - File packst du
$( document ).ready(function() {
$("#sqldata").load( "sql.php" );
});
und bindest das ganze in deiner Hauptseite ein.
sqldata ist die Div-ID auf deiner Hauptseite. Jegliche Ausgabe die du in
sql.php machst, landet dann dort. Ob du in sql.php nun einefache
Texteausgabe machst, oder eine Tabelle erstellst, etc bleibt dir
überlassen.
Ob du dann alle Einträge der letzten 30min oder einfach die letzten 10
Einträge in der DB anzeigst, bleibt dann dir überlassen.
Und klar kann man automatisch alle x-Sekunden die Seite komplett
neuladen lassen. Wirklich zeitgemäss ist das aber nicht mehr
Eigentlich muss sql.php nur prüfen, ob in den letzten 30 Sekunden ein
Eintrag gemacht worden ist. Das Aufrufen kann Javascript übernehmen.
A. B. schrieb:> $( document ).ready(function() {> $("#sqldata").load( "sql.php" );> });
Das müsste ich dann ändern in
1
function rufedbtestauf (){
2
$( document ).ready(function() {
3
$("#sqldata").load("sql.php");
4
});
5
}
6
setInterval (ruftdbtestauf(),30000);
Ich gehe davon aus, dass JQuery bereits eingebunden ist.
Daniel A. schrieb:> Oh, wie schrecklich! Jetzt ist aus ungefär 8 hoch 36 möglichkeiten < x> hoch 36 geworden! Immerhin hatten wir ganze 0 Möglichkeiten die wahre> Identitat von localhost auf deinem PC zu ermitteln! :-)
Genau das wollte ich.
Flughafen schrieb:> Das müsste ich dann ändern in> function rufedbtestauf (){> $( document ).ready(function() {> $("#sqldata").load("sql.php");> });> }> setInterval (ruftdbtestauf(),30000);> Ich gehe davon aus, dass JQuery bereits eingebunden ist.
eher in