Saya memiliki database SQLite yang saya gunakan untuk situs web. Masalahnya adalah ketika saya mencobanya INSERT INTO
, saya mendapatkan filePDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Saya SSH ke server dan memeriksa izin, dan database memiliki izin
-rw-rw-r--
Saya tidak begitu paham dengan izin * nix, tapi saya cukup yakin artinya
- Bukan direktori
- Pemilik memiliki izin baca / tulis (itu saya, menurut
ls -l
) - Grup memiliki izin baca / tulis
- Semua orang hanya memiliki izin membaca
Saya juga mencari ke mana pun saya tahu untuk menggunakan sqlite3
program ini, dan tidak menemukan sesuatu yang relevan.
Karena saya tidak tahu dengan izin apa PDO mencoba membuka database, saya tahu
chmod o+w supplies.db
Sekarang, saya mendapatkan yang lain PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Tapi itu HANYA terjadi ketika saya mencoba mengeksekusi INSERT
query setelah database terbuka.
Ada ide tentang apa yang sedang terjadi?
sqlite
permissions
Austin Hyde
sumber
sumber
sudo chgrp www-data test.db
dengan menambahkan izin bekerja untuk sayaJawaban:
Masalahnya, ternyata, adalah bahwa driver PDO SQLite mengharuskan bahwa jika Anda akan melakukan operasi write (
INSERT
,UPDATE
,DELETE
,DROP
, dll), maka folder database berada di harus memiliki hak akses tulis, serta aktual file database.Saya menemukan informasi ini dalam komentar di bagian paling bawah halaman manual driver PDO SQLite .
sumber
.db
, a.db-shm
dan.db-wal
file, dan tentu saja direktori induk dari ketiganya, yang semuanya harus dapat ditulis oleh pengguna yang menjalankan program.Ini bisa terjadi jika pemilik file SQLite itu sendiri tidak sama dengan pengguna yang menjalankan skrip. Kesalahan serupa dapat terjadi jika seluruh jalur direktori (artinya setiap direktori di sepanjang jalan) tidak dapat ditulis.
Siapa pemilik file SQLite? Kamu?
Siapakah skrip yang dijalankan? Apache atau Tidak Ada?
sumber
file_put_contents('./foo.txt', 'Hello, world');
), yang akan menunjukkan kepada Anda siapa yang menjalankannya. Kemungkinannya adalah Anda harus memiliki skrip untuk membuat database SQLite. Ini mungkin latihan yang menghibur jika Anda sudah memiliki data dalam file Anda saat ini ...posix_getuid()
tidak berhasil juga.Bagi saya masalahnya adalah penegakan SELinux daripada izin. Kesalahan "database hanya baca" hilang setelah saya menonaktifkan penegakan, mengikuti saran yang dibuat oleh Steve V. dalam komentar pada jawaban yang diterima.
Setelah menjalankan perintah ini, semuanya bekerja sebagaimana mestinya (CentOS 6.3).
Masalah khusus yang saya temui adalah selama penyiapan Graphite. Saya telah memeriksa tiga kali bahwa pengguna apache dimiliki dan dapat menulis ke graphite.db saya dan direktori induknya. Tetapi sampai saya "memperbaiki" SELinux, yang saya dapatkan hanyalah pelacakan tumpukan yang menyebabkan: DatabaseError: mencoba menulis database hanya-baca
sumber
Ini dapat disebabkan oleh SELinux. Jika Anda tidak ingin menonaktifkan SELinux sepenuhnya, Anda perlu menyetel direktori db fcontext ke httpd_sys_rw_content_t.
sumber
Saya mendapat kesalahan ini ketika saya mencoba menulis ke database di sistem Android.
Rupanya sqlite3 tidak hanya membutuhkan izin menulis ke file database dan direktori yang berisi (seperti yang sudah dikatakan @ austin-hyde dalam jawabannya) tetapi juga variabel lingkungan
TMPDIR
harus mengarah ke direktori (mungkin dapat ditulis).Di sistem Android saya, saya menyetelnya ke
TMPDIR="/data/local/tmp"
dan sekarang skrip saya berjalan seperti yang diharapkan :)Edit:
Jika Anda tidak dapat mengatur variabel lingkungan, Anda dapat menggunakan salah satu metode lain yang tercantum di sini: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations like
PRAGMA temp_store_directory = 'directory-name';
sumber
Saya mendapat kesalahan yang sama dari IIS di bawah windows 7. Untuk memperbaiki kesalahan ini saya harus menambahkan izin kontrol penuh ke akun IUSR untuk file database sqlite. Anda tidak perlu mengubah izin jika Anda menggunakan sqlite di bawah matriks web, bukan IIS.
sumber
Singkatnya, saya telah memperbaiki masalah dengan meletakkan file database (* .db) dalam subfolder.
sumber
Saya mendapatkan ini di browser saya ketika saya mengubah dari menggunakan http: // localhost ke http://145.900.50.20 (di mana 145.900.50.20 adalah alamat IP lokal saya) dan kemudian mengubahnya kembali ke localhost - itu perlu untuk tetap dengan Alamat IP setelah saya mengubahnya sekali
sumber
Saya menggunakan:
untuk mengetahui siapa yang menjalankan skrip (katakanlah nama pengguna), dan kemudian berikan izin pengguna ke seluruh direktori aplikasi, seperti:
Semoga ini bisa membantu seseorang di luar sana.
sumber