Ich habe eine Datei update.php (siehe Code unten), welche anstandslos funktioniert.
Das Formular wird erst definitiv gespeichert, wenn keine Fehlermeldungen (mehr) vorhanden sind.
Heisst, es erfolgt eine Zwischenspeicherung falls es Fehlermeldungen hat, damit bei Fehlermeldungen die bereits mutierten Daten nicht verloren gehen und nur wieder der ursprüngliche Datensatz im Formular erscheint und alles wieder neu eingegeben werden muss.
Nun habe ich versucht eine Datei clone.php zu erstellen (statt einen neuen Datensatz zu erstellen, nehme ich einen bestehenden ähnlichen, mutiere diesen und speichere unter neuer id ab).
Aber es ist mir nicht gelungen, das obige System "Zwischenspeicherung" zu implementieren.
Ich brauche einen Denkanstoss wie man das am besten macht.
Meine Ueberlegungen (Datei update.php wie unten zu Datei clone.php abändern):
1. In Zeile 30 müsste eine neue ID erstellt werden, statt auf die bestehende ID zu speichern.
2. Bei Fehlermeldungen wird Zeile 30 wiederum durchlaufen und eine neu ID generiert, was nicht sein sollte, sondern auf die neu eröffnete ID abspeichern.
3. Sobald keine Fehlermeldungen vorhanden sind, müsste in Zeile 44 auch unter der neu bestehenden ID abgespeichert werden (wie definiert man das?).
Wahrscheinlich gibt es mehrere Möglichkeiten das Problem zu lösen. Ich wäre sehr dankbar für einen Hinweis wie man das am Besten angeht.
<?php
// Datei update.php
include_once '../main.php';
$messages_error = [];
$messages = [];
if (isset($_GET['id'])) {
if (!empty($_POST)) {
// POST-Variablen vorhanden? - sonst nimm leeren Wert
$id = isset($_POST['id']) ? $_POST['id'] : '';
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
$activation_code = isset($_POST['activation_code']) ? $_POST['activation_code'] : '';
$rememberme = isset($_POST['rememberme']) ? $_POST['rememberme'] : '';
$role = isset($_POST['role']) ? $_POST['role'] : '';
$title = isset($_POST['title']) ? $_POST['title'] : '';
$vorname = isset($_POST['vorname' ]) ? $_POST['vorname'] : '';
$nachname = isset($_POST['nachname']) ? $_POST['nachname'] : '';
$str = isset($_POST['str']) ? $_POST['str'] : '';
$snr = isset($_POST['snr']) ? $_POST['snr'] : '';
$plz = isset($_POST['plz']) ? $_POST['plz'] : '';
$ort = isset($_POST['ort']) ? $_POST['ort'] : '';
$phone1 = isset($_POST['phone1']) ? $_POST['phone1'] : '';
$created = isset($_POST['created']) ? $_POST['created'] : date('d-m-Y H:i:s');
// Geänderten Kontakt vor Fehlermeldungen in DB eintragen (damit die Eingaben mal gespeichert sind)
$stmt = $pdo->prepare('UPDATE accounts SET id = ?, password = ?, email = ?, activation_code = ?,
rememberme = ?, role = ?, title = ?, vorname = ?, nachname = ?, str = ?, snr = ?, plz = ?, ort = ?, phone1 = ?, created = ? WHERE id = ?');
$stmt->execute([$id, $password, $email, $activation_code, $rememberme, $role, $title, $vorname, $nachname, $str, $snr, $plz, $ort, $phone1, $created, $_GET['id']]);
// Variable nicht definiert, leer oder gleich 0 ? (true / false).
if (empty($_POST['vorname']) || empty($_POST['nachname']) || empty($_POST['email']) || empty($_POST['phone1'])) {
// Einer oder mehrere Werte sind leer.
$messages_error[] = 'Bitte Formular vollständig ausfüllen.';
}
// Email überprüfen
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$messages_error[] = 'Bitte E-Mail-Adresse prüfen.';
}
if (empty($messages_error)) {
// Geänderten Kontakt nach Bereinigung Fehlermeldungen in DB definitiv eintragen
$stmt = $pdo->prepare('UPDATE accounts SET id = ?, password = ?, email = ?, activation_code = ?,
rememberme = ?, role = ?, title = ?, vorname = ?, nachname = ?, str = ?, snr = ?, plz = ?, ort = ?, phone1 = ?, created = ? WHERE id = ?');
$stmt->execute([$id, $password, $email, $activation_code, $rememberme, $role, $title, $vorname, $nachname, $str, $snr, $plz, $ort, $phone1, $created, $_GET['id']]);
$messages[] = 'Datensatz ist gespeichert';
}
}
// Datensatz abrufen aus der Tabelle accounts
$stmt = $pdo->prepare('SELECT id, password, email, activation_code, rememberme, role, title, vorname, nachname, str, snr, plz, ort, phone1, created FROM accounts WHERE id = ?');
$stmt->execute([$_GET['id']]);
$account = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$account) {
exit('Kein Kontakt mit dieser id');
}
}
else {
exit('No ID specified!');
}
?>
<?=template_header('Update')?>
<div class="content update">
<h2>Kontakt ändern</h2>
<h3><?=$account['nachname']?></h3>
<form action="update.php?id=<?=$account['id']?>" method="post">
<div class="tabelle">
<label style="display:none" for="id">ID</label>
<input style="display:none" type="text" name="id" placeholder="" value="<?=$account['id']?>" id="id">
<label style="display:none" for="created">Created</label><br>
<input style="display:none" type="datetime-local" name="created" value="<?=date('Y-m-d\TH:i', strtotime($account['created']))?>" id="created">
<div class="fl">
<label for="title">Anrede</label><br>
<input type="text" name="title" value="<?php echo isset($account['title']) ? htmlspecialchars($account['title']) : ''; ?>" /> <!-- $account, weil bei update müssen die bestehenden Felddaten angezeigt werden -->
</div>
<div class="fl">
<label for="vorname">Vorname</label><br>
<input type="text" name="vorname" value="<?php echo isset($account['vorname']) ? htmlspecialchars($account['vorname']) : ''; ?>" />
</div>
<div class="fl">
<label for="nachname">Nachname</label><br>
<input type="text" name="nachname" value="<?php echo isset($account['nachname']) ? htmlspecialchars($account['nachname']) : ''; ?>" />
</div>
<div class="fl">
<label for="str">Strasse</label><br>
<input type="text" name="str" value="<?php echo isset($account['str']) ? htmlspecialchars($account['str']) : ''; ?>" />
</div>
<div class="fl">
<label for="snr">Nummer</label><br>
<input type="text" name="snr" value="<?php echo isset($account['snr']) ? htmlspecialchars($account['snr']) : ''; ?>" />
</div>
<div class="fl">
<label for="plz">PLZ</label><br>
<input type="text" name="plz" value="<?php echo isset($account['plz']) ? htmlspecialchars($account['plz']) : ''; ?>" />
</div>
<div class="fl">
<label for="ort">Ort</label><br>
<input type="text" name="ort" value="<?php echo isset($account['ort']) ? htmlspecialchars($account['ort']) : ''; ?>" />
</div>
<div class="fl">
<label for="email">Email</label><br>
<input type="text" name="email" value="<?php echo isset($account['email']) ? htmlspecialchars($account['email']) : ''; ?>" />
</div>
<div class="fl">
<label for="phone1">Telefon P</label><br>
<input type="text" name="phone1" value="<?php echo isset($account['phone1']) ? htmlspecialchars($account['phone1']) : ''; ?>" />
</div>
<div class="fl">
<input type="submit" value="Sichern">
<?php
// Fehlermeldungen ausgeben:
echo '<div class="messages_error">';
foreach($messages_error as $message) {
echo '<p>'.htmlspecialchars($message).'</p>';
}
echo '</div>'; ?>
<?php
// Erfolgsmeldungen ausgeben:
echo '<div class="messages">';
foreach($messages as $message)
{
echo '<p>'.htmlspecialchars($message).'</p>';
}
echo '</div>'; ?>
</div>
</div>
</form>
</div>
<?=template_footer()?>
Alles anzeigen