Bekijk de volledige versie : sqlite: Und es geht doch
Hi alle zusammen,
nachdem ich ein wenig im Forum gesucht habe und keinen Hinweis finden konnte warum PHP und sqlite nicht zusammen arbeiten wollen, habe ich selber nach der Lösung gefunden. Da es vielleicht noch mehr gibt, die Probleme mit sqlite haben, wollte ich die Lösung, die bei mir geholfen hat, hier beschreiben.
Vorraussetzung:
ipkg thttpd mit php (sicher geht auch ein anderer webserver mit php)
ipkg sqlite
Zuerst sollte nachgeprüft werden ob die folgenden PHP Module vorhanden sind
ls /opt/lib/php/extensions/
pdo.so
pdo_sqlite.so
sqlite.so
Sind diese vorhanden, so muss die php.ini angepasst werden
nano /opt/etc/php.ini
hier müssen diese Zeilen hinzugefügt werden. Am besten dort wo auch die anderen extensions geladen werden :
extension=pdo.so
extension=pdo_sqlite.so
extension=sqlite.so
Anschließend den webserver neu starten.
/opt/etc/init.d/S80thttpd restart
Das war es auch schon. Nun kann man wie folgt eine Datenbank laden oder anlegen
$db = sqlite_open("/opt/share/www/database/test.db") or die ("DB konnte nicht geöffnet werden");
Ist die Datenbankdatei vorhanden, so wird sie geladen, wenn nicht, dann wird sie automatisch erstellt.
Ich hoffe es war dem ein oder anderen eine Hilfe um sqlite zum Laufen zu bringen.
Liebe Grüße
Jeremia
Hi,
kannst du mal beschreiben, wie du den Zugriff dann gestaltet hast?
Und wie kannst die die DB Felder anlegen, verwalten?
Wie baust du per php die Verbingung zur DB auf?
Danke schonmal im Vorraus
PS.:
Danke für deine Anleitung
Hi,
ich muss zugeben, dass ich etwas zu schnell war mit der Bereitstellung der Anleitung. Ich habe gerade festgestellt, dass PHP zwar nun die sqlite funktionen versteht, aber so richtig funktionieren will das noch nicht. Ich schätze es liegt an einem Rechteproblem.
Damit das ganze überhaupt annähernd funktioniert habe ich folgendes gemacht:
mkdir /opt/share/www/dbtest
Dieses Verzeichnis benötigt schreibzugriff damit die Datenbank dort abgelegt werden kann
chmod 777 /opt/share/www/dbtest
In diese Verzeichnis habe ich folgendes Script abgelegt
test.php
//Die Verbindung zur Datenbank wird aufgebaut indem eine Datenbankdatei
//angegeben wird. Ist diese nicht vorhanden, wird sie automatisch erstellt
if ($db = sqlite_open('sqlitedb', 0666, $sqliteerror)) {
sqlite_query($db,'CREATE TABLE foo (bar varchar(10))');
sqlite_query($db,"INSERT INTO foo VALUES ('fnord')");
$result = sqlite_query($db,'select * from foo');
var_dump(sqlite_fetch_array($result));
sqlite_close($db);
} else {
die ($sqliteerror);
}
Dieses script öffnet also eine Datenbank, erstellt eine Tabelle, fügt einen Datensatz ein und gibt den Inhalt der Tabelle aus.
Rufe ich das Script nun mit dem Browser auf, erhalte ich folgende Meldung:
malformed database schema - unable to open a temporary database file for storing temporary tables
Schaut man in den Ordner /opt/share/www/dbtest, so befindet sich dort nun eine Datei namens "sqlitedb". Die Datenbank wurde also angelegt. Aber leider ist die Datei leer.
Also habe ich das Script mal lokal auf dem Router getestet
php /opt/share/www/dbtest/test.php
Folgendes wird dann ausgegeben
array(2) {
[0]=>
string(5) "fnord"
["bar"]=>
string(5) "fnord"
}
Dies ist genau das was ich auch erwartet hätte. Das Script scheint also zu funktionieren. Nur halt nicht wenn es vom Browser ausgeführt wird.
Ein wenig recherche hat ergeben, dass sqlite ein temp oder tmp Verzeichnis benötigt. Man kann dies wie folgt setzen.
putenv('tmp=/opt/www/share/dbtest/');
Da ich nicht genau weiß auf welche enviroment Variable zugegriffen wird, habe ich testweise gleich mehrere gesetzt.
putenv('tmp=/opt/www/share/dbtest/');
putenv('TMP=/opt/www/share/dbtest/');
putenv('temp=/opt/www/share/dbtest/');
putenv('TEMP=/opt/www/share/dbtest/');
Leider war das nicht die Lösung des Problems. Ich schätze das es sich um ein Rechteproblem vom thttpd handelt. Weil php selber das Script ja problemlos ausführen kann.
Hat da jemand noch eine Idee?
Liebe Grüße
Jeremia
Hi,
ich habe das Problem identifizieren können.
In der thttpd.conf ist die Option
user=nobody
gesetzt.
Wenn man das in
user = admin
ändert, dann funktioniert das auch mit dem Browser.
Gibt es eine Möglichkeit das zu umgehen, so das es auch mit user=nobody geht?
Ich habe schon mit chmod und chown rumgespielt, aber dies brachte leider nicht den gewünschten Erfolg.
Liebe Grüße
Jeremia
Hi,
so ich denke ich habe es hinbekommen. Ob das ganze so sicher ist, weiß ich nicht, aber so geht es.
Neuen Benutzer anlegen für den Webserver
adduser "website" -h /opt/share/www/
Dieser User hat somit nur Rechte im www verzeichnis
Anpassen der thttpd.conf
user=website
nun kann ich problemlos mit sqlite arbeiten.
Liebe Grüße
Jeremia
Hi,
es geht auch einfacher. Benutze httpd mit integriertem php5. Da musst Du überhaupt nichts machen, da sqlite in php5 integriert ist. Einfach das ipkg installieren und loslegen. Das wars.:)
So habe ich mir phprojekt auf den WL500gP portiert. Sqlite war die einzige Datenbank, die unter php vernünftig ansprechbar war. Ich musste nur den Datenbanktreiber von MySQL nach Sqlite portieren.
Norbert
Hallo Norbert/legolas,
kannst du uns eine kleine Anleitung geben, wie du das gemacht hast?
Hi,
wenn es Dir reicht nur php-Scripte ausserhalb des Webservers auszuführen, dann brauchst Du nur php als ipkg installieren. Dann ist es aber nicht ohne weiteres über httpd nutzbar.
Es gibt in der ipkg-Liste ein File php-thttpd. Das musst Du installieren. Es enthält ein in thttpd eincompiliertes php5. Dann geht php aber nur im thttpd-Web-Server.
Du kannst auch beides parallel installieren. Dann geht beides.
Gib dann einfach ein php-Script ein und los gehts. Du musst nix weiter konfigurieren.
Norbert
ok,
den webserver habe ich bereits installiert.
aber es fehlen noch felgende Schritte meine Meinung nach:
1. sql installieren
2. datenbank erstellen
3. in einer php datei verbindung aufbauen
4. abfrage durchführen
Kannst du mir jeden schritt ein bissl beschreiben?
WLAN-Fan
18-12-2007, 14:05
Hallo,
gibt es weitere Erkenntnisse?
Gruß.
tobitobsen
18-12-2007, 20:02
Jea endlich ne datenbank auf dem router. Ihr seit die besten !! :cool:
Ein wenig recherche hat ergeben, dass sqlite ein temp oder tmp Verzeichnis benötigt. Man kann dies wie folgt setzen.
putenv('tmp=/opt/www/share/dbtest/');
Da ich nicht genau weiß auf welche enviroment Variable zugegriffen wird, habe ich testweise gleich mehrere gesetzt.
putenv('tmp=/opt/www/share/dbtest/');
putenv('TMP=/opt/www/share/dbtest/');
putenv('temp=/opt/www/share/dbtest/');
putenv('TEMP=/opt/www/share/dbtest/');
Leider war das nicht die Lösung des Problems. Ich schätze das es sich um ein Rechteproblem vom thttpd handelt. Weil php selber das Script ja problemlos ausführen kann.
Also soweit ich weiß ist kein tmp-Verzeichnis vorgesehen. zumindest nicht in der form, dass du es über putenv(); in php setzen kannst. Ich bin bis jetzt immer davon ausgegangen, dass man nur das setzen kann, was via phpinfo() ausgegeben wird. Da wäre das einzige tmp-verzeihnis für file-upload. Verbessert mich, wenn ich falsch liege.
Hi,
es geht auch einfacher. Benutze httpd mit integriertem php5. Da musst Du überhaupt nichts machen, da sqlite in php5 integriert ist. Einfach das ipkg installieren und loslegen. Das wars.
So habe ich mir phprojekt auf den WL500gP portiert. Sqlite war die einzige Datenbank, die unter php vernünftig ansprechbar war. Ich musste nur den Datenbanktreiber von MySQL nach Sqlite portieren.
Norbert
nimm einfach Adodb als datenbankschnittstelle. dann kann es dir absolut egal sein, ob du da mysql, Oracle, sqlite oder noch was ganz anderes im hintergrund laufen hast.
btw verwechselst du da vielleicht die sqlite schnittstelle mit dem sql-server? - weil sqlite ist via pdo in php ansprechbar - keine frage. aber der server ist doch extra. oder wo stellst du bei sqlite die benuter ein? *confused*
Hi tobitobsen,
mit sqlite hast Du eigentlich keine Probleme mit den Rechten an der Datenbank. Im Grunde genommen legt sqlite nur eine Datei an, die vom thttpd aus ansprechbar (lesbar und schreibbar) sein sollte. Es reicht, wenn die Datei im Webserver-Verzeichnis liegt, in dem sich auch die http- und php-Skripte befinden.
Sqlite ist auch keine Datenbank im klassischen Sinne, da es keinen Datenbankserver gibt der Anfragen als Dienst bearbeitet. Es ist einfach nur eine Datei, die die Daten enthält und die über eine API unter PHP ansprechbar ist. Das ist ähnlich einer Microsoft Accsess MDB-Datei.
Es gibt keine Zugriffsverwaltung für die SQLite-Datenbank. Nur über die Rechte an der Datenbankdatei kann eingestellt werden, wer auf die Daten zugreifen darf. Typischer Weise ist das auf der WL-500gp der User admin, der auch den thttpd starten darf. Man muss also darauf achten, dass die SQLite Datenbankdatei die selben Rechte wie thttpd hat.
Ich benutze eine SQLite 2.0 Datenbankdatei. 3.0 oder höher lief nicht zufriedenstellnd. Es gibt auch für Windows einen Datenbank-Browser mit dem Namen sqlitebrowser. Die Version 1.1 kann SQLite 2.0 Datenbankdateien erzeugen und beliebig bearbeiten. In dem Tool lassen sich auch SQL-Befehle absetzen. Man kann darüber recht gut die Datenbankfunktionalität testen. In sqlitebrowser ist so zu sagen die SQLite-DLL zum ansprechen der Datenbankdatei bereits enthalten.
MySQL auf dem WL-500gP zu installieren, ist schon recht kniffelig. Im Ergebnis ist die MySQL-Datenbank im Vergleich zur SQLite sehr langsam, da der Prozessor-Speed und der Speicher recht begrenzt sind. SQLite ist da wesentlich schneller. Das hat mich dazu bewogen SQLite für PHProjekt zu nehmen. Ich hatte das Testweise auch mit MySQL ausprobiert.
Der Tip mit Adodb ist mir nicht neu. Grundsätzlich wäre das die bessere Art gewesen unabhängig vom Datenbanktyp auf die Datenbasis zuzugreifen. In PHProjekt wurde der Weg bewusst nicht genommen. Es wurde eine eigene API geschrieben, die die Datenbankzugriffe vereinheitlicht. Das hat den Vorteil, dass die Zugriffe schneller als bei Adodb sind. Das kommt auch der Performance auf dem WL-500gP zu Gute. Deshalb habe ich mir die Mühe gemacht die API zu erweitern.
Hier noch erwas Beispiel-Code:
<?php
// create new database (OO interface)
$db = new SQLiteDatabase("db.sqlite");
// create table foo and insert sample data
$db->query("BEGIN;
CREATE TABLE foo(id INTEGER PRIMARY KEY, name CHAR(255));
INSERT INTO foo (name) VALUES('Ilia');
INSERT INTO foo (name) VALUES('Ilia2');
INSERT INTO foo (name) VALUES('Ilia3');
COMMIT;");
// execute a query
$result = $db->query("SELECT * FROM foo");
// iterate through the retrieved rows
while ($result->valid()) {
// fetch current row
$row = $result->current();
print_r($row);
// proceed to next row
$result->next();
}
// not generally needed as PHP will destroy the connection
unset($db);
?>
Norbert
tobitobsen
23-12-2007, 10:05
Ah ok - wieder was gelernt. Hab bis jetzt immer mit MySQL gearbeitet. Wenn das sqlite eigentlich gar keinen Server braucht ists ja schon recht praktisch.
Mit Adodb ists mir nach dem Post auch aufgefallen. Damit zwingt man den Router wohl in die Knie.
Na dann werd ich mich mal dem sqlite annehmen. Deine Entdeckung mit dem sqlite kommt mir ganz gelegen. Hab für meinen VDR nen Interface auf dem Router liegen und musst bis jetzt alles in INI-Dateien speichern.
Wobei von der Idee ist das ja gar nicht so unterschiedlich - Datei auf Platte und wird mit einer Klasse angesprochen... Hm na mal schauen. ;)