Ich bin gerade über folgende Falle gestolpert:
Der Connect mit
$pdo = new PDO( 'sqlite:' . $SQLite3File )
hat funktioniert.
Aber jeder Versuch, an der Datenbank etwas zu ändern warf nur folgenden Fehler:
"attempt to write a readonly database…"
Merkwürdig: Die Datei war von jedem les- und schreibbar.
Die Lösung: Der mysqli-Treiber will zwecks locking im Verzeichnis eine Flag-Datei anlegen, mit welcher signalisiert, dass diese Datei gerade schreibend benutzt wird. Also muss auch das Verzeichnis vom Webserver beschreibbar sein.
Ich hab das jetzt wie folgt gelöst:
<?php
if ( ! $pdo = PDOSQLite3Connect (
    SQLite3File,
    PDOReadOnly,
    E_USER_ERROR
) ) {
	exit;
}
function PDOSQLite3Connect ( $SQLite3File, $PDOReadOnly ) {
	if ( ! $PDOReadOnly ) {
		if ( ! is_writable( $SQLite3File ) ) {
			error_log( '(PDO): Datei "' . $SQLite3File . '/" muss beschreibbar sein.' );
			showErrorMsg();
			return false;
		}
		if ( ! is_writable( dirname( $SQLite3File ) ) ) {
			error_log( '(PDO): Verzeichnis "' . dirname( $SQLite3File ) . '" muss beschreibbar sein.' );
			showErrorMsg();
			return false;
		}
	}
	if ( ! $pdo = new PDO( 'sqlite:' . $SQLite3File ) ) {
		error_log( 'Datenbankverbindung zu "sqlite:' . SQLite3File . '" hat nicht funktioniert.' ); 
		showErrorMsg();
		return false;
	} else {
		return $pdo;
	}
}
showErrorMsg() zeigt ohne Optionen einen "allgemeinen" Server-Fehler an.
FRAGE:
Geht das eleganter?
Zweitens ein Tipp:
Bei Fummeln und testen bin ich über Folgendes gestolpert: In SQLITE gibt es kein TRUNCATE. Der oft gelesene Tipp, die Tabelle mit
DELETE FROM table;
zu löschen leert zwar die Tabelle, lässt aber den (letzten) Autoindex stehen.
Will man den auch löschen, dann geht das so:
DELETE FROM table;
DELETE FROM SQLITE_SEQUENCE WHERE name='table';
 nicht angemeldet
 nicht angemeldet Rolf B
 Rolf B Christian Kruse
 Christian Kruse