Schreiben in SQLITE-Datenbank

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    habe folgendes Problem, ich möchte aus meiner Homematic mit dem RPI Daten auslesen und in eine Datenbank schreiben, das funktioniert soweit, bis ich die Daten schreiben möchte. Hier erstmal das PHP-Programm:
    [code=php]
    <?php
    error_reporting (E_ALL | E_STRICT);
    ini_set ('display_errors' , 1);
    setlocale (LC_TIME, "de_DE");
    include ("phpDBfunction.php");
    $SQLITEdb = "../var/www/homematic.sqlite";
    $db = db_con($SQLITEdb);
    exec("curl -o /var/www/homematic.xml \"http://192.168.xxx.xxx/config/xmlapi/statelist.cgi\"");

    $xml = simplexml_load_file( "homematic.xml" );
    foreach ( $xml->device as $geraet )
    {
    If (substr($geraet['name'], 0,2)<> "HM")
    {
    foreach ( $geraet->channel as $kanal_1 )
    {
    If (substr($kanal_1['name'], 0,2)<> "HM")
    {
    foreach ($kanal_1->datapoint as $dp)
    {
    if ($dp['type'] == "LEVEL"
    OR $dp['type'] == "STATE"
    OR $dp['type'] == "TEMPERATURE"
    OR $dp['type'] == "HUMIDITY")
    {
    echo "<b>Id: " . $geraet['name'] . "</b><br>";
    echo "IseID: " . $geraet['ise_id'] . "<br>";
    echo "Channel: " . $kanal_1['name']. "<br>" ;
    echo "Type: ". $dp['type']. "<br>" ;
    echo "Wert: ". $dp['value']. "<br>" ;
    echo "Einheit: ". $dp['type'] . "<br>" ;
    echo "Zeit: ". strftime("%a %d.%m.%Y %H:%M:%S", intval($dp['timestamp']) ) . "<br>" ;
    echo "INSERT INTO status VALUES ( ". $geraet['ise_id'].", ". $dp['timestamp'] .", ". $kanal_1['name'] .", ". $dp['type'] .", ". $dp['type'] .", ". $dp['value'] ;
    $insertTable = $db->exec("INSERT INTO status VALUES ( ". $geraet['ise_id'].", ". $dp['timestamp'] .", ". $kanal_1['name'] .", ". $dp['type'] .", ". $dp['type'] .", ". $dp['value'] );
    }
    }
    }
    }
    echo "<br><br>" ;
    }
    }
    ?>
    [/php]

    Die PHP-DB-Funktionen habe ich aus dem Tutorial von Meigrafd (Vielen Dank für die ausführliche Anleitung :danke_ATDE: ). Hier nochmal mit meinen Anpassungen:
    [code=php]
    <?php
    //Quelle: Datenbanken mit SQLite

    setlocale (LC_TIME, "de_DE");


    // DB connect
    function db_con($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 $DBfile:</b><br/>";
    echo "<b style='".$e."'>".$db->errorInfo()."</b><br/>";
    die;
    }
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $db;
    }

    // DB Query
    function db_query($sql) {
    global $db;
    $result = $db->query($sql) OR db_error($sql,$db->errorInfo());
    return $result;
    }

    // DB errors
    function db_error($sql,$error) {
    die('<small><font color="#ff0000"><b>[DB ERROR]</b></font></small><br/><br/><font
    color="#800000"><b>'.$error.'</b><br/><br/>'.$sql.'</font>');
    }

    // Add HTML character incoding to strings function db_output($string) {
    return htmlspecialchars($string);
    }
    // Add slashes to incoming data
    function db_input($string) {
    if (function_exists('mysql_real_escape_string')) {
    return mysql_real_escape_string($string);
    }
    return addslashes($string);
    }


    ?>[/php]

    Wenn ich das jetzt aufrufe, bekomme ich folgenden Fehler, ohne die Datenbank-Anbindung gibt er mir die "echos" so aus, wie ich es erwarte:
    [code=php]Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /var/www/phpDBfunction.php:7 Stack trace: #0 /var/www/phpDBfunction.php(7): PDO->__construct('sqlite:../var/w...') #1 /var/www/homematic2sqlite.php(15): db_con('../var/www/home...') #2 {main} thrown in /var/www/phpDBfunction.php on line 7[/php]

    Das klingt für mich nach einem Rechteproblem, aber die Datenbank gehört dem User "PI" und auch das Verzeichnis gehört "PI". Die DB hat die Rechte "-rw-rw-rw-" und das Verzeichnis "drwxrwsrwx", so dass eigentlich es keine Rechteprobleme geben dürfte...

    Kann mir da einer weiterhelfen?

    Vielen Dank!

    Markus

    PS.: Was ich auch nicht verstehe, mich aber nicht wirklich stört, ist dass [code=php]exec("curl -o /var/www/homematic.xml \"http://192.168.xxx.xxx/config/xmlapi/statelist.cgi\"");[/php] im Webbrowser keine Datei schreibt, aber wenn ich es im bash ausführe schreibt er die Datei :s

  • Das macht kein Sinn: [code=php]$SQLITEdb = "../var/www/homematic.sqlite";[/php]

    Mach die " .. " da weg sodass es ein absoluter Pfad wird. Mit " .. " gelangt man ein Verzeichnis zurück aber es wird kein Verzeichnis " /var/var/www/ " geben :fies:

    In der phpDBfunction.php hast du aber auch ein Fehler, vermutlich falsches copy&paste:
    [code=php]
    // Add HTML character incoding to strings function db_output($string) {
    return htmlspecialchars($string);
    }
    [/php]

Jetzt mitmachen!

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