У меня есть база данных SQLite, которую я использую для веб-сайта. Проблема в том, что когда я пытаюсь INSERT INTO
это сделать, я получаюPDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Я подключился по SSH к серверу и проверил разрешения, а у базы данных есть разрешения
-rw-rw-r--
Я не очень знаком с разрешениями * nix, но уверен, что это означает
- Не каталог
- Владелец имеет права на чтение / запись (по словам меня
ls -l
) - У группы есть права на чтение и запись
- У всех остальных есть только права на чтение
Я также искал везде, где знал об использовании sqlite3
программы, и не нашел ничего подходящего.
Поскольку я не знал, с какими разрешениями PDO пытается открыть базу данных, я сделал
chmod o+w supplies.db
Теперь я получаю еще одно PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Но это происходит ТОЛЬКО, когда я пытаюсь выполнить INSERT
запрос после открытия базы данных.
Есть идеи о том, что происходит?
sqlite
permissions
Остин Хайд
источник
источник
sudo chgrp www-data test.db
с добавлением разрешений у меняОтветы:
Проблема, как выясняется, является то , что драйвер PDO SQLite требует , что если вы собираетесь делать операцию записи (
INSERT
,UPDATE
,DELETE
,DROP
и т.д.), то папка базы данных постоянно находится в должен иметь права на запись, а также фактическое файл базы данных.Я нашел эту информацию в комментарии в самом низу страницы руководства по драйверу PDO SQLite .
источник
.db
a.db-shm
и a.db-wal
, и, конечно же, родительский каталог из трех, который должен быть доступен для записи пользователю, запускающему программу.Это может произойти, если владелец самого файла SQLite не совпадает с пользователем, запускающим сценарий. Подобные ошибки могут возникнуть, если нельзя записать весь путь к каталогу (то есть каждый каталог по пути).
Кому принадлежит файл SQLite? Вы?
От кого запущен сценарий? Апач или никто?
источник
file_put_contents('./foo.txt', 'Hello, world');
), который покажет вам, от кого он работает. Скорее всего, вам понадобится скрипт для создания базы данных SQLite. Это может быть интересным упражнением, если у вас уже есть данные в вашем текущем файле ...posix_getuid()
тоже не работает.Для меня проблема заключалась в применении SELinux, а не в разрешениях. Ошибка «база данных только для чтения» исчезла, как только я отключил принудительное исполнение, следуя предложению Стива В. в комментарии к принятому ответу.
После запуска этой команды все заработало, как задумано (CentOS 6.3).
Конкретная проблема, с которой я столкнулся, возникла во время установки Graphite. Я трижды проверил, владеет ли пользователь apache и может ли он писать как в мой graphite.db, так и в его родительский каталог. Но пока я не "исправил" SELinux, все, что у меня было, это трассировка стека с эффектом: DatabaseError: попытка записи базы данных только для чтения
источник
Это может быть вызвано SELinux. Если вы не хотите полностью отключать SELinux, вам необходимо установить для каталога db fcontext значение httpd_sys_rw_content_t.
источник
Я получил эту ошибку, когда попытался записать в базу данных в системе Android.
По-видимому, sqlite3 не только нужны разрешения на запись в файл базы данных и содержащий каталог (как уже сказал @ austin-hyde в своем ответе), но и переменная среды
TMPDIR
должна указывать на (возможно, доступный для записи) каталог.В моей системе Android я установил его,
TMPDIR="/data/local/tmp"
и теперь мой скрипт работает, как ожидалось :)Редактировать:
Если вы не можете установить переменные среды, вы можете использовать один из других методов, перечисленных здесь: https://www.sqlite.org/tempfiles.html# Contemporary_file_storage_locations, например
PRAGMA temp_store_directory = 'directory-name';
источник
Я получил ту же ошибку от IIS под Windows 7. Чтобы исправить эту ошибку, мне пришлось добавить разрешения на полный контроль учетной записи IUSR для файла базы данных sqlite. Вам не нужно менять разрешения, если вы используете sqlite под веб-матрицей вместо IIS.
источник
Таким образом, я решил проблему, поместив файл базы данных (* .db) во вложенную папку.
источник
Я получил это в своем браузере, когда перешел с http: // localhost на http://145.900.50.20 (где 145.900.50.20 - мой локальный IP-адрес), а затем снова вернулся на localhost - необходимо было остаться с IP-адрес после того, как я сменил на него однажды
источник
Я использовал:
чтобы узнать, кто запускает сценарий (скажем, имя пользователя), а затем предоставил пользователю разрешения на весь каталог приложения, например:
Надеюсь, это поможет кому-то там.
источник