PHP-Seite bei Datenbanktabellenänderung neu laden

Gast #3862963
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.
Gast #3862974
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.
Gast #3863155
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.
Gast #3863165
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.
Gast #3863215
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.
Gast #3863218
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.
Gast #3863227
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.
Gast #3863252
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.
(Firma: BfEHS) #3863308
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".
Gast #3863312
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"/>.
#3863389
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
Gast #3864319
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.
#3864590
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
 });

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren