Forum: PC-Programmierung PHP-Seite bei Datenbanktabellenänderung neu laden


von Flughafen (Gast)


Lesenswert?

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?

von lebensmittelhändler (Gast)


Lesenswert?

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,...

von hp-freund (Gast)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Flughafen schrieb:
> Ist dies möglich?

nicht wirklich oder nur extrem unständlich.

von sebi707 (Gast)


Lesenswert?

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.

von Higg (Gast)


Lesenswert?

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.

von lebensmittelhändler (Gast)


Lesenswert?

hp-freund schrieb:
> http://www.drweb.de/magazin/xajax-ajax-einfach-mit-php/
In diesem Fall macht man das mit SSE. Und wenn schon Ajax dann mit 
jQuery oder einer anderen Bib, das fummelt doch keiner mehr von Hand 
zusammen, wenn es auch noch auf allen (alten) Browsern laufen soll.

von Daniel A. (daniel-a)


Lesenswert?

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.

: Bearbeitet durch User
von 5kg Sack Kartoffeln nur 3,99€ (Gast)


Lesenswert?

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.

von Flughafen (Gast)


Lesenswert?

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.

von c.m. (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Flughafen (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

Flughafen schrieb:
>> memcache
> Was ist das?

-> google

von Flughafen (Gast)


Lesenswert?

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
1
//V1
2
Min=Minuten
3
Sek=Sekunden
4
u.s.w.
5
if(Min=30 or Min=0){
6
$db=mysqli_connect("localhost","********","********");
7
mysqli_set_charset($db,"utf8");
8
mysqli_select_db($db,"db_name");
9
$sql = "SELECT * FROM db_name WHERE zeit<'Jahr-Monat-Tag Std:Min:Sek' and zeit>'Jahr-Monat-Tag Std:Min:Sek-30'";
10
$result = mysqli_query($db,$sql);
11
while ($row = mysqli_fetch_assoc($result)){
12
echo "$row["spaltenname1']$row['spaltenname2'] ...";
13
}
14
}
Die Anzahl der Sterne lässt nicht auf die Länge des Passwortes und 
Benutzernamens schließen. zeit ist eine Spalte TIMESTAMP.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Die Seite kann sich doch selber aktualisieren.
1
echo "<META http-equiv=\"refresh\" content=\"5;http://www.url.de/seite.php\">\n";

von Daniel A. (daniel-a)


Lesenswert?

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! :-)

von c.m. (Gast)


Lesenswert?

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.

von Flughafen (Gast)


Lesenswert?

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

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

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".

von Flughafen (Gast)


Lesenswert?

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"/>.

von A. B. (funky)


Lesenswert?

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

von Flughafen (Gast)


Lesenswert?

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.

von A. B. (funky)


Lesenswert?

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
1
 $( document ).ready(function() {
2
    setInterval (ruftdbtestauf(),30000);
3
 }
4
5
function rufedbtestauf (){
6
     $("#sqldata").load("sql.php");
7
 });

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.