sqlite3.db mit Ajax ständig aktualisieren

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Für die gewünschte Funktion auf meinem Webserver fehlt mir nun noch ein letztes Puzzleteil.

    Ich schreibe mit einem Pythonskript Daten in eine sqlite3.db - Klappt
    Auf der Webpage kann ich sie auch auslesen - Klappt

    Leider muss ich dafür immer die Seite per Hand aktualisieren. Ich hätte aber gerne, dass sich das ausgabefeld der Daten sozusagen selbst aktualsiert, also immer auf dem aktuellsten Stand ist, da es sich um eine Wegstreckenmessung handelt.
    Ich habe schon herausgefunden, dass ich das mit Ajax (ist das JavaScript?) machen muss...leider steig ich da gar nicht durch. Habe aber dennoch Hoffnung, wenn mir jemand paar gute Resourcen gibt, dass ich das schaffen kann, da es sich wirklich nur um 2 Einträge in der DB handelt.

    Hier mal meine Index.php

    Und genau den unteren Teil, der mir Umdrehungen und Strecke holt, der soll sich ständig updaten.

    Einmal editiert, zuletzt von bananabread (5. Januar 2014 um 13:05)

  • Also zunächst mal in dein HTML Code etwas fehlerhaft (kein <html> und <body> geöffnet aber </body> zu früh geschlossen, <th geöffnet aber mit </td> geschlossen usw - hab ich nachfolgend korregiert... Und zum programmieren würde ich dir UltraEdit empfehlen und damit es übersichtlicher wird eine geordnete einrückung nutzen

    Ich hab jetzt mal versucht deinen Code oben entsprechend anzupassen sodass es mit AJAX funktionieren müsste:

    Du brauchst 2 Dateien: eine Hauptdatei + jene die von AJAX regelmässig neu geladen wird und die neuen Daten enthällt

    index.php:
    [code=php]
    <?php
    // update data stat all ... millisec
    // NOTE: due to using ajax this massivly spams /var/log/apache2/access.log
    $UPDATE = "500";

    // location of the sqlite3 database file
    $DBfile = "/var/www/messwerte.db";
    ?>
    <html>
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    <!-- AJAX auto refresh -->
    <script type="text/javascript">
    function getHTTPObject() {
    var http = false;
    // Use IE's ActiveX items to load the file.
    // MS Internet Explorer (ab v6)
    if(typeof ActiveXObject != 'undefined') {
    try {http = new ActiveXObject("MSXML2.XMLHTTP");}
    catch (e) {
    // MS Internet Explorer (ab v5)
    try {http = new ActiveXObject("Microsoft.XMLHTTP");}
    catch (E) {http = false;}
    }
    // If ActiveX is not available, use the XMLHttpRequest of Firefox/Mozilla etc. to load the document.
    // Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
    } else if (XMLHttpRequest) {
    try {http = new XMLHttpRequest();}
    catch (e) {http = false;}
    }
    return http;
    }
    var http = getHTTPObject();
    var ID = "DATEN";
    var url = "data.php";
    var params = "UPDATE";
    //Call a function when the state changes.
    function handler() {
    if (http.readyState == 4 && http.status == 200) {
    document.getElementById(ID).innerHTML = http.responseText;
    // JavaScript function calls AutoRefresh() every .. milli seconds
    setTimeout('AutoRefresh()',<?php echo $UPDATE; ?>);
    //$("txt").value = http.responseText;
    }
    }
    function AutoRefresh(){
    http.open("GET",url+"?"+params,true);
    http.onreadystatechange = handler;
    http.send(null);
    }
    AutoRefresh();
    </script>
    </head>

    <body>
    <br/>
    <h2>Wegstreckenmessung mit einem Modelleisenbahnwagen und Raspberry-PI</h2>
    <br/>
    <br/>
    <form method="post">
    <table style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
    <tr>
    <th style="text-align: center;">Messung Starten</th>
    <th style="text-align: center;">Messung Beenden</th>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedON">Start!</button></td>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedOff">Stop!</button></td>
    </tr>
    </table>
    </form>
    <br/>
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors',1);

    # AJAX data
    echo "<div id='DATEN'><?php include('data.php'); ?></div>\n";

    ?>

    </body>
    </html>
    [/php]

    data.php:
    [code=php]
    <?php
    $db = new PDO("sqlite:$DBfile");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $result = $db->query('SELECT Umdrehungen, Strecke FROM Messung1;');

    echo "<table>\n";
    echo " <tr>\n";
    echo " <th>Umdrehungen</th>\n";
    echo " <th>Strecke in cm</th>\n";
    echo " </tr>\n";

    foreach ($result as $row) {
    list($Umdrehungen, $Strecke) = $row;
    echo " <tr>\n";
    echo " <td>".$Umdrehungen."</td>\n";
    echo " <td>".$Strecke."</td>\n";
    echo " </tr>\n";
    }
    echo "</table>\n";
    ?>
    [/php]


    habs nicht getestet aber probiers mal ;)

  • Tja, dann solltest du mal in Zeile 5 schauen.....

    PS:
    Wenn du das error_reporting und dislplay_errors in der php.ini aktivierst, dann musst du nicht lange in irgendwelchen Logdateien wühlen. Aber bitte sofort wieder abschalten, wenn das in den Produktivbetrieb geht.

    spruch.png

  • Um gottes Willen... :lol: Meine Programme usw. gehen nicht in den Vertrieb. Das ich jemals an den Punkt komme, bezweifle ich. Über Hobby wird's kaum hinausgehen.

    Natürlich hab ich auch schon da geschaut...trotzdem erkenn ich den Fehler leider nicht. ;)

    Ein fehler konnte ich schonmal im AJAX skript finden. die Klammer vor dem "elseif" ist zu viel. da dort die function gethtttpobject() abgeschlossen werden würde!

    Einmal editiert, zuletzt von bananabread (6. Januar 2014 um 13:02)

  • Produktiv-betrieb nicht Produktiv-vertrieb

    Das wird nicht die vollständie Fehlermeldung sein... Zeile 5 'db' betrifft das öffnen des $DBfile 's n der data.php ... da ich einen vollständigen Pfad angegeben habe (sollte man möglichst immer machen) wird die Datei bei dir vermutlich wo anders liegen? Eigentlich gehört da auch noch eine verherige Prüfung hin, bevor man sie versucht zu öffnen, ob die Datei überhaupt existiert...

    Und was mich gestern bereits gewundert hatte war das deine Buttons keinerlei Funktion haben - es wird bei dir garnicht geprüft ob ein Button gedrückt wurde :huh:

    Der Code sieht mir auch arg kopiert aus, von einem anderen PHP Code den ich die Tage jemandem hier im Forum gefixt habe (von wegen name=LED sowie RedON und RedOff usw)

    Du solltest dich also unbedingt mal mit den HTML / PHP Basics auseinander setzen


    Ich hab zwar das dbfile nicht aber folgendes funktioniert soweit - aber wie gesagt, bitte bemühe dich in sowohl HTML als auch PHP dingen selber einzulesen (es reicht meist zB nach "html table" oder "php file exist" zu googlen) und nicht so viel blind zu copy&pasten, das bringt dir nicht allzuviel

    Spoiler anzeigen


    index.php
    [code=php]
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors',1);

    // update data stat all ... millisec
    // NOTE: due to using ajax this massivly spams /var/log/apache2/access.log
    $UPDATE = "500";
    ?>
    <html>
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

    <!-- AJAX auto refresh -->
    <script type="text/javascript">
    function getHTTPObject() {
    var http = false;
    // Use IE's ActiveX items to load the file.
    // MS Internet Explorer (ab v6)
    if(typeof ActiveXObject != 'undefined') {
    try {http = new ActiveXObject("MSXML2.XMLHTTP");}
    catch (e) {
    // MS Internet Explorer (ab v5)
    try {http = new ActiveXObject("Microsoft.XMLHTTP");}
    catch (E) {http = false;}
    }
    // If ActiveX is not available, use the XMLHttpRequest of Firefox/Mozilla etc. to load the document.
    // Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
    } else if (XMLHttpRequest) {
    try {http = new XMLHttpRequest();}
    catch (e) {http = false;}
    }
    return http;
    }
    var http = getHTTPObject();
    var ID = "DATEN";
    var url = "data.php";
    var params = "UPDATE";
    //Call a function when the state changes.
    function handler() {
    if (http.readyState == 4 && http.status == 200) {
    document.getElementById(ID).innerHTML = http.responseText;
    // JavaScript function calls AutoRefresh() every .. milli seconds
    setTimeout('AutoRefresh()',<?php echo $UPDATE; ?>);
    //$("txt").value = http.responseText;
    }
    }
    function AutoRefresh(){
    http.open("GET",url+"?"+params,true);
    http.onreadystatechange = handler;
    http.send(null);
    }
    AutoRefresh();
    </script>
    </head>

    <body>
    <br/>
    <h2>Wegstreckenmessung mit einem Modelleisenbahnwagen und Raspberry-PI</h2>
    <br/>
    <br/>
    <form method="post">
    <table style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
    <tr>
    <th style="text-align: center;">Messung Starten</th>
    <th style="text-align: center;">Messung Beenden</th>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedON">Start!</button></td>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedOff">Stop!</button></td>
    </tr>
    </table>
    </form>
    <br/>
    <?php

    # AJAX data
    echo "<div id='DATEN'><?php include('data.php'); ?></div>\n";

    ?>

    </body>
    </html>
    [/php]

    data.php
    [code=php]
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors',1);

    // location of the sqlite3 database file
    $DBfile = "/var/www/messwerte.db";

    if (file_exists($DBfile)) {
    if (!$db = new PDO("sqlite:$DBfile")) {
    $e="font-size:23px; text-align:left; color:firebrick; font-weight:bold;";
    echo "<b style='".$e."'>Fehler beim öffnen der Datenbank:</b><br/>";
    echo "<b style='".$e."'>".$db->errorInfo()."</b><br/>";
    } else {
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $result = $db->query('SELECT Umdrehungen, Strecke FROM Messung1;');
    }
    }

    echo "<table border='1'>\n";
    echo " <tr>\n";
    echo " <th> Umdrehungen </th>\n";
    echo " <th> Strecke in cm </th>\n";
    echo " </tr>\n";
    if (isset($result)) {
    foreach ($result as $row) {
    list($Umdrehungen, $Strecke) = $row;
    echo " <tr>\n";
    echo " <td> ".$Umdrehungen." </td>\n";
    echo " <td> ".$Strecke." </td>\n";
    echo " </tr>\n";
    }
    }
    echo "</table>\n";

    ?>
    [/php]

    combie: Es reicht eigentlich wenn man das im jeden PHP File oben setzt - nur muss das natürlich in jedem File an der richtigen Stelle stehen sonst bringt das nicht viel... Aber hier mangelt es ja anscheint bereits an den Basics also wird er mit deiner Info in der Form nicht viel anfangen können :-/

  • combie: Es reicht eigentlich wenn man das im jeden PHP File oben setzt - nur muss das natürlich in jedem File an der richtigen Stelle stehen sonst bringt das nicht viel... Aber hier mangelt es ja anscheint bereits an den Basics also wird er mit deiner Info in der Form nicht viel anfangen können :-/


    Nein!
    Wenn das error_reporting und das display_errors in der php.ini abgeschaltet ist, dann werden Parseerrors nicht ausgegeben. Nie, never, no.
    Egal, wo und wie du dein error_reporting in der Datei versuchst zu aktivieren.
    Es wird einen Status 500 hageln.

    Hier haben wir das mal deutlicher gemacht:

    Zitat

    Es kommt aber trotzdem keine Fehlermeldung!

    Manchmal kann es vorkommen, dass display_errors auf dem kompletten Server auf off steht. Dann werden selbst Parse Errors nicht angezeigt. Die Folge davon ist, dass sämtliche Debuggmechanismen(z.B. error_reporting()) nicht greifen, weil sie erst gar nicht ausgeführt werden. Als Abhilfe kann man display_errors in der php.ini auf on schalten oder besser, eine .htaccess Datei erstellen und sie auf den Webserver laden.


    Aus: http://phpforum.de/forum/showthread.php?t=216988

    spruch.png

  • @ meigraf

    Ja das war der Code von mir den du gefixt hast!:D Das Projekt schreitet halt rapide vorran...:D

    Das mit den Buttons hab ich bereits korrigiert und den "isset" php-Teil eingefügt. Hab es nochmal etwas überarbeit das AJAX-Skript sowie den restlichen Code und jetzt funktioniert ist.

    Es gibt nur ein aller letztes Problem: Sobald ich die Messung Starte, und das Pythonskript läuft, versucht der Browser zu aktualisieren und die AJAX-Aktualisierung funktioniert nicht.
    Da ich aber für Testzwecke den Teil mit AJAX-Skript in eine test.php gelegt habe und die index.php weiterhin ohne AJAX läuft, habe ich die Messung über Index gestartet. Messwerte simuliert, aber zusätzlich in einem weiteren TAB die test.php offen. In diesem Falle klappt das AJAX Skript wunderbar und aktualisiert sich von selbst.
    Also kann es eignetlich nicht an der Rechenleistung des PI's liegen oder?

  • Da muss ich dir (oder deiner Quelle) erneut wiedersprechen combie

    Wenn man in /etc/php5/apache2/php.ini
    display_errors = 0
    error_reporting = 0

    selber einstellt (und apache2 neu startet), aber in einem PHP File es wieder an stellt, ist es an und wird in dem aktuellen File auch genutzt!
    Probier das mal bitte selber aus dann wirst du sehen dass das stimmt ;)

    Eine Ausnahme stellt der safe_mode dar, dann kann sowas nicht über ein PHP Script verändert werden - aber auch der ist standardmäßig aus... Mag sein das es bei manchen WebHosting Anbietern der Fall ist aber nicht wenn man den apache2 Dienst selber installiert hat!

    ...standardmässig ist das (weder safe_mode noch error_reporting = Off) bei Raspbian & Co aber eh nicht der Fall - Nie, never, no! :D

    Und hier der Beweis:

    Spoiler anzeigen

    pxgif74uga6x.png


    bananabread: Das Ajax zeuchs musst du anpassen - wie ich dir bereits gestern erklärt habe wird in dem <script> festgelegt welche Datei ständig neu geladen werden soll und da hab ich jetzt halt data.php eingetragen... Und gestern hab ich dir auch erklärt das man 2 Scripts benötigt:
    - Das Hauptscript wie zB index.php, in dem der <script> läuft
    - Das AJAX script welches vom Hauptscript ständig neu geladen wird

  • meigrafd
    Neee...
    Du hast leider nicht recht.
    Eine Notice, oder Warning, ist kein Parse Error.

    Ich bezog mich eindeutig auf Parseerrors.
    (genau wie es bei bananabread aufgetreten ist)

    Und ja, ich habe es ausprobiert, ich bin dutzende von Malen genau in diese Status 500 Falle getappt.

    Probiere es selber mal aus.
    Und du wirst sehen, dass ich recht habe.

    spruch.png

    Einmal editiert, zuletzt von combie (6. Januar 2014 um 15:40)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!