Probleme mit php und sqlite3

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Forengemeinde,https://www.forum-raspberrypi.de/images/smilies…con_helpnew.gif
    ich habe seit einiger Zeit einen Rasi Modell B+ (mit den 4 USB-Schnittstellen) Er soll als Aquariensteuerung fungieren.
    Die Hardware steht bereits.
    Die ganze Geschichte habe ich in ein leeres PC-Gehäuse untergebracht. Dort wo üblicher Weise die Laufwerke sind, habe ich ein 7,2 “ Touchscreendisplay von Pollin aufgeklebt.
    Die Rückseite habe ich komplett verändert und mit 8 230V-Steckdosen, 24 Cinchbuchsen für IO`s, sowie 2 XLR-Buchsen für I2C- und 1wire- Erweiterungen versehen.
    Die Stromversorgung erfolgt über ein 12V -3A Schaltnetzteil. Als USV habe ich ein Ladenetzteil mit Laderegler welches einen 12V 4,5 Ah Akku bei laune hält. Auf einer Lochrasterplatine habe ich über kleine DC/DC Wandler die 3,3 V und 5,0 V Spannungsebene aufgebaut.
    Auf die GPIO-Schnittstelle des Raspi habe ich ein Pi-Rack gesteckt, welches die Möglichkeit bietet 4 HumplePi –Erweiterungplatinen aufzustecken.
    Folgende Funktionen sind bereits lauffähig:
    Erweiterung mit MCP23017 16 Kanal IO über I2C (8-Kanal-Relaiskarte und 8 Digitale Eingänge)
    Ansteuerung von
    2 Leuchtengruppen
    2 Magnetventilen für Luft und CO2
    2 Pumpen
    2 Heizungen ( Wasser und Boden )
    Abfragen von 2 Feuchtigkeitsfühler für Ansteuerung einer Bewässerungspumpe
    Abfragen von 2 Pegelschalter zur Ansteuerung einer Hebepumpe
    Die Leuchtengruppen werden über Zeit ( rtc DS1307) gesteuert. Und über einen MAX 520 als 4 -Kanal DA-Wandler 1-10 V Ausgang I2C (fertiges Modul von CC-Tools) gedimmt.
    Die Heizungen werden über 2 mal DS1820 als 1 Wire Temperaturfühler gesteuert.
    Geplant ist noch eine 8 Kanal Analogeingangsbaugruppe mit MCP3008, die bereits auf einem Steckbord funktioniert. (für ph-Wert, Leitwert etc.)
    Über ein Python-Script steuere ich die ganze Sache. Das Script ist wie eine große Schleife aufgebaut und trägt am Ende alle Statuswerte der IO`s , die Messwerte und die Dimmer % in je eine Tabelle einer sqlite3-Datenbank.
    Bis hierhin funktioniert das alles tadellos.
    Da ich die ganze Sache auch ein wenig darstellen möchte und auch Eingriffsmöglichkeiten haben möchte. habe ich das Touchscreen an den Raspi angeschlossen. (funktioniert auch)
    Auf dem Touchscreen sollen über eine Web-Seite der Status der IO`s angezeigt sowie über Radiobutton`s, welche in der Art
    (Ein –Aus-Automatik) eine Eingriffsmöglichkeit auf die 8 Relais realisiert werden. Weiterhin möchte ich die Temperaturwerte, später auch pH-Wert und Leitwert sowie die % der beiden Dimmer anzeigen.


    Jetzt habe ich ein paar Baustellen:
    1.Und größte Baustelle:
    Ich habe also den apache2, sqlite3, sqlitebrowser, bluefish, php5, php5-sqlite installiert.
    Habe mir 2 Webseiten auf den Raspi unter /var/www angelegt. Diese funktionieren bisher nur statisch also ohne Status- und Messwertanzeige ohne funktionierende Radiobutton und können über die IP-Adresse des Raspi auf jedem PC in der Routerumgebung angezeigt werden.
    Ich bekomme das Zusammenspiel zwischen php und sqlite3 nicht hin. Egal welches Script ich versuche nachzuempfinden es erzeugt mir immer nur eine weiße Seite. Und eine Datenbank, geschweige denn darin eine Tabelle, wird nicht erzeugt bzw. abgefragt.
    Wo könnte hier der Haken sein. Ich habe schon Stunden zugebracht aber noch konnte ich kein Resultat erzielen.

    2. Wie kann ich in der sqlite3-Datenbank automatisch im Pythonscript nach einer bestimmten Zeit Daten löschen. In der Datenbank habe ich in jeder Tabelle einen Timestamp in der Form von 2015-02-25 20:36:57.123456 als TEXT stehen.
    Ich möchte, damit die Datenbank nicht zu groß wird, die Messwerte nach einem halben Jahr, die Dimmer nach 3 Tagen oder 1 Woche löschen.

    3. Wie hole ich immer den jeweils zuletzt eingetragenen Datensatz aus der jeweiligen Tabelle?

    4. Wie kann ich die Information der Radiobutton auf der Web-Seite in einer weiteren Tabelle der Datenbank ablegen, damit ich sie im Pythonscript abfragen kann.

    Da ich in Bezug auf die Softwareanwendungen Linux, PHP, HTML und Python ein Neuling bin, bitte ich euch, habt Mitleid und Geduld mit mir und setzt nicht so viel Fachkenntnisse bei mir vorraus.
    https://www.forum-raspberrypi.de/images/smilies…_danke_ATDE.gif

  • Zu 1.:

    Forumsuche nach: PHP SQLite
    2.Treffer

    Zum Rest:

    Wenn wir wüssten wie deine Datenbankstruktur aussieht könnte man dazu ggf auch mehr sagen als wild drauf los zu raten.
    Guck dazu auch mal hier: MySQL abfrage über mehrere Tabellen

  • Hallo meigrafd,

    ich wollte die Datei der Datenbank anhängen, ( sie heißt Datenbank.db)
    Ich bekomme die Meldung Dateityp nicht erlaubt.
    Wie kann ich Sie Euch dann präsentieren ?

  • Hallo,

    zur 2. Frage: Indem du den SQL-Query `DELETE FROM table_name WHERE condition` ausführst. `condition` wäre denn halt alle Zeitstempel kleiner welches-Datum-auch-immer. Ob du das _wirklich_ machen musst sei dahin gestellt. Auch SQLite kann mit Tabellen mit ein paar hundertausend oder Million Zeilen umgehen.

    zur 3. Frage: hol' den mit der höchsten ID ;)

    Generell: was du ganz sicher _nicht_ willst is, PHP und Python zu mischen. Damit kannst du nur in der Programmierhölle landen. Entweder alles in Python oder alles in PHP. Mit Hinblick darauf, dass Python bekanntlich die _bevorzugte_ Programmiersprache für den Pi ist, nimmst du NATÜRLICH Python ;)

    Für Webanwendungen mit Python sind Bottle, Flask oder Django heiße Tipps. Letzteres hat ein ORM an Bord, was den Umgang mit der Datenbank ziemlich vereinfacht.

    Gruß, noisefloor

  • Hallo noisefloor,

    ich bin kein großer Sofwareprogrammierer, also

    wie lautet die Bedingung in Python wenn einen Timestamp in der Form von 2015-02-25 20:36:57.123456 als TEXT in der Tabelle der Datenbank vorhanden ist und alle Daten, die älter als 3 Tage sind, gelöscht werden sollen?

    Wie hole ich mir den Datensatz mit der höchsten id.

    Um das Vermischen von Python und PHP zu vermeiden, habe ich ja die Datenbank dazwischen.
    Python soll als erstes die DB abfragen, ob ein Schaltbefehl ansteht. Dann wird das Script abgearbeitet und zum Schluß werden der Status der IO`s, die Dimmer und die Messwerte in die Tabellen geschrieben, aber nur wenn eine Änderung erfolgt ist.

    Das PHP/ Html-Script soll nur für die Darstellung auf der Webseite zuständig sein.
    Also Abfrage der Status der IO`s, Messwerte und Dimmer um sie darstellen zu können, und Schreiben vom Befehlen aus den Radiobutton in eine Tabelle, die dann das Pythonscript abholen kann.

  • Hallo,

    Zitat

    wie lautet die Bedingung in Python wenn einen Timestamp in der Form von 2015-02-25 20:36:57.123456 als TEXT in der Tabelle der Datenbank vorhanden ist und alle Daten, die älter als 3 Tage sind, gelöscht werden sollen?


    Ich habe jetzt nicht im Kopf, wie das SQLite Daten konvertiert, weil es eine gewisse "Intelligenz" in Sachen Typkonvertierung eingebaut hat. Grundsätzlich aber mit so was a la `....WHERE timestamp < was-auch-immer`

    Es wäre übrigens IMHO _wesentlich_ einfacher, wenn du den Timestamp als Unix-Timestamp schreibst und nur bei Bedarf (z.B. Darstellung in der Weboberfläche) in eine (für Menschen lesbare) Notation umwandelst.

    Zitat

    Wie hole ich mir den Datensatz mit der höchsten id.


    Hm... das sind so die _absoluten SQL-Grundlagen. Wenn du das nicht selber heraus findest, dann solltest du nicht mit einer SQL-Datenbank arbeiten - um es mal ganz direkt zu sagen.

    Zitat

    Um das Vermischen von Python und PHP zu vermeiden, habe ich ja die Datenbank dazwischen.
    Python soll als erstes die DB abfragen, ob ein Schaltbefehl ansteht


    Das würde ich als "broken-by-design" bezeichnen. Grundsätzlich ist eine DB zum Datenaustausch zwar ok - aber nicht, wenn das 2. Programm (hier also das Python-Programm) auf irgendwas reagieren soll. Dann müsstest du ja permanent aus dem Python-Skript heraus die Datenbank abfragen, ob ein neuer Datensatz da ist, was unnötig Rechenzeit verbraucht und ggf. auch IO verursacht.

    Vorausgesetzt ich habe das alles richtig verstanden, solltest du das Konzept nochmal überdenken...

    Gruß, noisefloor

  • Hallo noisefloor,

    das mit dem Unix-Zeitstempel habe ich verstanden und werde ihn in die DB-Tabellen eintragen. Die Abfrage für das Löschen von alten, nicht mehr benötigten Datensätzen sollte dann möglich sein. Damit ist eine meiner 4 Baustellen abgehakt. Danke dafür.

    In der nächsten Zeit muß ich mich näher mit dem Tutorial von meigrafd ( sqlite3 und PHP ) beschäftigen, damit ich die Datenbankinhalte auf dem Touchscreen darstellen kann.

  • Hallo,

    ich habe mit einem kleinen Script versucht, eine bestimmte Anzahl von Datensätzen aus einer sqlite3 Tabelle zu löschen. Dabei wird, wenn die Bedingung erfüllt ist, leider immer die gesammte Tabelle geleert. Wo liegt der Fehler?

    vorher habe ich als Kriterium den Zeitstempel genommen, aber das Ergebnis war das gleiche, wie bei der Verwendung der id.

    Ich hoffe jemand kann mir weiterhelfen.

    • Offizieller Beitrag

    [code=php]
    cursor.execute("""delete from messwerte where id < "%s" """ % (result1))[/php]

    Ich geh mal davon aus das du dich auf die varibable result1 beziehst, oder?

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (10. März 2015 um 15:56)

  • Hi,


    ...

    Python
    #!/usr/bin/python
    ...
        cursor.execute("delete from messwerte where id < 'result1'")
    ...


    ...

    bist Du sicher, dass das Statement so korrekt ist?
    Wenn die API nicht in die einfachen Hochkomma "reinschaut" (was imho der Sinn einfacher Hochkommas ist) ... dann wird der String "result1" als Wert interpretiert und damit ist jede Id kleiner ;)

    //EDIT: immer ist dieser Grünfink schneller ...

    cu,
    -ds-

  • Hi,
    sehr schön :thumbs1:

    Mir fällt da gerade zu dem Thema eine Eselsbrücke ein. Die stammt von einem meiner Dozenten von vor ca. 30 Jahren:
    bei doppelten Hochkommas - also " - kann der Interpreter/Compiler durch die Lücke zwischen den beiden Strichen in das Statement hineinschauen und etwas verändern/Variablen setzen. Bei einfachen Hochkommas - also eben ' - ist da keine Lücke, deshalb bleibt der enthaltene Ausdruck unverändert ...

    cu,
    -ds-

  • Hallo , Ihr im Forum,

    Ich habe den Transfer von den Daten aus dem Pythonscript in die SQlite3 Datenbank dank Eurer Hilfe hinbekommen. Die Anzeige von Temperatur- und Dimmerwerten auf der Web-Seite funktioniert auch. Mein derzeitiges Problem ist, jetzt die Werte von 8 Radiobutton welche Ein, Aus, Auto ( als Werte dann 1, 2 oder 0 ) zur Auswahl haben von einem php-Script in eine SQlite 3 Tabelle zu schreiben. Das Auslesen aus den Radiobutton`s funktioniert , aber ich stelle mich wieder einmal zu ………. an, die Werte in die Tabelle „schalten“ zu kriegen. Hat jemand eine Idee, was ich falsch gemacht habe? Anbei das Script
    Ich hoffe ihr könnt mir helfen.
    [/php]
    [code=php]
    <?php
    $befehl=$_POST["StrLPGP1"];
    $befehl1=$_POST["StrLPGP2"];
    $befehl2=$_POST["HZWA"];
    $befehl3=$_POST["HZBO"];
    $befehl4=$_POST["MVCO2"];
    $befehl5=$_POST["MVLU"];
    $befehl6=$_POST["PPBLU"];
    $befehl7=$_POST["PPKE"];

    echo " $befehl;$befehl1; $befehl2; $befehl3; $befehl4; $befehl5; $befehl6; $befehl7;";


    $db = new SQLite3('/home/pi/Datenbank.db');


    $db->exec ("INSERT INTO schalten (

    LPGP1,
    LPGP2,
    HZWA,
    HZBO,
    MVCO2,
    MVLU,
    PPBLU,
    PPKE) VALUES (
    $befehl, $befehl1, $befehl2, $befehl3, $befehl4, $befehl5, $befehl6, $befehl7)");


    $db->close();

    ?>

  • Hallo liebe Forengemeinde,

    Danke für die schnelle Antwort. Mit den "Commit" Befehl habe ich es probiert, aber es kommen leider keine Daten in der Tabelle an. Wo liegt der Haken?
    Das "echo" wird ausgeführt, aber es kommt nichts in der DB an.
    Ich hänge das geänderte Script noch mal ran.

    [code=php]

    <?php
    $befehl=$_POST["StrLPGP1"];
    $befehl1=$_POST["StrLPGP2"];
    $befehl2=$_POST["HZWA"];
    $befehl3=$_POST["HZBO"];
    $befehl4=$_POST["MVCO2"];
    $befehl5=$_POST["MVLU"];
    $befehl6=$_POST["PPBLU"];
    $befehl7=$_POST["PPKE"];
    echo " $befehl;$befehl1; $befehl2; $befehl3; $befehl4; $befehl5; $befehl6; $befehl7;";


    $db = new SQLite3('/home/pi/Datenbank.db');


    $db->exec ("INSERT INTO schalten (

    LPGP1,
    LPGP2,
    HZWA,
    HZBO,
    MVCO2,
    MVLU,
    PPBLU,
    PPKE) VALUES (
    $befehl, $befehl1, $befehl2, $befehl3, $befehl4, $befehl5, $befehl6, $befehl7)");

    $db->exec('COMMIT');


    $db->close();
    ?>

    Einmal editiert, zuletzt von duboisi44 (30. März 2015 um 16:40)

  • Sind das alles Zahlen ?
    Ansonsten mal so versuchen die Werte in Hochkommas ' einzuschliessen.
    '$befehl','$befehl2','$befehl3' .... etc

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Hallo Der_Imperator,
    Die Varialblen $Befehl bis $Befehl7 enthalten Zahlen 0, 1 oder 2 ( Automatik- , Ein- oder Aus- Befehl.
    Mit den Hochkommas werde ich es noch mal probieren aber ich glaube diese Version hatte ich schon mal ohne Erfolg getestet.

    Gruß duboisi44

    Hallo nochmal,

    also das Einschließen in Hochkomma war nicht der Erfolg.
    Die Geschichte sieht jetzt so aus:
    [code=php]
    <?php

    $timestamp = time();
    $befehl=$_POST["StrLPGP1"];
    $befehl1=$_POST["StrLPGP2"];
    $befehl2=$_POST["HZWA"];
    $befehl3=$_POST["HZBO"];
    $befehl4=$_POST["MVCO2"];
    $befehl5=$_POST["MVLU"];
    $befehl6=$_POST["PPBLU"];
    $befehl7=$_POST["PPKE"];
    echo "$timestamp; $befehl;$befehl1; $befehl2; $befehl3; $befehl4; $befehl5; $befehl6; $befehl7;";


    $db = new SQLite3('/home/pi/Datenbank.db');


    $db->exec ("INSERT INTO schalten (

    timestamp,
    StrLPGP1,
    StrLPGP2,
    HZWA,
    HZBO,
    MVCO2,
    MVLU,
    PPBLU,
    PPKE) VALUES (
    '$timestamp', '$befehl', '$befehl1', '$befehl2', '$befehl3', '$befehl4', '$befehl5', '$befehl6', '$befehl7')");

    $db->exec('COMMIT');


    $db->close();
    ?>

    Auch nach diesem Durchlauf gelangt kein Datensatz in die T[/php]abelle

    Einmal editiert, zuletzt von duboisi44 (1. April 2015 um 19:51)

Jetzt mitmachen!

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