PHP, SQLITE Problem mit Datenausgabe in PHP

  • Hallo zusammen,

    ich lese bereits seit langem mit und habe hier schon einiges an Lösungen für diverse Probleme mit meinem Pi gefunden.
    Bei diesem hab ich leider auch nach tagelanger Suche und vielen Versuchen keine Lösung.

    Also:

    Ich schreibe mit Python Werte aus einer Datei in eine SQlite3 Datenbank:

    Code
    def write_temp(wert1, wert2):
         conn=sqlite3.connect('Example.db')
         curs = conn.cursor()
         curs.execute("INSERT INTO example values(date(wert1),time(wert2))")
         conn.commit()
         conn.close()

    Das klappt alles einwandfrei, die werte kommen richtig in die Datenbank, ich kann sie auch mit Python auslesen und ausgeben.
    Und in der Konsole kann ich auch auf die Datenbank zugreifen usw.

    Außerdem möchte ich die Werte in einer einfachen Website(nur netzwerk intern bevor die Frage kommt) darstellen, hierfür brauche ich natürlich php, womit ich bisher sogut wie keine Erfahrung habe.
    mein Ansatz war hierfür:

    Ich habe auch schon mehrere andere Ansätze versucht, klappen tut leider keiner....
    Die Datenbank liegt im home/pi Verzeichnis(habe auch schon statt Example.db /home/pi/Example.db versucht...).

    Kann mir bitte jemand weiterhelfen? Falls es einen besseren/einfacheren Weg gibt bin ich offen für alles.

    Vielen Dank im Voraus

    Einmal editiert, zuletzt von Turael (14. Oktober 2015 um 11:39)

  • Für Python sind Einrückungen sehr wichtig. Bei deiner "def write_temp(wert1, wert2):" seh ich aber keine. Merk dir einfach das nach einem Doppelpunkt eine Einrückung erfolgen muss.
    Die "curs.execute" Zeile kommt mir zudem seltsam vor. Ich glaub nicht dass das auf die gewünschte Art funktionieren wird.

    Einrückungen sind für PHP zwar nicht zwingend notwenig, erhöhen aber die Lesbarkeit und somit auch die Übersicht - gewöhn es dir also dort am besten auch an :fies:
    Du hast zudem einen Schreibfehler in der PHP Datei -> dbh
    [code=php]
    $db = db_con($SQLITEdb);

    $result = $dbh->query("SELECT * FROM example");
    [/php]
    Du hast aber nur ein db Object, kein dbh ;)

    Davon abgesehen solltest du die Datenbankdatei nicht in /home/pi/ liegen haben sondern in /var/www/ denn sonst hat der Webserver-Benutzer "www-data" kein Zugriff auf die Datei. So von wegen "fremdes Homedir" und so ;)

  • Hallo und danke für die schnelle Antwort.

    Da sind mir wohl beim kopieren die einrückungen verloren gegangen :D. Ich rücke egal ob python oder php oder sonstiges immer brav ein, wie ich auch geschrieben habe funktioniert der python Teil auch einwandfrei :).


    Bin nun leider unterwegs, werde nacher die einrückungen einfügen und die Datenbank in var/www verschieben und testen(und den Schreibfehler korrigieren).

    Danke nochmals.

    P.S: So, hab die Datenbank verschoben und auch den Schreibfehler entfernt... Funktioniert immer noch nichts... Kann mir evtl jemand einen Beispiel Code geben wie es bei richtiger config von lighttpd funktionieren sollte? In meiner Datenbank gibt es 4 Werte... Wenn es damit dann nicht klappt weiß ich wenigstens dass es wsl an falscher config von lighttpd liegt.

    Einmal editiert, zuletzt von Korikatzo (11. Oktober 2015 um 21:16)

  • Hallo,

    Zitat

    hierfür brauche ich natürlich php, womit ich bisher sogut wie keine Erfahrung habe.


    Das ist ja Quatsch. Du kannst jede Programmiersprache nehmen, die a) mit SQLite umgehen kann und b) für die es ein Webframework gibt.

    Wenn du kein Erfahrung mit PHP hast, dann setz' das ganze doch einfach auch in Python um. Wenn du z.B. Bottle als Webframework nimmst, dann kannst du das mit ca. 10 Zeilen Code realisieren (wenn die Ausgabe "schön" sein soll, dann brauchst du natürlich nochmal 10-15 Zeilen für das HTML-Template.

    Beispiele dazu solltest du reichlich im Web finden. Wenn du nicht erfolgreich sein solltest hier nochmal kurz melden.

    Gruß, noisefloor


  • Kann mir evtl jemand einen Beispiel Code geben [...]

    FAQ --> Nützliche Links / Linksammlung --> Datenbanken mit SQLite

    Mit speziell lighttpd hat das eigentlich wenig zu tun solange dort PHP funktioniert.

    Ansonsten: Beschreibe doch mal bitte was aktuell nicht funktioniert?

  • Hallo zusammen,

    Vielen Dank euch beiden. Php usw funktioniert aufjedenfall hab gestern fertigen Code gefunden zum testen, der hat geklappt aber selbst wenn ich nur versuche den zu verändern bekomm ich ihn nichtmehr zum laufen.... :D

    Werde es morgen mal mit bottle testen :)

  • Naja nur weil etwas nicht auf Anhieb funktioniert muss man nicht gleich aufgeben und eine andere Sprache nehmen :fies: Wo bleibt dein Ehrgeiz? :D

    Dein Problem liegt nicht in PHP sondern viel mehr an deinem Verständnis beim Umgang mit Python aber auch SQL. Demzufolge wäre ein Wechsel auf bottle nicht Zielführend denn dann stündest du erneut vor Problemen..

    Das erste wäre das zumindest ich nicht nachvollziehen kann was du in deiner Funktion write_temp überhaupt machst

    Code
    def write_temp(wert1, wert2):
        conn=sqlite3.connect('Example.db')
        curs = conn.cursor()
        curs.execute("INSERT INTO example values(date(wert1),time(wert2))")
        conn.commit()
        conn.close()

    Der INSERT wird nicht funktionieren - Definitiv nicht - wie ich aber auch schon erwähnte.

    Die korrekte Syntax für einen INSERT SQL Befehl mit sqlite sieht wie folgt aus:

    Code
    curs.execute("INSERT INTO tablename VALUES (?, ?)", (wert1, wert2))


    Alternativ bzw allgemein verbereiteter wäre allerdings:

    Code
    curs.execute("INSERT INTO tablename (date, time) VALUES (?, ?)", (wert1, wert2))

    aus dem einfachen Grund weil man hier die Spalten angibt die befüllt werden sollen, wohingegen man bei der ersten Möglichkeit für alle Spalten Values angeben muss
    Du solltest also die 2.Version bevorzugen.

    Das nächste Problem ist dann die Verarbeitung des SELECT querys. Nachdem du den SELECT abgeschickt hast kannst du nicht einfach "echo $result" machen. $result wurde mit mehreren Daten befüllt und zwar in Form eines Arrays.
    Eine korrekte Verarbeitung in PHP könnte also wenn dann wie folgt aussehen:
    [code=php]$db = db_con('/var/www/Example.db');

    $query = $db->query("SELECT * FROM example");
    $result = $query->fetch(PDO::FETCH_ASSOC);

    foreach($result AS $row => $value) {
    echo $row . ": " . $result[$row] . "<br/>\n";
    }
    [/php]

  • Also bezüglich nur weil etwas nicht auf Anhieb funktioniert gebe ich dir natürlich absolut Recht :)
    Ich hab wirklich tagelang versucht etwas zu finden womit ich es zum laufen bekomme und verstehe, jedoch Fehlanzeige.

    Außerdem bin ich (wie man bestimmt n kleines bisschen gemerkt haben könnte :D) Anfänger was das programmieren angeht :), deshalb wäre es doch sinnvoll sich erstmal auf eine Sprache zu konzentrieren oder? Habe aber vor es trotzdem auch noch mit PHP zu versuchen, jedoch will ich auch, dass es überhaupt einmal in etwa so läuft wie ich mir es vorstelle, zwischendurch benötigt man ein Erfolgserlebnis :P

    Nun zu meiner Python Funktion:

    Ich kann dir absolut versprechen dass die Funktion exakt das macht was ich will, in meiner richtigen Funktion ist auch noch eine For Schleife drin, da ich die Werte in einer Liste in die Funktion gebe und die Werte werden alle passend reingeschrieben. Aber wenn es so die sauberere Lösung ist, werde ich das ändern und mir das auch so merken(hab das aus irgendeiner der unzähligen Python Datenbankenprogramme die ich durchgesehen habe).

    Zu PHP: Hab das auch schon so versucht, hat wieso auch immer auch nicht funktioniert... Hab immer nur eine weiße Seite angezeigt bekommen.

    Ich denke ich Versuche es nun erst einmal mit bottle und Python und wenn das dann gut funktioniert werde ich noch einmal von Grund auf mit PHP anfangen :)

    Ein riesengroßes Danke für eure Hilfe, ich werde mich garantiert nochmals melden falls es wieder Probleme gibt :)


  • Ich kann dir absolut versprechen dass die Funktion exakt das macht was ich will, in meiner richtigen Funktion ist auch noch eine For Schleife drin, da ich die Werte in einer Liste in die Funktion gebe und die Werte werden alle passend reingeschrieben. Aber wenn es so die sauberere Lösung ist, werde ich das ändern und mir das auch so merken(hab das aus irgendeiner der unzähligen Python Datenbankenprogramme die ich durchgesehen habe).

    Naja, Hilfe kann nur so gut sein wie die Informationen die man kriegt... Wenn deine Funktion eigentlich völlig anders aussieht dann poste doch bitte deinen exakten Code, diesmal bitte unverändert sodass man dir auch wirklich richtig helfen kann. Das hätte uns hier einiges an Zeit und Mühe gespart!

    Ich versteh sowas ehrlich gesagt nicht. Was ist an Deinem Code so geheimes dran sodass du ihn hier nicht exakt und genau so postest wie Du ihn verwendest? Wie stellst du dir vor wie Außenstehende dir dann vernünftig helfen können? Hellsehen? Ins Blaue raten bis einer nen Treffer hat?

  • Entschuldige, aber kein Grund sich aufzuregen, ich dachte nur dass ich das alles kürze und vereinfache, da der Python code ja sowieso funktioniert :) ist ja auch nur ne for schleife die eben so oft wie ich werte lese und in die liste schreibe eben durchläuft und in jedem durchlauf eine position in der liste weiterspringt, also völlig unrelevant :)

    Wie ich nun bereits mehrmals geschrieben habe funktioniert mein Python Code einwandfrei und der einzige Teil der ansatzweise in Verbindung mit der Datenbank kommt(in Form von reinschreiben) wurde ja auch von dir verbessert, ansonsten habe ich beim Python teil keine Hilfe benötigt, da er wie gesagt funktioniert :)

    Es ging mir lediglich drum, ob an meinem php ansatz nur ein kleiner dummer fehler drin ist, der schnell erkennbar ist für ein geübtes Auge. Da es aber bei mir an mehr scheitert werde ich versuchen das ganze noch einmal ruhig und von Grund auf aufzubauen.

    Entschuldige falls etwas falsch rübergekommen ist, war nicht meine Absicht :)

  • Naja, das komische is nur das der von mir gezeigte Code bei mir funktioniert.. :s

  • Okay,

    nun funktioniert es :D

    Vielen vielen Dank, also ich denke, dass es an dem Teil lag:

    Code
    foreach($result AS $row => $value) {
       echo $row . ": " . $result[$row] . "<br/>\n";
    }

    Hab mir nun noch ein bisschen was zu der PHP foreach Schleife durchgelesen, damit is das auch etwas klarer :)

    Einmal editiert, zuletzt von Korikatzo (13. Oktober 2015 um 19:50)

Jetzt mitmachen!

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