SQLite3 Datensätze hinzufügen
Jan
- datenbank
2 Rouven0 Vinzenz Mai0 Jan0 dedlfix
Hallo zusammen,
ich habe bisher immer Flatfiles benutzt um meinen Kram abzuspeichern. Mit der Zeit habe ich gemerkt welche Nachteile das mit sich bringt bzw. welche Vorzüge SQL bietet.
Jedoch möchte ich gerne ersteinmal SQLite3 statt einer "richtigen" MySQL DB benutzen.
Also habe ich angefangen eine MySQL Einführung zu lesen weil ich denke(hoffe) das die SQLite3-querys analog zu den MySQL-querys funktionieren.
Nun hänge ich an einem ganz banalen Problem. Die Tabelle "News" wurde erstellt und alle Spaltenbezeichnungen sind auch wie gewünscht vorhanden, das kann ich mit so einem Sharewareprogramm namens "sqliteman3" nachschauen.
Aber aus Gründen die ich nicht verstehe kann ich keine Datensätze hinzufügen, ich bekomme immmer den "falschen Fehler".
Was mache ich hier falsch?
Gruß,
Jan
<?php
function dbSQLiteConnection() {
if($dbHandle = new PDO('sqlite:c:\test.dbs')) {
return $dbHandle;
} else {
die("db error");
}
}
$DB = dbSQLiteConnection();
/*
$sql='
CREATE TABLE News (
ID INT AUTO_INCREMENT PRIMARY KEY,
Autor VARCHAR(30) NOT NULL,
Titel VARCHAR(50) NOT NULL,
Inhalt TEXT NOT NULL,
Datum DATETIME NOT NULL
);
';
$Q = $DB->query($sql);
*/
$sql='
INSERT INTO
News(Autor, Titel, Inhalt, Datum)
VALUES
("Ich",
"Meine erste News",
"Hiermit teste ich wie man Datensätze in MySQL einfügt",
NOW());
';
$Q = $DB->query($sql);
if( $Q === false) {
die("falscher Fehler");
}
?>
Hello,
$sql='
CREATE TABLE News (
ID INT AUTO_INCREMENT PRIMARY KEY,
Autor VARCHAR(30) NOT NULL,
Titel VARCHAR(50) NOT NULL,
Inhalt TEXT NOT NULL,
Datum DATETIME NOT NULL
);
ist das Statement durchgelaufen? Ich hatte im Hinterkopf, das SQLite Autoincrements nicht so gerne hat...
INSERT INTO
News(Autor, Titel, Inhalt, Datum)
VALUES
("Ich",
"Meine erste News",
"Hiermit teste ich wie man Datensätze in MySQL einfügt",
NOW());
du gibst hier nur die Werte für die 4 Spalten an, nicht aber für ID. Das ist in Ordnung, insofern der Autoincrement richtig funktioniert, d.h. selbst einen Wert für die ID vergibt.
Tut er das nicht, weil SQLite da kein Fan von ist, dann hast du hier einen Fehler weil dein Primary Key nicht leer sein darf (sprich: NULL).
Generell sei dir der Tipp gegeben, nach jeder Interaktion mit der Datenbank das Ergebnis zu überprüfen (wie du es mit q === false tust und darauf entsprechend zu reagieren - du kannst z.B. sqlite_error_string verwenden um dir eine Beschreibung des Fehlers geben zu lassen.
MfG
Rouven
Hallo,
Jedoch möchte ich gerne ersteinmal SQLite3 statt einer "richtigen" MySQL DB benutzen.
Also habe ich angefangen eine MySQL Einführung zu lesen weil ich denke(hoffe) das die SQLite3-querys analog zu den MySQL-querys funktionieren.
prinzipiell ja, aber der Teufel steckt im Detail.
Was mache ich hier falsch?
Verschiedenes:
CREATE TABLE News (
ID INT AUTO_INCREMENT PRIMARY KEY,
Autor VARCHAR(30) NOT NULL,
Titel VARCHAR(50) NOT NULL,
Inhalt TEXT NOT NULL,
Datum DATETIME NOT NULL
);
nach meinen Tests mit einer 3er-SQLite-Version wird *bei mir* das unbekannte Schlüsselwort AUTO_INCREMENT einfach ignoriert. Sprich: Du hast keine automatischen Werte für Deine ID.
Nun ist ein Autoincrement für SQLite sowieso überflüssig, weil SQLite sowas schon automatisch in jeder Tabelle eingebaut hat: ROWID. Willst Du dagegen eine "manuell" definierte Autoinkrement-Spalte, kannst Du dies im einfachsten Fall durch
spaltenname INTEGER PRIMARY KEY
erreichen, siehe SQLite-FAQ 1. Willst Du sicherstellen, dass Autoinkrement-Werte nur einmal vergeben werden, verwende das Schlüsselwort AUTOINCREMENT. Die Syntax von SQLite ist dabei sehr strikt, was die Reihenfolge der Schlüsselwörter angeht:
ID INT PRIMARY KEY AUTOINCREMENT,
Kein Unterstrich und *nach* PRIMARY KEY.
Nun zum INSERT-Statement:
INSERT INTO
News(Autor, Titel, Inhalt, Datum)
VALUES
("Ich",
"Meine erste News",
"Hiermit teste ich wie man Datensätze in MySQL einfügt",
NOW());
SQLite weist übrigens die Funktion NOW() als unbekannt zurück. Das ist kein großes Wunder, solche Funktionen heißen bei fast jedem DBMS anders. SQLite bietet Dir zum Beispiel DATETIME().
Es ist keine besonders gute Idee, Zeichenketten in SQL in doppelte Anführungszeichen zu setzen. Üblich - und von manchen Datenbankmanagementsystemen (DBMS) ausschließlich erlaubt - sind einfache Anführungszeichen. Daher ist es eine gute Idee, konsequent auf einfache Anführungszeichen zu setzen, auch wenn SQLite doppelte zuläßt.
Anmerkung: Ich habe *nicht* mit einer mit PHP gebündelten Version von SQLite getestet!
Freundliche Grüße
Vinzenz
Tausend Dank für eure Anmerkungen Tips und Hilfe,
das Hallo Welt Script funktiert schonmal ;) . Zumidest habe ich in die Spalte b einige Zahlen gepackt und dabei gesehen wie sich a von alleine erhöht - das SQLite FAQ ist da natürlich eine super Hilfe.
Gruß,
Jan
<?php
function dbSQLiteConnection() {
if($dbHandle = new PDO('sqlite:c:\test.dbs')) {
return $dbHandle;
} else {
die("db error");
}
}
$DB = dbSQLiteConnection();
/*
$sql='
CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);
';
$Q = $DB->query($sql);
if( $Q === false) {die("query fehlgeschlagen");}
*/
$sql='INSERT INTO t1 VALUES(NULL,123);';
$Q = $DB->query($sql);
if( $Q === false) {die("query fehlgeschlagen");}
?>
echo $begrüßung;
Was mache ich hier falsch?
$Q = $DB->query($sql);
if( $Q === false) {
die("falscher Fehler");
}
Du ignorierst die Möglichkeit, dich über den Fehler aufklären zu lassen. Datenbankanfragen können immer schief laufen. Selbst wenn im Labor alles in bester Ordnung ist, sollte man nicht auf eine Fehlerbehandlung verzichten, denn erfahrungsgemäß passiert immer was. Der Server macht grad seine tariflich geregelte Pause, man hat beim Entwerfen einen Sonderfall übersehen, der nun eingetreten ist, und so weiter.
Ein Einstiegspunkt für PDO wäre das Kapitel Errors and error handling.
echo "$verabschiedung $name";