• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] Formular speichern, Abfrage Pflicht- und freiwillige Felder

Berner

Neues Mitglied
Guten Abend

Ich stehe auf dem Schlauch wie ich beides am Besten kombiniere.
Bisher waren es alles Pflichtfelder und es funktionierte.

Neu sind die beiden Zeilen die ich nach dem Kommentar, // Freiwillige Felder.... eingefügt habe: (ab Zeile 22).
Gibt mir die beiden Fehlermeldungen: Bitte Formular vollständig ausfüllen - und - Freiwillige Felder nicht vorhanden.

Code:
<?php
include_once '../main.php';

$messages_error = [];
$messages = [];

if (!isset($_GET['id'])) {
    exit ('Kein Datensatz unter dieser ID');
}

if (!empty($_POST)) {
       
    // Pflichtfelder: POST-Variabeln vorhanden?
    if (empty($_POST['title']) || empty($_POST['vorname']) || empty($_POST['nachname']) || empty($_POST['str']) || empty($_POST['plz']) || empty($_POST['ort']) || empty($_POST['email']) || empty($_POST['phone1'])) {  
        // Einer oder mehrere Werte sind leer.
        $messages_error[] = 'Bitte Formular vollständig ausfüllen.';
    }
    // Email korrekt?
    if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        $messages_error[] = 'Bitte E-Mail-Adresse prüfen.';
    }
    // Freiwillige Felder: POST-Variabeln vorhanden oder NULL
    if (!isset($_POST['phone2'], $_POST['phone3'], $_POST['phone4'])) {
        $messages_error[] = 'Freiwillige Felder nicht vorhanden';
    }    
    // Bei Fehlern
    if (!empty($messages_error)) {
        $account = $_POST;
    }
    else {
    // Daten aus $_POST speichern
     $stmt = $pdo->prepare('UPDATE accounts SET title = ?, vorname = ?, nachname = ?, str = ?, snr = ?, plz = ?, ort = ?, email = ?, phone1 = ?, phone2 = ?, phone3 = ?, phone4 = ? WHERE id = ?');  
     $stmt->execute([$_POST['title'], $_POST['vorname'], $_POST['nachname'], $_POST['str'], $_POST['snr'], $_POST['plz'], $_POST['ort'], $_POST['email'], $_POST['phone1'], $_POST['phone2'], $_POST['phone3'], $_POST['phone4'], $_GET['id']]);    
     header ('Location: ../saved.php');
     exit;      
    }
}
else {
        // Werte aus Datenbank
        $stmt = $pdo->prepare('SELECT * FROM accounts WHERE id = ?');
        $stmt->execute([$_GET['id']]);
        $account = $stmt->fetch(PDO::FETCH_ASSOC);
}
 
?>

<!-- Formular...     -->
............
 
Zuletzt bearbeitet:
Das solltest du unbedingt beachten, braucht man immer wieder:

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Das solltest du unbedingt beachten, braucht man immer wieder:
Danke, deine 9 Punkte habe ich mir schon früher notiert. In diesem Fall sind nicht die Fehlermeldungen das Problem (weiss wieso sie entstehen, denn sie gehen ja aus meinem Code hervor, habe sie selber formuliert).

Ich habe diese Fehlermeldungen nur hier aufgeschrieben, damit wenn jemand mir helfen will, er anhand von meinem Code schneller sieht, wie und wo ich diese definiert habe.

