Fassung 1.4.2: die Systempruefung nennt die SQLite-Fassung
CMS quality / php (8.2) (push) Canceled after 0s
CMS quality / php (8.4) (push) Canceled after 0s
CMS quality / browser (push) Canceled after 0s
CMS quality / mysql (push) Canceled after 0s

Auf dem Hosting brach die Installation im dritten Schritt ab: near
"(": syntax error. Dort laeuft SQLite in einer Fassung vor 3.16, und
Doctrine liest das Schema mit Tabellenfunktionen wie
pragma_table_info(...), die es erst seit 3.16 gibt.

Die Pruefung nennt die gefundene Fassung jetzt vor der Wahl der
Datenbank, und der Datenbankschritt bietet SQLite gar nicht erst an,
wenn sie zu alt ist - mit dem Hinweis auf MySQL. Eine Voraussetzung,
die erst mitten in der Installation auffaellt, ist keine Pruefung wert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kantarciandClaude Opus 5 committed 2026-09-13 21:56:17 +02:00
1 parent c517173579
commit ea3dd4ddf2
7 files changed
+73 -3

No files matched your search

+6 -1
View File
@@ -76,7 +76,12 @@ final class InstallController extends AbstractController
'error' => $error,
'values' => $request->request->all(),
'mysql' => \extension_loaded('pdo_mysql'),
'sqlite' => \extension_loaded('pdo_sqlite'),
// SQLite nur, wenn die Fassung die Tabellenfunktionen kennt, mit denen Doctrine das
// Schema liest - sonst scheitert erst der naechste Schritt, und zwar unverstaendlich.
'sqlite' => \extension_loaded('pdo_sqlite') && null !== $this->installation->sqliteVersion()
&& version_compare((string) $this->installation->sqliteVersion(), Installation::MIN_SQLITE, '>='),
'sqliteVersion' => $this->installation->sqliteVersion(),
'minSqlite' => Installation::MIN_SQLITE,
...$this->token('datenbank'),
]);
}
+35
View File
@@ -71,6 +71,25 @@ final class Installation
* Every failing check names the file or path that has to change. A check that is merely
* advisable is marked as such, so a missing `proc_open` does not look like a reason to stop.
*/
/** Ab dieser Fassung kennt SQLite die Tabellenfunktionen, mit denen Doctrine das Schema liest. */
public const MIN_SQLITE = '3.16.0';
/** Die Fassung der eingebauten SQLite-Bibliothek, oder null wenn es keine gibt. */
public function sqliteVersion(): ?string
{
if (!extension_loaded('pdo_sqlite')) {
return null;
}
try {
$version = (new \PDO('sqlite::memory:'))->query('SELECT sqlite_version()')?->fetchColumn();
} catch (\PDOException) {
return null;
}
return is_string($version) ? $version : null;
}
public function checks(): array
{
$checks = [];
@@ -83,6 +102,22 @@ final class Installation
$drivers = array_values(array_intersect(['pdo_sqlite', 'pdo_mysql'], get_loaded_extensions()));
$checks[] = $this->check('Datenbanktreiber', [] !== $drivers, 'Weder pdo_sqlite noch pdo_mysql ist vorhanden. Ohne einen von beiden gibt es keine Datenbank.', true, implode(', ', $drivers));
// Die Fassung von SQLite, und zwar vor der Wahl der Datenbank. Doctrine liest das Schema
// mit Tabellenfunktionen wie `pragma_table_info(...)`; die gibt es erst seit SQLite 3.16
// (Januar 2017). Auf einem Hosting mit aelterem SQLite bricht sonst mitten in der
// Installation eine Abfrage mit `near "(": syntax error` ab - eine Meldung, die niemandem
// sagt, was zu tun ist. Gefunden auf einem echten Hosting, nicht hier.
$sqlite = $this->sqliteVersion();
if (null !== $sqlite) {
$checks[] = $this->check(
'SQLite-Fassung',
version_compare($sqlite, self::MIN_SQLITE, '>='),
sprintf('Gefunden: %s. Für eine SQLite-Datenbank wird mindestens %s gebraucht. Diese Installation läuft trotzdem – aber mit MySQL statt SQLite; eine Datenbank legt man beim Hoster im Kundenmenü an.', $sqlite, self::MIN_SQLITE),
false,
$sqlite,
);
}
$webp = extension_loaded('gd') && (gd_info()['WebP Support'] ?? false);
$checks[] = $this->check('GD mit WebP', $webp, 'Bilder werden beim Hochladen in WebP umgewandelt. Ohne GD mit WebP-Unterstützung schlägt jeder Upload fehl. Der Rest der Website funktioniert.', false);
$checks[] = $this->check('ZIP-Erweiterung', class_exists(\ZipArchive::class), 'Wird für Sicherungen als Archiv gebraucht. Ohne sie bleibt die Sicherung ein Verzeichnis.', false);