SqLite und PDO

kosovafan

Erfahrenes Mitglied
Hallo,

ich bin gerade dabei Sqlite mit PDO Zugriff zu nutzen. Ich habe die Datenbank mit den entsprechenden Tabellen angelegt. Ich habe zwei Fragen die ich jetzt nicht so ganz
verstehe:

1.) Bei sqlite2:database.db funktioniert es, sqlite:database.db funktioniert es nicht, obwohl Sqlite3 in PDO aktiviert ist.

2.) Ich habe der Datenbank die Rechte 0666 gegeben und eine Eintragung wurde mir vom Script positiv beantwortet aber in der Datenbank steht nichts.

PHP:
<?php
require ("db.html");

// Check the Fields
if (isset ($_POST['submit']) && isset ($_POST['autor']) && isset ($_POST['title']) && isset ($_POST['teaser']) && isset ($_POST['artikel']) && 
$_POST['autor'] != '' && $_POST['title'] != '' && $_POST['teaser'] != '' && $_POST['artikel'] != '') {

    $sql = "INSERT INTO bloggen (date, autor, title, teaser, content)
        VALUES (NOW(), :autor, :title, :teaser, :content)";

    $write = $db->prepare($sql);
    $write->bindParam(':autor', $_POST['autor']);
    $write->bindParam(':title', $_POST['title']);
    $write->bindParam(':teaser', $_POST['teaser']);
    $write->bindParam(':content', $_POST['artikel']);
    $write->execute();

    echo "<p>Artikel ist eingetragen!</p>";
}
?>

Die db.html

PHP:
<?php

try {
 $db = new PDO('sqlite2:/var/www/silviosiefke_de/inc/db/silviosiefke.db');
} catch (PDOException $ex) {
	echo 'Fehler: ' . htmlspecialchars($ex->getMessage());
}

?>

Hat jemand Rat, wo der Fehler liegt. Bei der Eintragung erfolgt "Artikel ist eingetragen!", aber in der Datenbank steht der Artikel nicht.


MFG
Silvio
 
Hallo kosovafan,

die Ausgabe "Artikel ist eingetragen!" erfolg in deinem Quellcode schon allein dadurch, dass deine IF-Abfrage true liefert. Alle anderen Aufrufe innerhalb des Anweisungsblockes spielen dort keine Rolle (es sei denn Sie liefern einen Fehler, welcher die Ausführung des Skriptes beendet).

Weitere Fehler kann ich auf den ersten Blick nicht erkennen.

Versuch es mal mit folgendem Konstrukt:
PHP:
require 'db.html'; 

// Check the Fields 
if ( isset( $_POST['submit'], $_POST['autor'], $_POST['title'], $_POST['teaser'], $_POST['artikel'] )
     && $_POST['autor'] != '' && $_POST['title'] != '' && $_POST['teaser'] != '' && $_POST['artikel'] != '' )
{ 
    $sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
            VALUES (NOW(), :autor, :title, :teaser, :content);'; 

    $write = $db->prepare( $sql );

    $write->bindParam( ':autor',   $_POST['autor']   );
    $write->bindParam( ':title',   $_POST['title']   );
    $write->bindParam( ':teaser',  $_POST['teaser']  );
    $write->bindParam( ':content', $_POST['artikel'] );

    if ( false === $write->execute() )
    {
        echo '<p>Artikel wurde nicht eingetragen!</p>';
    }
    else
    {
        echo '<p>Artikel wurde eingetragen!</p>';
    }
}

Gruß
 
Hallo,

ok vielen Dank jetzt erscheint die Meldung Artikel wurde nicht eingetragen. Wo kann der Fehler liegen? Die Datenbank ist vorhanden, die Rechte der Datenbank liegen bei 666, andere Fehler gibt er nicht aus.

PHP:
$db = new PDO("sqlite2:/var/www/silviosiefke_de/inc/db/silviosiefke.db");

