php, mysql, ajax ... tabelle zyklisch aktualisieren
-
hi,
ich lese mit php eine mysql table und stelle sie im internet explorer da.
nun schreib ich mit c++ und qt die tabelle zyklisch neu (alle 100ms).
php soll dies auch zyklisch updaten. wie kann ich das effektiv machen? javascript, ajax?lg
-
wäre sowas in der art denkbar?
dbconnect.php:<?php function read_mysql_table() { $link = mysql_connect('....', '....', '....'); if (!$link) { die('Could not connect: ' . mysql_error()); } #echo "Connected successfully to database<br>"; $db = 'philvertechSun'; $db_selected = mysql_select_db($db, $link); if (!$db_selected) { die ('mysql_select_db failed: ' . mysql_error()); } #echo "Connected successfully to table<br>"; $select = "SELECT * FROM solarplant"; $result = mysql_query($select, $link); if (!$result) { die('Invalid query: ' . mysql_error()); } if($result){ echo "<table>"; while($row = mysql_fetch_array($result)){ echo "<tr><td>Actual_Power</td><td>:</td><td>".$row['Actual_Power']."</td></tr>"; echo "<tr><td>Peak_Power</td><td>:</td><td>".$row['Peak_Power']."</td></tr>"; echo "<tr><td>Average_Power</td><td>:</td><td>".$row['Average_Power']."</td></tr>"; echo "<tr><td>Temperature</td><td>:</td><td>".$row['Temperature']."</td></tr>"; echo "<tr><td>Wind_Speed</td><td>:</td><td>".$row['Wind_Speed']."</td></tr>"; echo "<tr><td>Wind_Direction</td><td>:</td><td>".$row['Wind_Direction']."</td></tr>"; echo "<tr><td>Sun_Position</td><td>:</td><td>".$row['Sun_Position']."</td></tr>"; } echo "</table>"; } mysql_close($link); } ?>
html code:
<html> <head> <script type="text/javascript"> <!-- function getXMLHttp() { var xmlHttp try { //Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch(e) { //Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { alert("Your browser does not support AJAX!") return false; } } } return xmlHttp; } function MakeRequest() { var xmlHttp = getXMLHttp(); xmlHttp.open("GET", "dbconnect.php", true); xmlHttp.send(null); } //function HandleResponse(response) //{ // document.getElementById('ResponseDiv').innerHTML = response; //} function ajax() { setTimeout("MakeRequest()", 1000); } // --> </script> </head> <body onload="ajax()"> </body> </html>
-
Das Problem Php ist serverseitig, ajax/javascript ist clientseitig!?
Jemand nannte mir die Stichwörter SOAP, REST wär sowas sinnvoll hier zu verwenden?
lg
-
hm... mal zusammenfassen:
du willst alle 100ms die Daten aus einer Tabelle laden und darstellen?
Grob gesagt möglich, praktisch wird es daran scheitern, wenn mal ein request länger als 100ms dauert... ich würde also den Timer erst starten, wenn der letzte Request durch istder nächste Punkt ist, dass das unmengen an Datenbankkapazität kostet für einen Mehrwert, der gen null geht (eher sogar ins negative, wenn ich beim scrollen durch die Daten ständig durch den refresh unterbrochen werde)
Dann sollte natürlich ein Query wie
SELECT * FROM table
niemals in einer Produktivumgebung enthalten sein... damit legst du dir einige böse Fallen in den WegAch und Datenbankzugangsdaten niemals in die php-Datei schreiben... auch das kann ein böses erwachen geben (hat aber auf dein Problem keinen Einfluss)
So wie ich das sehe, lädst du alle 1000ms ALLE Daten neu und erstellst eine neue Tabelle... immer und immer wieder...
lade doch nur die neuen Daten (letzten Zeitstempel merken) und füge sie in die bestehende Tabelle mit ein...
fürs einfügen vergiss [c]innerHtml[c]... das ist DHTML, kein AJAX (Korinthenkackerei, ich weiß)
Schick nicht einfach den reinen Text zurück, sondern bau dir eine schöne XML-Datei zusammen... oder du hangelst dich manuell durchs DOM, erstellst Knoten und lernst dabei, invalide Seiten zu hassen ^^Zu deiner ursprünglichen Frage: Effektiv? Garnicht... du kannst es zum laufen bringen, aber effektiv wird das nicht sein
-
fürs einfügen vergiss [c]innerHtml[c]... das ist DHTML, kein AJAX (Korinthenkackerei, ich weiß)
du meinst das getXMLHttp() usw?
wie kann ich die funktion function read_mysql_table() beim xmlHttp.open("GET", "dbconnect.php", true); aufrufen?
muss ich die funktion function HandleResponse(response) auch auswerten?
ich hab nochmal nachgeschsehen, mir reichen 1 - 5 sec refresh auch.
Ach und Datenbankzugangsdaten niemals in die php-Datei schreiben... auch das kann ein böses erwachen geben (hat aber auf dein Problem keinen Einfluss)
sondern wohin dann?
lg
-
meine Zeit mit AJAX liegt ein Weilchen zurück, also kann ich dir leider nicht konkret weiterhelfen... ich seh aber heute abend mal, ob ich in meinen alten Skripten was aufschlussreiches finde (vor allem, wie ich das mit XML gelöst hab)
zu den Zugangsdaten: hier und den nachfolgenden Links wird es recht aufschlussreich dargestellt
-
zwutz schrieb:
zu den Zugangsdaten: hier und den nachfolgenden Links wird es recht aufschlussreich dargestellt
Ne, ist ziemlicher Käse. Es schadet zwar nicht, bringt aber 0 Sicherheit.
Denn Username und Passwort der DB bringt dem angreifer garnichts, solange er nicht Code auf dem Server ausführen kann. Und wenn er Code auf dem Server ausführen kann, kann er auch die config Datei inkludieren in der die Zugangsdaten stehen.
-
Shade Of Mine schrieb:
Denn Username und Passwort der DB bringt dem angreifer garnichts, solange er nicht Code auf dem Server ausführen kann.
muss er doch nicht... er versucht einfach ein www.example.com/phpmyadmin und kann sich dann munter an der db austoben... bis dahin muss php zwar wieder funktionieren, aber das dürfte nicht allzulang dauern...
-
zwutz schrieb:
muss er doch nicht... er versucht einfach ein www.example.com/phpmyadmin und kann sich dann munter an der db austoben... bis dahin muss php zwar wieder funktionieren, aber das dürfte nicht allzulang dauern...
mal abgesehen davon dass du deswegen ja den phpmyadmin absicherst mit .htaccess
denn phpmyadmin darf nie nie nie öffentlich zugänglich sein. unabhängig von deiner restlichen infrastruktur. denn ein offener phpmyadmin ist eine sicherheitslücke weil ich plötzlich bruteforce attacken auf die db fahren kann. ne ne ne.
-
Dann sollte natürlich ein Query wie SELECT * FROM table niemals in einer Produktivumgebung enthalten sein
wieso sollte man soetwas nicht tun?
-
lupu00897 schrieb:
Dann sollte natürlich ein Query wie SELECT * FROM table niemals in einer Produktivumgebung enthalten sein
wieso sollte man soetwas nicht tun?
Weil du sicher nicht alle werte aus der tabelle brauchst - vorallem da die tabelle ja erweitert werden kann ohne dass du es weisst.
das frisst halt sinnlos viel bandbreite - deshalb macht man ein
select a,b,c,d,e,f from table
weil man eben nur a,b,c,d,e,f braucht und g und h brauchen wir nicht uebertragen...mal abgesehen davon, dass ein select a,b,c from xy natuerlich mehr aussagt als ein select * - dh du weisst mehr ueber den code und was er mit den daten will...
-
@zwutz konntest du schon nachschauen?
lg
-
ok... folgendes ist bei mir der Fall... aber nicht haun, wenn ich was falsches sag... ist wie gesagt eine zeitlang her
also.... die php-Datei, die den request bearbeitet, baut bei mir manuell eine xml-Datei zusammen... wichtig dabei ist vor allem
header("Content-Type: application/xml");
... ohne dem, wird es nicht als XML anerkannt, da kann es noch so valide seindie xml-Datei wird ganz normal per echo ausgegeben.
Die JS-Datei sieht bei mir in der Regel immer so aus (je nach Anwendungsfall kommen noch ein paar Funktionen dazuvar resObjekt = null; function erzXMLHttpRequestObject() { var resObjekt = null; try { resObjekt = new ActiveXObject("Microsoft.XMLHTTP"); } catch(Error) { try { resObjekt = new ActiveXObject("MSXML2.XMLHTTP"); } catch(Error) { try { resObjekt = new XMLHttpRequest(); } catch(Error) { alert("Erzeugung des XMLHttpRequest-Objekts ist nicht möglich"); } } } return resObjekt; } function sndReq(/*evtl parameter*/) { resObjekt.open('get', 'xy.php', true); resObjekt.onreadystatechange = handleResponse; // <-- welche Funktion aufgerufen werden soll, wenn sich was tut resObjekt.send(null); } function handleResponse() // hier wird gearbeitet { if(resObjekt.readyState == 4) // 4 war: bin fertig { var zieltabelle = document.getElementById("ziel"); // wo es hinsoll xmlDok = resObjekt.responseXML; //antwort.innerHTML = resObjekt.responseText; while(zieltabelle.hasChildNodes()) { // hier wird nach und nach evtl bereits vorhandene Daten aufgeräumt... kann ausgebaut werden, hat bei mir aber gereicht var kntn = zieltabelle.firstChild; zieltabelle.removeChild(kntn); } // hier dann das xml-Dokument in die vorhandene Struktur einbauen, dazu nachher mehr } } resObjekt = erzXMLHttpRequestObject();
um das ganze mal auf dein Beispiel umzubiegen (keine Garantie auf korrekte Funktionsweise)
deine HTML-Datei sieht so aus:<html> <blablabla /> <!-- der ganze Schmarrn halt, den man so braucht --> <body> <table id="ziel"></table> </html>
die php-Datei baut dir folgende XML-Datei zusammen
<?xml version="1.0" ?> <tabelle> <tr> <td>Zeile 1 Spalte 1</td> <td>Zeile 1 Spalte 2</td> </tr> <tr> <td>Zeile 2 Spalte 1</td> <td>Zeile 2 Spalte 2</td> </tr> </tabelle>
(über die Struktur lässt sich streiten, hauptsache, du bekommst deine Daten rein und es ist gültiges XML)
dann noch die handleResponse-Funktion
function handleResponse() { if(resObjekt.readyState == 4) { var ziel = document.getElementById("ziel"); xmlDok = resObjekt.responseXML; while(ziel.hasChildNodes()) { var kntn = ziel.firstChild; ziel.removeChild(kntn); } for(i = 0; i < xmlDok.childNodes[0].length; i++) { // childNodes[0] wäre hier <tabelle> var newTr = document.createElement("tr"); for(j = 0; j < xmlDok.childNodes[0].childNodes[i].length; i++) { var newTd = document.createElement("td"); var newText = document.createTextNode( xmlDok.childNodes[0].childNodes[i].childNodes[j].data); newTr.appendChild(newTd); newTd.appendChild(newText); } ziel.appendChild(newTr); } } }
so in etwa zumindest... ungetestet, aber dafür bist du da
der Grund, warum ich damals alles manuell gemacht habe, obwohl ein passendes Framework wohl einfacher gewesen wäre: ich wollte AJAX lernen, nicht nur benutzen... wenn ich dann irgendwann an einem Punkt gewesen wäre, wo mir das manuelle gefrickel zu monoton oder zu aufwendig wird, da die zu übermittelnden Daten sehr komplex sind, hätt ich mir ein Framework zugelegt... aber für ne simple Tabelle brauchte ich das nicht
hoffentlich hilfts dir weiter...
-
hi,
jetzt gehts;)
wer sagt mir das ich auf einen XMLHttpRequest einen xml tree zurücksenden muss?;) ich sende einen html string zurück.
ich hatte noch ein problem mit Internet Explorer, der hat das XMLHttpRequest gecacht;/ sowas doofes auch!
nun gehts so:
xmlHttp.open("GET", "test.php?x="+(new Date().valueOf()), true);
bye