159 votes

Erreur SQLite "tentative d'écrire dans une base de données en lecture seule" lors de l'insertion?

J'ai une base de données SQLite que j'utilise pour un site web. Le problème est que lorsque j'essaie de INSERT INTO dedans, j'obtiens une PDOException

SQLSTATE[HY000]: Erreur générale: 8 tentative d'écriture dans une base de données en lecture seule

J'ai utilisé SSH pour accéder au serveur et vérifier les autorisations, et la base de données a les autorisations

-rw-rw-r--

Je ne suis pas très familier avec les permissions *nix, mais je suis assez sûr que cela signifie

  • Pas un répertoire
  • Le propriétaire a les permissions de lecture/écriture (c'est moi, selon ls -l)
  • Le groupe a les permissions de lecture/écriture
  • Tout le monde d'autre a seulement les permissions de lecture

J'ai aussi cherché partout où je savais avec le programme sqlite3, et je n'ai rien trouvé de pertinent.

Parce que je ne savais pas avec quelles permissions PDO essaie d'ouvrir la base de données, j'ai fait

chmod o+w supplies.db

Maintenant, j'obtiens une autre PDOException:

SQLSTATE[HY000]: Erreur générale: 14 impossible d'ouvrir le fichier de base de données

Mais cela se produit SEULEMENT lorsque j'essaie d'exécuter une requête INSERT après l'ouverture de la base de données.

Des idées sur ce qui se passe?

0 votes

Fondamentalement, le httpd (apache > php > PDO) n'est pas vous, donc il ne possède pas le fichier, donc il n'a pas les permissions d'écriture... intéressant...

0 votes

sudo chgrp www-data test.db avec l'ajout des autorisations a fonctionné pour moi

0 votes

Cette erreur est également affichée si vous essayez d'accéder à une base de données supprimée

4voto

Thilo Points 60

J'ai eu cette erreur lorsque j'ai essayé d'écrire dans une base de données sur un système Android.

Apparemment, sqlite3 a besoin non seulement des autorisations d'écriture pour le fichier de la base de données et le répertoire contenant (comme @austin-hyde l'a déjà dit dans sa réponse) mais aussi de l'environnement variable TMPDIR doit pointer vers un répertoire (éventuellement accessible en écriture).

Sur mon système Android, je l'ai configuré ainsi : TMPDIR="/data/local/tmp" et maintenant mon script s'exécute comme prévu :)

Édition :

Si vous ne pouvez pas définir des variables d'environnement, vous pouvez utiliser l'une des autres méthodes répertoriées ici : https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations comme PRAGMA temp_store_directory = 'nom-du-répertoire';

2voto

shasi Points 1862

J'ai utilisé :

echo exec('whoami');

pour savoir qui exécute le script (disons le nom d'utilisateur), puis j'ai donné à l'utilisateur des autorisations sur l'ensemble du répertoire de l'application, comme :

sudo chown -R :username /var/www/html/myapp

2voto

l0pan Points 23

J'ai reçu la même erreur de la part d'IIS sous Windows 7. Pour corriger cette erreur, j'ai dû ajouter des autorisations de contrôle total au compte IUSR pour le fichier de base de données sqlite. Vous n'avez pas besoin de modifier les autorisations si vous utilisez sqlite sous webmatrix au lieu d'IIS.

0voto

Ray Brennan Points 189

(Pour les abonnés cherchant une réponse à une question similaire) Je construis une application C# .Net Core 6.0 WPF. J'ai placé le Sqlite.db3 sur le lecteur c:\ pour plus de commodité lors du développement. Pour écrire dans la base de données, je dois ouvrir Visual Studio 2019 en tant qu'Administrateur.

-1voto

user1290746 Points 31

J'ai obtenu ceci dans mon navigateur lorsque j'ai changé de http://localhost à http://145.900.50.20 (où 145.900.50.20 est mon adresse IP locale) et ensuite j'ai changé de nouveau à localhost -- il était nécessaire de rester avec l'adresse IP une fois que je l'avais changée une fois

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X