Mam bazę danych SQLite, której używam na stronie internetowej. Problem polega na tym, że kiedy próbuję INSERT INTO
, otrzymuję plikPDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Dostałem SSH do serwera i sprawdziłem uprawnienia, a baza danych ma uprawnienia
-rw-rw-r--
Nie znam uprawnień * nix, ale jestem pewien, że to oznacza
- To nie jest katalog
- Właściciel ma uprawnienia do odczytu / zapisu (według mnie to ja
ls -l
) - Grupa ma uprawnienia do odczytu / zapisu
- Wszyscy inni mają tylko uprawnienia do odczytu
Rozejrzałem się też wszędzie, gdzie znałem sqlite3
program, i nie znalazłem nic odpowiedniego.
Ponieważ nie wiedziałem, z jakimi uprawnieniami PDO próbuje otworzyć bazę danych, tak zrobiłem
chmod o+w supplies.db
Teraz dostaję inny PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Ale dzieje się to TYLKO wtedy, gdy próbuję wykonać INSERT
zapytanie po otwarciu bazy danych.
Jakieś pomysły na temat tego, co się dzieje?
sqlite
permissions
Austin Hyde
źródło
źródło
sudo chgrp www-data test.db
z dodawaniem uprawnień działało dla mnieOdpowiedzi:
Problem, jak się okazuje, jest to, że sterownik PDO SQLite wymaga, że jeśli masz zamiar zrobić operacji zapisu (
INSERT
,UPDATE
,DELETE
,DROP
, etc), a następnie folder bazy danych rezyduje w musi mieć uprawnienia do zapisu, jak również rzeczywiste plik bazy danych.Znalazłem tę informację w komentarzu na samym dole strony podręcznika sterownika PDO SQLite .
źródło
.db
, a.db-shm
i.db-wal
oczywiście katalog nadrzędny z tych trzech, które muszą być zapisywalne dla użytkownika uruchamiającego program.Może się to zdarzyć, gdy właściciel pliku SQLite sam w sobie jest nie tak samo jak użytkownik uruchomiony skrypt. Podobne błędy mogą wystąpić, jeśli nie można zapisać całej ścieżki katalogu (czyli każdego katalogu po drodze).
Kto jest właścicielem pliku SQLite? Ty?
Dla kogo działa skrypt? Apache czy nikt?
źródło
file_put_contents('./foo.txt', 'Hello, world');
), który pokaże ci, jako działa. Istnieje duże prawdopodobieństwo, że skrypt utworzy bazę danych SQLite. To może być zabawne ćwiczenie, jeśli masz już dane w swoim bieżącym pliku ...posix_getuid()
też nie działa.Dla mnie problemem było raczej egzekwowanie SELinuksa niż uprawnienia. Błąd „bazy danych tylko do odczytu” zniknął po wyłączeniu wymuszania, zgodnie z sugestią Steve'a V. w komentarzu do zaakceptowanej odpowiedzi.
Po uruchomieniu tego polecenia wszystko działało zgodnie z przeznaczeniem (CentOS 6.3).
Konkretny problem, który napotkałem, dotyczył konfiguracji Graphite. Potrójnie sprawdziłem, czy użytkownik Apache jest właścicielem i może pisać zarówno w moim graphite.db, jak iw jego katalogu nadrzędnym. Ale dopóki nie "naprawiłem" SELinuksa, jedyne co otrzymałem to ślad stosu w wyniku: DatabaseError: próba napisania bazy danych tylko do odczytu
źródło
Może to być spowodowane przez SELinux. Jeśli nie chcesz całkowicie wyłączać SELinuksa, musisz ustawić katalog db fcontext na httpd_sys_rw_content_t.
źródło
Otrzymałem ten błąd, gdy próbowałem pisać do bazy danych w systemie Android.
Najwyraźniej sqlite3 nie tylko potrzebuje uprawnień do zapisu w pliku bazy danych i katalogu zawierającego (jak @ austin-hyde już powiedział w swojej odpowiedzi), ale także zmienna środowiskowa
TMPDIR
musi wskazywać na katalog (prawdopodobnie zapisywalny).W moim systemie Android ustawiłem to na
TMPDIR="/data/local/tmp"
i teraz mój skrypt działa zgodnie z oczekiwaniami :)Edytować:
Jeśli nie możesz ustawić zmiennych środowiskowych, możesz użyć jednej z innych metod wymienionych tutaj: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations, np.
PRAGMA temp_store_directory = 'directory-name';
źródło
Otrzymałem ten sam błąd z IIS pod Windows 7. Aby naprawić ten błąd, musiałem dodać pełne uprawnienia kontrolne do konta IUSR dla pliku bazy danych sqlite. Nie musisz zmieniać uprawnień, jeśli używasz sqlite pod webmatrix zamiast IIS.
źródło
Podsumowując, rozwiązałem problem, umieszczając plik bazy danych (* .db) w podfolderze.
źródło
Dostałem to w mojej przeglądarce, kiedy zmieniłem z http: // localhost na http://145.900.50.20 (gdzie 145.900.50.20 to mój lokalny adres IP), a następnie zmieniłem z powrotem na localhost - konieczne było pozostanie przy Adres IP raz zmieniłem na ten raz
źródło
Użyłem:
aby dowiedzieć się, kto uruchamia skrypt (powiedzmy nazwę użytkownika), a następnie nadał użytkownikowi uprawnienia do całego katalogu aplikacji, na przykład:
Mam nadzieję, że to komuś pomoże.
źródło