Synchronisieren Todo - Reise als PHP - Startseite auf Handy sichtbar - Mail htm + plainText - Termine-Seiten gleich groß gestalten, ev. formalisieren mit Bild - Zurück-Button in Kontaktformular - Zurück-Button als PHP-Funktion - "Newsletter abonieren" - Menü (Sidebar) verbessern: Sidebar von index.php ist jetzt unterhalb? - Seite bunter gestalten: happy-salsa.com - Vorschlag: www.ausflug-reisen-rostock.de - Home: https://swinegelreisen-rostock.de - Web Lima-City: https://www.lima-city.de/ User: Swinegelreisen; Passwort: Nahreisen1 - Web Swinegelreisen www.swinegelreisen-rostock.de Administration: www.swinegelreisen-rostock.de/Termine/admin.php - FTP-Server: unter "FTP-Zugangsdaten" - https://www.lima-city.de/usercp/ftp-accounts swinegelreisen.lima-ftp.de: swinegelreisen / xm3MNbZz8L Verzeichnis: default-website - MySQL-Datenbanken: PhpAdmin RK1: TrayIcon-WampServer => PhpMyAdmin => Reiter "SQL" Login: root / [ohne Passwort] Datenbank: dbreisen Lima-City: https://www.lima-city.de/ => Datenbanken => PhpMyAdmin unter "Datenbanken-Benutzer" "swinegelreisen.lima-db.de" (lokal "localhost"), Zugang: Port 3306, User: USER446406_0000, Pwd: Nahreisen1000 Datenbank: db_446406_1 (dbreisen) Datenbank erstellen: https://www.lima-city.de/usercp/database_users - E-Mail-Postfächer für Domains: unter "E-Mail" - https://www.lima-city.de/usercp/email - Support support@lima-city.de; +49 421/40 89 99 94; (Mo-Fr von 8:00-17:00 Uhr) TrafficPlex GmbH, Konsul-Smidt-Str. 90, 28217 Bremen Tel: 0421/40899994, Fax: 0421/40899459, USt-ID: DE274078422 HR Bremen B: 26671, Geschäftsführer: Phillipp Röll https://www.lima-city.de/ - Email-Verbindung Swinegelreisen-Rostock@outlook.de / Stachelig13 Domain: www.swinegelreisen-rostock.de Für die Nutzung von IMAP (empfohlen) Posteingangsserver (IMAP): Hostname: imap-mail.outlook.com, Port: 993, Verschlüsselung: SSL/TLS Authentifizierung: Moderne Thunderbird‑Versionen setzen hier meist auf OAuth2 (alternativ kann auch das Standard‑Kennwort verwendet werden) Benutzername: Vollständige E‑Mail-Adresse (also Swinegelreisen‑Rostock@outlook.de) Posteingangsserver (POP3): Hostname: pop-mail.outlook.com, Port: 995, Verschlüsselung: SSL/TLS, Authentifizierung: Entsprechend OAuth2 oder mittels Kennwort Für den Versand (SMTP) - Postausgangsserver (SMTP): Hostname: smtp-mail.outlook.com, Port: 587, Verschlüsselung: STARTTLS Authentifizierung: Hier wird ebenfalls meist OAuth2 verwendet; alternativ erfolgt die Authentifizierung über dein Kennwort Benutzername: Auch hier ist die vollständige E‑Mail-Adresse anzugeben Gegeben sind Email-Daten in folgenden Variablen $email_server;// Outlook SMTP-Server $email_user;// SMTP-Benutzername $email_pwd; // SMTP-Passwort $email_port;// TCP-Port (587 für TLS) Erstelle eine PHP-function: SendEmailViaPhpMailer($to, $subject, $body) mit Parametern: $to; // Email-Adresse des Empfängers $subject;// Titel der Email $body;// Nachrichtentext Verwende PHPAdmin mit OAuth2. Liste der vorhandenen Datenbanken SHOW DATABASES; Lima-City: db_446406_1 Erzeuge ein MySQL-Script, das eine Tabelle "travel" angelegt. Die Tabelle soll folgende Felder haben: travelkey: ein Unicode-Stringfeld als Primary-Key title: ein nichtleeres Unicode-Stringfeld mit max. 100 Zeichen startpoint: Unicode-Stringfeld mit max. 100 Zeichen startdate: ein nichtleeres Datumsfeld participant_count: Ein berechnetes Integer-Feld, dass aus der Anzahl der Datensätze in der Tabelle "participant" mit participant.travel = travelkey berechnet. CREATE TABLE db_446406_1.travel ( travelkey VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL PRIMARY KEY, title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, startpoint VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, destination VARCHAR(100),-- Reiseziel z.B. Bad Doberan startdate DATE NOT NULL, starttime TIME NOT NULL, endtime TIME, price INT -- Preis in ganzen Euros, priceComment VARCHAR(255), -- Kommentar z.B. "inklusive xyz" imageFileName VARCHAR(255), -- Dateiname des Bildes, dass oben bei der Reisebeschreibung angezeigt wird description TEXT, -- Text in der Reisebeschreibung confirmMail1 VARCHAR(8000), -- Bemerkungsbereich in Bestätigungsmail ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ALTER TABLE `db_446406_1`.`travel` ADD COLUMN `confirmMail1` VARCHAR(8000); -- Bemerkungsbereich in Bestätigungsmail ALTER TABLE `dbreisen`.`travel` ADD COLUMN `destination` VARCHAR(100); -- Ziel z.B. Bad Doberan ADD COLUMN `imageFileName` VARCHAR(255); -- Dateiname des Bildes, dass oben bei der Reisebeschreibung angezeigt wird ADD COLUMN `description` TEXT; -- Text in der Reisebeschreibung ADD COLUMN `priceComment` VARCHAR(255); -- Kommentar z.B. "inklusive xyz" USE dbreisen; CREATE TABLE db_446406_1.participant ( id INT PRIMARY KEY, travel VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,-- z.B. 2025-06-02-Bath name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,-- Name des Teinehmers zum Abgleich auf Überweisung telephone VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,-- Telefonnummer email VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, payed BOOLEAN NOT NULL DEFAULT FALSE,-- wurde schon bezahlt? inserted DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Eine View erstellen, die den berechneten Wert "participant_count" enthält USE db_446406_1; CREATE VIEW travel_with_counts AS SELECT t.travelId, t.travelkey, t.title, t.startpoint, t.startdate, t.starttime, t.endtime, t.price, ( SELECT COUNT(*) FROM participant p WHERE p.travelId = t.travelId ) AS participant_count FROM travel t; Deklariere in einem MySQL-Script das Feld participant.travel als ForeignKey von travel.travelkey. USE dbreisen; ALTER TABLE participant ADD CONSTRAINT fk_participant_travel FOREIGN KEY (travel) REFERENCES travel(travelkey) ON UPDATE CASCADE ON DELETE RESTRICT; Erzeuge ein MySQL-Sript zum Einfügen eines neuen Datensatzes. INSERT INTO dbreisen.participant (travel, name, telephone, email) VALUES ('2025-06-02-Bath', 'Max Mustermann', '01701234567', 'max.mustermann@example.com'); select * from dbreisen.participant; USE db_446406_1; CREATE TABLE config ( id INT AUTO_INCREMENT PRIMARY KEY, participantNextId INT NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO config (participantNextId) VALUES (1000); USE db_446406_1; CREATE TABLE newsletter ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Die generierte PHP-Seite soll als "participant.php" gespeichert werden. Generiere eine PHP-Seite "source.php", die einen 3 Schaltflächen mit den Titeln "2025-06-01", "2025-06-02" und "2025-06-03" enthält. Beim Drücken einer der Schaltfläche soll der participant-Wert '2025-06-01-Bath' bzw. '2025-06-02-Bath' bzw. '2025-06-03-Bath' '2025-06-02-Bath' an das Script "participant.php" übergeben werden. Ändere "participant.php" so um, dass der participant-Wert von "source.php" empfangen wird. Erzeuge ein SQL-Script, das der Tabelle "participant" eine boolean-Spalte "payed" hinzufügt. Der Default-Wert soll false sein. Erzeuge eine PHP-Seite "all_participants.php", welche alle Datensätze der Tabelle "participant" auflistet. Am Ende jeder Zeile der Tabelle soll ein Button "Bezahlt" sein, welche den Wert im Feld "payed" dieses Datensatzes auf true setzt. Falls der Wert von "payed" in der Zeile schon true ist, soll der Button nicht dargestellt werden. Nachdem der Button "Bezahlt" gedrückt wurde und der Datenbankeintrag erfolgt ist, soll die Seite neu dargestellt werden. Generiere eine PHP-Funktion "RefPhpGet", welche die folgende Funktion "Ref" um die Parameter $sParamName und $sParamValue verwendet: function Ref($sFile, $sPrompt) { echo '' . htmlspecialchars($sPrompt) . ''; } function Folder($sFile) { return "Termine/" . $sFile; } Die Funktion soll einen Link ausgeben, welche eine PHP-Seite $sFile aufruft, in der $sParamName (im Beispiel "travel") verwendet werden kann. Beispiel für eine PHP-Seite, in der "travel" verwendet wird: if ($_SERVER["REQUEST_METHOD"] === "GET" && isset($_GET["travel"])) Eine MySQL-Tabelle wurde folgendermaßen angelegt: CREATE TABLE dbreisen.participant ( id INT PRIMARY KEY, travel VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,-- z.B. 2025-06-02-Bath name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,-- Name des Teinehmers zum Abgleich auf Überweisung telephone VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,-- Telefonnummer email VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, payed BOOLEAN NOT NULL DEFAULT FALSE,-- wurde schon bezahlt? inserted DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Generiere eine PHP-Klasse 'Participant', die public-Felder dieser SQL-Tabelle enthält. Implementiere Methoden zum Laden, Löschen, Einfügen, Ändern: get(), delete(), insert(), update(), . Die Datenbank-Daten sollen von der globalen Variablen $dbAccess = new DbAccess("localhost", "root", "", "dbreisen"); verwendet werden. Verwende wieder die Datenbank-Verbindung: $conn = $dbAccess->createConnection(); Ich habe 2 Tabellen 'travel' und 'participant' in einer MySQL-Datenbank: CREATE TABLE db_446406_1.travel ( travelkey VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL PRIMARY KEY, title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE db_446406_1.participant ( id INT PRIMARY KEY, travel VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; participant.travel ist ein Fremdschlüssel auf travel.travelkey: ALTER TABLE participant ADD CONSTRAINT fk_participant_travel FOREIGN KEY (travel) REFERENCES travel(travelkey) ON UPDATE CASCADE ON DELETE RESTRICT; Jetzt soll in der Tabelle 'travel' ein anderer Primärschlüssel "travelId' als Integer eingeführt werden. Wie erzeuge ich den neuen Primärschlüssel in 'travel' mit automatischer Erzeugung der Integer-Werte? Wie erzeuge ich den neuen Fremdschlüssel in der Tabelle 'participant' unter Beibehaltung der bisherigen 'travel'-'participant'-Beziehungen? USE dbreisen; USE db_446406_1; Entferne den bisherigen Primärschlüssel ALTER TABLE travel DROP PRIMARY KEY; Spalte travelId hinzufügen und als Auto-Increment-Primärschlüssel setzen ALTER TABLE travel ADD COLUMN travelId INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (travelId), ADD UNIQUE KEY uk_travelkey (travelkey); Neue Spalte travelId hinzufügen ALTER TABLE participant ADD COLUMN travelId INT NULL AFTER travel; Werte in travelId übernehmen USE dbreisen; UPDATE participant p JOIN travel t ON p.travel = t.travelkey SET p.travelId = t.travelId; Alten Fremdschlüssel und Index entfernen USE dbreisen; Das Kommando: ALTER TABLE participant DROP FOREIGN KEY fk_participant_travel, DROP INDEX fk_participant_travel; ergibt den Fehler: #1091 - Kann 'fk_participant_travel' nicht löschen. Existiert die Spalte oder der Schlüssel? Wie kann ich eine Liste der Fremdschlüssel von der Tabelle 'participant' bekommen? Die Abfrage: SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'dbreisen' AND TABLE_NAME = 'participant'; lieferte keine Ergebnisse. Das heisst, es gibt keinen Fremdschlüssel in 'participant'. Liste der Indizes: SHOW INDEX FROM participant; travelId als NOT NULL setzen und neuen Fremdschlüssel anlegen ALTER TABLE participant MODIFY COLUMN travelId INT NOT NULL, ADD CONSTRAINT fk_participant_travelId FOREIGN KEY (travelId) REFERENCES travel (travelId) ON UPDATE CASCADE ON DELETE RESTRICT; Spalte travel entfernen ALTER TABLE participant DROP COLUMN travel; DROP VIEW travel_with_counts; CREATE VIEW travel_with_counts AS SELECT t.travelId, t.travelkey, t.title, t.startpoint, t.startdate, t.starttime, t.endtime, t.price, ( SELECT COUNT(*) FROM participant p WHERE p.travelId = t.travelId ) AS participant_count FROM travel t;