habe grad selber was falsch gemacht.
Habe den Beitrag oben noch einmal komplett geändert.
Am Ende würde es ca 6 Dateien geben, die "verbindung.php" eingebunden haben.
habe grad selber was falsch gemacht.
Habe den Beitrag oben noch einmal komplett geändert.
Am Ende würde es ca 6 Dateien geben, die "verbindung.php" eingebunden haben.
Aktuell sieht es so aus:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
include('basics.php');
### Verbindung aufbauen ###
$connection = ssh2_connect('xxx.xxx.xxx.xx', 22);
ssh2_auth_password($connection, 'xxx', 'xxx');
$sftp = ssh2_sftp($connection);
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE seite = :seite");
$selectFehler->execute([":seite" => basename($_SERVER['PHP_SELF'])]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
### Verbindungsfehler eintragen ###
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE seite = :seite");
$result = $deleteError->execute(array(":seite" => basename($_SERVER['PHP_SELF'])));
print("Test");
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Verbindung zum Server fehlgeschlagen",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
?>
Alles anzeigen
Was ich nun nicht verstehe, wie ich für die verschiedenen Dateien, Datenbankeinträge machen kann. Also z.B für createFolder.php oder "createUser.php".
Weil er beim Aufrufen der Datei "verbindung.php" (Über Cronjob) Dann immer als ":seite" verbindung.php nutzt.
Das ganzer auch beim Löschen.
basename($_SERVER['PHP_SELF'])
Ja die habe ich ja bereits in eine eigene Datei getan.
aber um das zu löschen braucht er doch die variable $allefehler wo die Seiten ausgewählt sind.
die soll ich ja anscheinend nicht mit hinzufügen.
Ist auch egal. Ich lasse es sein.
Alles anzeigenIch jetzt auch mal
Genau das ist die Aufgabe des Scriptes, das du erstellen sollst. Da spielt createUser und createFolder überhaupt keine Rolle, vergiss es einfach. Dieses Script wird auch nur durch den Cronjob aufgerufen. Im Grunde ist das nur ein wenig Copy/Paste aus deinen vorhanden Scripten.
Aber solange du versuchst, das mit deinen exisitieren Scripten zu lösen, wird das nichts. Also nochmal: erstelle eine Script was genau diese beiden Anforderungen erfüllt, nicht mehr nicht weniger! Jetzt verstanden?
Nachtrag:
Das würde ich auch anders machen. Das Script schreibt grundsätzlich den Status in die DB, löschen würde ich da nichts. Auf diese Weise hättest du ein gewisses Logging und man könnte bei Problemen eventuell ein Muster erkennen.
welche Anforderungen den genau?
Danke für die Tipps werde es versuchen.
Gut ich mache es jetzt mal sehr ausführlich.
Ich habe als Beispiel Zwei Dateien. Die eine Datei heißt createFolder.php und die andere Datei heißt createUser.php.
In beiden Dateien werden unterschiedliche Aktionen ausgeführt. Wie der Dateiname es bereits schon erklärt.
Beide Dateien werden über einen Ajax Call aufgerufen. Ebenfalls von zwei unterschiedlichen Dateien.
Ich habe also die Datei verzeichnis.php wo über einen Ajax Call createFolder.php ausgeführt. wird. Das gleiche dann bei der Datei admin.php dort wird über einen Ajax Call die Datei createUser.php ausgeführt.
In den Dateien createFolder.php und createUser.php steht soweit immer das gleiche drin. In der createFolder.php wird ein Ordner erstellt auf meinem Linux Server. Bei createUser.php wird dann eben ein Benutzer in der Datenbank erstellt. Die Dateien sehen dann so aus.
(Beide sind wieder wie am Anfang. Ohne änderungen)
createFolder.php
<?php
setlocale(LC_CTYPE, "de_DE.UTF-8");
ini_set('display_errors', '1');
error_reporting(E_ALL);
include('basics.php');
# Verbindung zum PI herstellen #
$connection = ssh2_connect('xxx.xxx.xxx.xx', 22);
ssh2_auth_password($connection, 'xxx', 'xxx');
$sftp = ssh2_sftp($connection);
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite");
$selectFehler->execute([":seite" => "createFolder.php"]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
// Verbindungsfehler eintragen
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE seite = :seite");
$result = $deleteError->execute(array(":seite" => "createFolder.php"));
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Ordner erstellen - Serververbindung",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
$nameNeu = "Test Ordner";
$pfad = "Test123";
$createFolder = ssh2_exec($connection, "mkdir " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
?>
Alles anzeigen
createUser.php
<?php
setlocale(LC_CTYPE, "de_DE.UTF-8");
ini_set('display_errors', '1');
error_reporting(E_ALL);
# Einfügen der Datenbank und Benutzerdaten #
include('basics.php');
# Verbindung zum PI herstellen #
$connection = ssh2_connect('xxx.xxx.xxx.xx', 22);
ssh2_auth_password($connection, 'xxx', 'xxx');
$sftp = ssh2_sftp($connection);
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite");
$selectFehler->execute([":seite" => "createUser.php"]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE seite= :seite");
$result = $deleteError->execute(array(":seite" => "createUser.php"));
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Benutzer erstellen - Serververbindung",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
$nachname = $_POST['nachname'];
$vorname = $_POST['vorname'];
$rechte = $_POST['rechte'];
$sicherung = $_POST['sicherung'];
$passwort = $_POST['passwort'];
try{
$stmt = $dbv->prepare("INSERT INTO benutzer(nachname, vorname, passwort, rechte, sicherung, verzeichnis) VALUES (:nachname, :vorname, :passwort, :rechte, :sicherung, :verzeichnis)");
$result = $stmt->execute(
array(
":nachname" => $nachname,
":vorname" => $vorname,
":passwort" => $password_gehasht,
":rechte" => $rechte,
":sicherung" => $sicherung,
":verzeichnis" => $nachname
)
);
} catch(EXCEPTION $w){
echo "Ein Fehler ist aufgetreten: " . $w->getMessage();
exit();
}
?>
Alles anzeigen
In Beiden Dateien werden weitere Funktionen ausgeführt wenn ich diese aufrufe.
also wenn ich in den Browser auf die Seite createFolder.php gehe, wird zwar der Verbindungstest durchgeführt. Aber ebenfalls auch die $createFolder Variable. Das gleiche ebenfalls bei createUser.php
Und wie man sieht habe ich in beiden Dateien die Variable $alleFehler wo bei dem execute - Teil immer die Seite angegeben wird, in der sich diese Variable auch befindet.
Und ich wollte gerne das ich für diese Seiten jeweils Nur die Verbindung Testen kann, ohne die anderen Funktionen ebenfalls auszuführen.
Klar kann ich diese Abfrage in eine andere Datei schreiben, aber dann ist es das Problem mit der $alleFehler Variable.
Ich hoffe ich konnte es soweit veranschaulichen und verdeutlichen.
Das funktioniert auch.
Aber er muss ja auch irgendwie die Fehler wieder aus der Datenbank löschen.
Das macht er ja in diesem Teil.
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE fehlerCode = :fehlerCode");
$result = $deleteError->execute(array(":fehlerCode" => "1"));
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Ordner erstellen - Serververbindung",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
Alles anzeigen
Aber wenn ich diesen Teil noch hinzufügen in die Datei verbindungsTest.php dann macht er das nicht, weil er die Variable $alleFehler nicht hat.
Und diese Variable hat halt unterschiedliche Werte (:seite), weshalb ich die nicht auch noch dort hinzufügen kann.
In dem cronjob rufe ich ja ständig die Seite "verbindungsTest.php" auf.
Der Name dieser PHP-Datei liest sich doch viel versprechend: verbindungsTest.php Poste doch mal den Code darin, damit wir prüfen können, ob er geeignet ist.
PHPAlles anzeigen<?php # Verbindung zum PI herstellen # $connection = ssh2_connect('xxx.xxx.xxx.xx', 22); ssh2_auth_password($connection, 'xxx', 'xxx'); $sftp = ssh2_sftp($connection); $selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite"); $selectFehler->execute([":seite" => "createFolder.php"]); $alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC); // Verbindungsfehler eintragen if($sftp) { if($alleFehler) { $deleteError = $dbv->prepare("DELETE FROM fehler WHERE fehlerCode = :fehlerCode"); $result = $deleteError->execute(array(":fehlerCode" => "1")); } } else { if(!($alleFehler)) { $stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)"); $result = $stmt->execute( array( ":fehlerCode" => "1", ":fehlerName" => "Verbindungsfehler", ":beschreibung" => "Ordner erstellen - Serververbindung", ":seite" => basename($_SERVER['PHP_SELF']), ":datum" => date('d.m.y'), ":uhrzeit" => date('H:i:s') ) ); } } ?>
Ist halt das Thema das hier:
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite");
$selectFehler->execute([":seite" => "createFolder.php"]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
bei $selectFehler->execute([":seite" => "createFolder.php"]); immer eine andere Datei "seite" steht. z.b createFolder.php, createUser.php etc.
Die Datei "verbindungsTest.php" würde ich halt auch in diesen Dateien einbinden.
Deswegen weiß ich nicht ob ich den Teil in der verbindungsTest.php drin lassen kann.
Ja muss mal schauen
Ja das versuche ich ja irgendwie, allerdings weiß ich nicht wie.
Nein alle Dateien sind im selben Verzeichnis aber unterschiedliche Namen
Und die variable allefehler nutze ich in jeder Datei dort wird nur :seite geändert
Aber bei alleFehler ist das Problem
Ich habe das ganze in mehreren Dateien diese variable. Also unterschiedliche Einträge bei dem Eintrag Seite.
Würde es also reichen diesen Teil:
<?php
// Verbindungsfehler eintragen
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE fehlerCode = :fehlerCode");
$result = $deleteError->execute(array(":fehlerCode" => "1"));
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Ordner erstellen - Serververbindung",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
?>
Alles anzeigen
In eine Extra Datei zu tun, z.b verbindungsTest.php
Und dann die anderen Datein. (Hab ja mehrere mit unterschiedlichen Namen, wo ebenfalls dieser Test ausgeführt wird) so zu machen?
<?php
setlocale(LC_CTYPE, "de_DE.UTF-8");
ini_set('display_errors', '1');
error_reporting(E_ALL);
include('basics.php');
# Verbindung zum PI herstellen #
$connection = ssh2_connect('xxx.xxx.xxx.xx', 22);
ssh2_auth_password($connection, 'xxx', 'xxx');
$sftp = ssh2_sftp($connection);
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite");
$selectFehler->execute([":seite" => "createFolder.php"]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
include("verbindungsTest.php");
$nameNeu = "Test123";
$pfad = "Test Ordner";
$createFolder = ssh2_exec($connection, "mkdir " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
$changePerm = ssh2_exec($connection, "chmod 777 -R " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
}
?>
Alles anzeigen
Und dann alle 3 Stunden "verbindungsTest.php" neu aufrufen?
Und das halt für alle weiteren Dateien genau so?
// Edit
Funktioniert nicht wirklich. Wenn ich selber die verbindungsTest.php aufrufe, gibt es mir den HTTP Error 500 aus.
Ja das Ding ist halt dass in der Datei nicht nur diese Abfrage drin ist, sondern auch noch andere, die nicht alles 3 Stunden ausgeführt werden sollen
Und wie genau kann ich das machen?
Finde aktuell nur Befehle, die dann eine ganze Datei zu einer bestimmten Zeit ausführen.
Moin,
gibt es eine Möglichkeit eine IF Abfrage alle 3 Stunden auszuführen?
Habe in mehreren Dateien eine Abfrage ob die Verbindung zu meinem Linux Server vorhanden ist.
Wenn die Verbindung nicht vorhanden ist, wird ein Datenbank Eintrag erstellt.
Wenn die Verbindung Vorhanden ist und bereits ein Datenbank Eintrag vorhanden ist, wird dieser wieder gelöscht.
Allerdings wird ist diese Abfrage in einer Datei drin, die von einem Ajax aufgerufen wird.
In dem Fall "createFolder.php". Trotzdem würde ich gerne alle 3 Stunden Checken ob die Verbindung vorhanden ist, ohne ständig die ganze Datei ausführen zu müssen.
Hat da jemand einen Tipp?
Hier der Code:
<?php
setlocale(LC_CTYPE, "de_DE.UTF-8");
ini_set('display_errors', '1');
error_reporting(E_ALL);
include('basics.php');
# Verbindung zum PI herstellen #
$connection = ssh2_connect('xxx.xxx.xxx.xx', 22);
ssh2_auth_password($connection, 'xx', 'xxx');
$sftp = ssh2_sftp($connection);
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerCode, seite FROM fehler WHERE fehlerCode = 1 AND seite = :seite");
$selectFehler->execute([":seite" => "createFolder.php"]);
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
if($sftp) {
if($alleFehler) {
$deleteError = $dbv->prepare("DELETE FROM fehler WHERE fehlerCode = :fehlerCode");
$result = $deleteError->execute(array(":fehlerCode" => "1"));
}
} else {
if(!($alleFehler)) {
$stmt = $dbv->prepare("INSERT INTO fehler(fehlerCode, fehlerName, beschreibung, seite, datum, uhrzeit) VALUES (:fehlerCode, :fehlerName, :beschreibung, :seite, :datum, :uhrzeit)");
$result = $stmt->execute(
array(
":fehlerCode" => "1",
":fehlerName" => "Verbindungsfehler",
":beschreibung" => "Serververbindung fehlgeschlagen",
":seite" => basename($_SERVER['PHP_SELF']),
":datum" => date('d.m.y'),
":uhrzeit" => date('H:i:s')
)
);
}
}
$nameNeu = "Test123";
$pfad = "Test Ordner";
$createFolder = ssh2_exec($connection, "mkdir " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
sleep(1);
$changePerm = ssh2_exec($connection, "chmod 777 -R " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
?>
Alles anzeigen
Hey,
erst einmal Vielen Dank für die Antwort.
Leider funktioniert das leider nicht ganz.
Er zeigt nur "folderCreated" an. Obwohl kein Ordner erstellt wurde.
Wenn ich $createFolder auch ausgebe. Zeigt er nur dies an "resource(4) of type (stream)"
Auch das mit dem SweetAlert funktioniert noch nicht ganz.
LG
// Edit
Es klappt mittlerweile. Hab da aber noch eine Frage wegen dem Loader.
Wie mache ich dass, das solange der Ordner erstellt wird das Attribut "showLoaderOnConfirm" mit einfüge?
Das muss ja irgendwie mit einer Schleife gemacht werden, allerdings habe ich nichts gefunden, wie ich mit der while Schleife überprüfen ob als response "folderCreated" kommt.
Leider weiß ich aktuell nicht wie genau das gemacht wird.
Hat jemand einen Tipp?
Moin.
Ich habe mittels Ajax die Funktion gemacht, Ordner auf einem WebServer zu erstellen. (Mittels ssh2_exec)
Das klappt soweit auch ganz gut. Die Erstellung der Ordner ist in einer anderen Datei.
Ich wollte mal Fragen ob mir jemand helfen kann, wie ich Fehler ausgeben kann. Also z.b wenn der Ordner erstellt wurde gibt er dies auch aus als "SweetAlert". Allerdings zeigt er dies auch an, wenn der Ordner nicht erstellt wurde. Da wollte ich mal Fragen ob jemand eine Idee hat, wie ich den Fehler ausgeben kann wenn der Ordner nicht erstellt wurde.
Hier ist das Script:
<script>
$(document).ready(function() {
$("#ordnerErstellen").on("click", ".createOrdner", function() {
var hh = document.createElement("div");
var folder = <?php echo json_encode($datei) ?>;
var folder2 = folder.replace(/\s+/g, "%20");
var folderCreate = $('input[name="folderName"]').val();
swal.fire({
title: "Ordner erstellen?",
html: "",
icon: "warning",
closeOnClickOutside: false
}).then((create) => {
if (create) {
$.ajax({
type: "POST",
url: "includes/createFolder.php",
data: {
folderCreate: folderCreate,
folder: folder},
success: function(response) {
swal.fire({
title: "Fertig",
html: "Ordner wurde erstellt!",
icon: "success",
closeOnClickOutside: false
});
$('#myModal').modal('hide');
table.destroy();
$("#refreshData").load("verzeichnis.php?folder=" + folder2 + " #refreshData",
function() {
table = $('#verzeichnis').DataTable({
"order": [[ 2, "desc" ]],
"bLengthChange": false,
"dom": '<"pull-left"f><"pull-right"l>tip',
"bFilter": true,
"language": {
"url": "includes/German.json"
}
});
});
}
});
}
})
});
});
</script>
Alles anzeigen
Und die createFolder.php
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
include('basics.php');
# Verbindung zum PI herstellen #
$connection = ssh2_connect('###', 22);
ssh2_auth_password($connection, '###', '###');
$sftp = ssh2_sftp($connection);
$nameNeu = $_POST['folderCreate'];
$pfad = $_POST['folder2'];
// Ordner erstellen ohne Sicherungsordner
$createFolder = ssh2_exec($connection, "mkdir " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
sleep(1);
$changePerm = ssh2_exec($connection, "chmod 777 -R " . escapeshellarg("/media/Files/" . htmlspecialchars(ucfirst($userData["nachname"])) . "/" . $pfad . "/" . $nameNeu));
?>
Alles anzeigen
Würde mich freuen.
//Edit
gibt es noch die Möglichkeit einen Loader einzubauen? Damit die Abfrage erst weggeht, wenn der Ordner erstellt wurde?
Aktuell geht der Loader "showLoaderOnConfirm" direkt nach dem Klicken auf "Ok" weg.
LG
Moin,
schnelle Frage. Ich komme aktuell einfach nicht drauf.
Ich wollte Fragen wie ich überprüfen kann ob ein bestimmter Eintrag in der Datenbank vorhanden ist.
Habe die Tabelle "fehler" und ich wollte überprüfen ob dort ein Eintrag drin ist, wo die Spalte "fehlerCode" den Inhalt "VF" hat.
Also Wenn die Zeile vorhanden ist, soll als Print "Vorhanden" ausgegeben werden. Wenn nicht dann halt "Nicht vorhanden"
Ich komme aktuell einfach nicht drauf.
$selectFehler = $dbv->prepare("SELECT fehlerId, fehlerName, fehlerCode FROM fehler WHERE fehlerCode = 'VF'");
$alleFehler = $selectFehler->fetchAll(PDO::FETCH_ASSOC);
Bin aktuell nur soweit.
Wäre nett wenn jemand einen Tipp hätte.
LG
Jap danke. Habe upload_max_filesize mal hoch gesetzt.
Danke euch beiden.
Jap danke. Habe upload_max_filesize mal hoch gesetzt.
Danke euch beiden.
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.