Ich habe eine SQLite-Datenbank, die ich für eine Website verwende. Das Problem ist, dass INSERT INTO
ich eine bekomme , wenn ich es versuchePDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Ich habe SSH in den Server und überprüfte Berechtigungen, und die Datenbank hat die Berechtigungen
-rw-rw-r--
Ich bin mit * nix-Berechtigungen nicht so vertraut, aber ich bin mir ziemlich sicher, dass dies bedeutet
- Kein Verzeichnis
- Der Besitzer hat Lese- / Schreibberechtigungen (das bin ich laut
ls -l
) - Die Gruppe verfügt über Lese- / Schreibberechtigungen
- Alle anderen haben nur Leseberechtigungen
Ich habe auch überall gesucht, wo ich wusste, dass ich das sqlite3
Programm verwenden kann, und nichts Relevantes gefunden.
Da ich nicht wusste, mit welchen Berechtigungen PDO versucht, die Datenbank zu öffnen, habe ich es getan
chmod o+w supplies.db
Jetzt bekomme ich noch einen PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Es tritt jedoch NUR auf, wenn ich versuche, eine INSERT
Abfrage auszuführen, nachdem die Datenbank geöffnet ist.
Irgendwelche Ideen, was los ist?
quelle
sudo chgrp www-data test.db
mit dem Hinzufügen von Berechtigungen für mich gearbeitetAntworten:
Das Problem, wie sich herausstellt, ist , dass die PDO SQLite - Treiber erfordert , dass , wenn Sie einen Schreibvorgang tun werden (
INSERT
,UPDATE
,DELETE
,DROP
usw.), dann werden die Ordner der Datenbank in wohnt Schreibrechte haben muss, sowie die tatsächlichen Datenbankdatei.Ich habe diese Informationen in einem Kommentar ganz unten auf der PDO SQLite-Treiberhandbuchseite gefunden .
quelle
.db
a.db-shm
und a.db-wal
, und natürlich über das übergeordnete Verzeichnis der drei Dateien, die für den Benutzer, der das Programm ausführt , alle beschreibbar sein müssen.Dies kann passieren, wenn der Eigentümer der SQLite-Datei selbst nicht mit dem Benutzer identisch ist, der das Skript ausführt. Ähnliche Fehler können auftreten, wenn nicht der gesamte Verzeichnispfad (dh jedes Verzeichnis auf dem Weg) beschrieben werden kann.
Wem gehört die SQLite-Datei? Du?
Als wen läuft das Skript? Apache oder niemand?
quelle
file_put_contents('./foo.txt', 'Hello, world');
) erstellen , die Ihnen zeigt, als wen es ausgeführt wird. Möglicherweise muss das Skript die SQLite-Datenbank erstellen. Dies kann eine unterhaltsame Übung sein, wenn Sie bereits Daten in Ihrer aktuellen Datei haben ...posix_getuid()
funktioniert auch nicht.Für mich ging es eher um die Durchsetzung von SELinux als um Berechtigungen. Der Fehler "Nur-Lese-Datenbank" verschwand, nachdem ich die Durchsetzung deaktiviert hatte, gemäß dem Vorschlag von Steve V. in einem Kommentar zur akzeptierten Antwort.
Bei Ausführung dieses Befehls funktionierte alles wie vorgesehen (CentOS 6.3).
Das spezielle Problem, auf das ich gestoßen war, war beim Einrichten von Graphite. Ich hatte dreimal überprüft, ob der Apache-Benutzer Eigentümer war und sowohl in meine graphite.db als auch in das übergeordnete Verzeichnis schreiben konnte. Aber bis ich SELinux "repariert" habe, war alles, was ich bekam, eine Stapelverfolgung mit dem Effekt von: DatabaseError: Versuch, eine schreibgeschützte Datenbank zu schreiben
quelle
Dies kann durch SELinux verursacht werden. Wenn Sie SELinux nicht vollständig deaktivieren möchten, müssen Sie das Datenbankverzeichnis fcontext auf httpd_sys_rw_content_t setzen.
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, in eine Datenbank auf einem Android-System zu schreiben.
Anscheinend benötigt sqlite3 nicht nur Schreibberechtigungen für die Datenbankdatei und das enthaltende Verzeichnis (wie @ austin-hyde bereits in seiner Antwort sagte), sondern auch die Umgebungsvariable
TMPDIR
muss auf ein (möglicherweise beschreibbares) Verzeichnis verweisen.Auf meinem Android-System habe ich es eingestellt
TMPDIR="/data/local/tmp"
und jetzt läuft mein Skript wie erwartet :)Bearbeiten:
Wenn Sie keine Umgebungsvariablen festlegen können, können Sie eine der anderen hier aufgeführten Methoden verwenden: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations like
PRAGMA temp_store_directory = 'directory-name';
quelle
Ich habe den gleichen Fehler von IIS unter Windows 7 erhalten. Um diesen Fehler zu beheben, musste ich dem IUSR-Konto für SQLite-Datenbankdateien Vollzugriffsberechtigungen hinzufügen. Sie müssen die Berechtigungen nicht ändern, wenn Sie SQLite unter Webmatrix anstelle von IIS verwenden.
quelle
Zusammenfassend habe ich das Problem behoben, indem ich die Datenbankdatei (* .db) in einen Unterordner gestellt habe.
quelle
Ich habe dies in meinem Browser erhalten, als ich von http: // localhost zu http://145.900.50.20 (wobei 145.900.50.20 meine lokale IP-Adresse ist) gewechselt und dann wieder zu localhost gewechselt habe - es war notwendig, bei der zu bleiben IP-Adresse, nachdem ich diese einmal geändert hatte
quelle
Ich benutzte:
Um herauszufinden, wer das Skript ausführt (z. B. Benutzername), und dem Benutzer dann Berechtigungen für das gesamte Anwendungsverzeichnis zu erteilen, wie z.
Hoffe das hilft jemandem da draußen.
quelle