Mittlerweile stellt sich für mich das Kernproblem, kann ich bei der if-Abfrage:
// Pflichtfelder: POST-Variabeln vorhanden?
if (empty($_POST['title']) .........
...auch die freiwilligen Felder unterbringen, welche !empty oder empty sein können?

Oder eine separate Abfrage, aber wie würde der Code aussehen?
 
...und dann gerne noch das:
Bei if (!empty($_POST)) {
Welche Felder werden abgefragt? Scheinbar nicht alle, denn wenn ich die "freiwilligen" Felder im Formular ausfülle, werden sie nicht abgespeichert.
 
...und dann gerne noch das:
Bei if (!empty($_POST)) {
Welche Felder werden abgefragt? Scheinbar nicht alle, denn wenn ich die "freiwilligen" Felder im Formular ausfülle, werden sie nicht abgespeichert.
Du weißt aber das $_POST ein Array ist, oder?
Ich hoffe, ich irre mich jetzt nicht, aber selbst wenn alle Felder leer sind, bekommst du ein Array zurück, was so ungefähr aussieht
Code:
    Array
    (
        [vorname] =>
        [name] =>
        [str] =>
    )
Der Code
if (!empty($_POST)) {
Ist dann immer TRUE, weil $_POST ist, in dem fall nie leer
 
Du weißt aber das $_POST ein Array ist, oder?
Ich hoffe, ich irre mich jetzt nicht, aber selbst wenn alle Felder leer sind, bekommst du ein Array zurück, was so ungefähr aussieht
Code:
    Array
    (
        [vorname] =>
        [name] =>
        [str] =>
    )
Der Code
if (!empty($_POST)) {
Ist dann immer TRUE, weil $_POST ist, in dem fall nie leer
Ja, ich weiss, $_POST ist ein Array (wegen den eckigen Klammern).
Wenn alles Pflichtfelder sind (obligatorisch mit Inhalt), funktioniert es, weil mit der Abfrage if (!empty... werden nur die ausgefüllten Felder abgefragt.

Nun habe ich aber 3 Felder hinzugefügt (phone2, phone3 + phone4), welche freiwillig zum ausfüllen sind, d.h. sie müssen auch gespeichert werden, egal ob (teilweise) ausgefüllt oder nicht - aber mit der Abfrage if (!empty... werden die leeren Felder nicht gespeichert - deshalb mein "Kernproblem", wie muss ich den Code ändern, damit auch diese 3 Felder in jedem Fall gespeichert werden?
 
Danke, deine 9 Punkte habe ich mir schon früher notiert.
Aber nicht berücksichtigt. Ich sehe kein hochgedrehtes Error-Reporting und Debug-Ausgaben fehlen auch.

PHP:
// Freiwillige Felder: POST-Variabeln vorhanden oder NULL
    if (!isset($_POST['phone2'], $_POST['phone3'], $_POST['phone4'])) {
        $messages_error[] = 'Freiwillige Felder nicht vorhanden';
Wenn das freiwillige Eingaben sind, warum überprüfst du sie überhaupt mit isset?
 
Aber nicht berücksichtigt. Ich sehe kein hochgedrehtes Error-Reporting und Debug-Ausgaben fehlen auch.

PHP:
// Freiwillige Felder: POST-Variabeln vorhanden oder NULL
    if (!isset($_POST['phone2'], $_POST['phone3'], $_POST['phone4'])) {
        $messages_error[] = 'Freiwillige Felder nicht vorhanden';
Wenn das freiwillige Eingaben sind, warum überprüfst du sie überhaupt mit isset?
Hatte das Error-Reporting drinnen, hatte nichts angezeigt.

Freiwillige Eingaben mit isset überprüfen: War nur ein Versuch, weil es mir diese freiwilligen Felder nicht erkannt und gespeichert hat. Glaube aber zu wissen warum, diese Ueberprüfung ist eingebettet in die Abfrage if (!empty($_POST)) { - dann werden aus diesem Grund wahrscheinlich nur ausgefüllte Felder gespeichert.
 
@m.scatello
Mein Error-Reporting sieht so aus:
// Debuggen
$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
error_reporting (E_ALL & ~ E_NOTICE | E_STRICT); // Neue Variante, mit Notice-Zusatz, gemäss Peter Kropff
//error_reporting (E_ALL | E_STRICT); // Alte Variante
ini_set('display_errors', true);

Du hattest noch was mit error_reporting(-1), sollte das noch drin bleiben, oder ist es wegen dem anderen Code überflüssig?
 
Solange ein Script nicht fertig getestet ist, nimmt man
PHP:
error_reporting (E_ALL);
Auch Notice-Meldungen sollte man verhindern. Das geht aber nur, wenn man sie auch sieht.
 
Ok, danke, ich habe das nun in meinem Muster-/Testprojekt bei meiner main.php, welche in jeder anderen Datei includiert wird, angepasst.
 
Zurück
Oben