php, mysql, ajax ... tabelle zyklisch aktualisieren



  • 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 ist

    der 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 Weg

    Ach 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


  • Mod

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


  • Mod

    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?


  • Mod

    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 sein

    die 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 dazu

    var 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


Anmelden zum Antworten