Wenn ich die Anweisung änder:
PHP:
$db = new PDO("sqlite:/var/www/silviosiefke_de/inc/db/silviosiefke.db");

erhalte ich

Code:
Fatal error: Call to a member function bindParam() on a non-object in /var/www/silviosiefke_de/htdocs/blog/manage.php on line 26

Oder muss die Datenbank im gleichen Verzeichniss liegen wie das PHP Script?


MFG
Silvio
 
Mach bei der Verbindung mal:
PHP:
try
{
    $db = new PDO( 'sqlite2:/var/www/silviosiefke_de/inc/db/silviosiefke.db' );
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch ( PDOException $e ) { 
    echo 'Fehler: ' . $e->getMessage(); 
}

Und:
PHP:
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 'On' );

require 'db.html'; 

// Check the Fields 
if ( isset( $_POST['submit'], $_POST['autor'], $_POST['title'], $_POST['teaser'], $_POST['artikel'] )
     && $_POST['autor'] != '' && $_POST['title'] != '' && $_POST['teaser'] != '' && $_POST['artikel'] != '' )
{ 
    try
    {
        $sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
                VALUES (NOW(), :autor, :title, :teaser, :content);';

        $write = $db->prepare( $sql );
    
        $write->bindParam( ':autor',   $_POST['autor']   );
        $write->bindParam( ':title',   $_POST['title']   );
        $write->bindParam( ':teaser',  $_POST['teaser']  );
        $write->bindParam( ':content', $_POST['artikel'] );
    
        if ( false === $write->execute() )
        {
            echo '<p>Artikel wurde nicht eingetragen!</p>';
        }
        else
        {
            echo '<p>Artikel wurde eingetragen!</p>';
        }
    }
    catch ( PDOException $e )
    {
    	echo 'PDOException: ' . $e->getMessage() . '<br />';
    }
    catch ( Exception $e )
    {
    	echo 'Exception: ' . $e->getMessage() . '<br />';
    }
}

Eventuell spuckt er ja was aus.

Gruß
 
Hallo,

ich denke das liegt am Datum. Die error Meldung genau:

Code:
PDOException: SQLSTATE[HY000]: General error: 1 no such function: NOW


Was sind die Unterschiede in der Exception Behandlung?`


MFG
Silvio
 
SQLite kennt diese Funktion also nicht. Diese solltest Du dann austauschen.

Ich habe nur den Errorhandler von PDO auf Exceptions gestellt.
PHP:
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
 
Hallo,

also nach meinen Suchen im Internet funktioniert anscheinend Now mit Sqlite nicht. Ich habe jetzt zwei Möglichkeiten gefunden, erster geht ohne Fehlermeldung, "Artikel wurde eingetragen" aber in der Datenbank ist nicht. Die nächste Möglichkeit schmeißt eine Fehlermeldung aus.

PHP:
$sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
 VALUES (datetime("now"), :autor, :title, :teaser, :content);';

PHP:
$sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
 VALUES (date("Y-m-s H:i:s", time()), :autor, :title, :teaser, :content);';

Hier erhalte ich den folgenden Fehler:

Code:
PDOException: SQLSTATE[HY000]: General error: 1 SQL logic error or missing database

MFG
Silvio
 
Versuch es mal so:
PHP:
$sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
       VALUES (' . date( 'Y-m-s H:i:s', time() ) . ', :autor, :title, :teaser, :content);';
 
Hallo,

habe ich geändert, aber er schmeißt eine Exception raus, die Syntax Prüfung ist aber ok.

Code:
PDOException: SQLSTATE[HY000]: General error: 1 unrecognized token: ":"


MFG
Silvio
 
Ist auch klar, ich hab die Anführungszeichen vergessen:
PHP:
$sql = 'INSERT INTO bloggen (date, autor, title, teaser, content) 
       VALUES (\'' . date( 'Y-m-s H:i:s', time() ) . '\', :autor, :title, :teaser, :content);';
 
Zurück