Frage von theplayer95, 64

PHP: Nur die Felder auswerten die ausgefüllt sind?

Hallo, ich habe ein Formular mit 6 Feldern, davon ist eins das Passwort. Dieses Formular dient zur Änderung der Benutzerdaten. Ich möchte effiziente Lösung finden um nur die Datenfelder auszuwerten die geändert wurden. z.B. Straße und Ort + Passwort oder PLZ, Straße und Ort + PLZ. Ich müsste jetzt 25 if{}else{} Bedingungen schreiben. Fällt euch eine andere Möglichkeit ein um das zu verhindern? Vielen dank für eure Hilfe!

Antwort
von Dory1, 36

Und warum überschreibst (und validierst) du nicht einfach den vorhandenen Datensatz komplett mit den neuen Daten? Auf Performance kommt es doch in dem Fall wirklich nicht an. Der Code würde nur unnötig kompliziert werden.

Antwort
von EightSix, 35

Wozu brauchst du so viele IFs? Du kannst ja die Werte einfach überschreiben wenn es sowieso die selben sind. Oder du setzt das SQL Statement dynamisch zusammen je nach dem ob was geändert wurde.

Für jede denkbare Kombination eine Lösung ist natürlich Quatsch. Stell dir vor da kommt ein Feld dazu irgendwann.

Kommentar von theplayer95 ,

Aber ich möchte ja auch den Preg_match überprüfen. Und wie meinst du das mit Überschreiben? Weil der soll ja nur die Werte ändern die ausgefüllt sind. Wenn ich sage nur das was man ausgefüllt hat Überschreiben dann löscht er das was nicht ausgefüllt wurde und es steht nichts drin.

Kommentar von EightSix ,

Die Felder die ja nicht geändert wurden sind ja nicht leer. Also überschreibst du einfach den vorhandenen Wert mit dem selben nochmal.

Kommentar von Dory1 ,

Beleg die Felder doch einfach immer mit den alten Werten? Wenn der User daran nichts verändert, wird der alte Wert halt noch mal abgesendet und validiert. Warum so kompliziert?

Antwort
von fluffiknuffi2, 20

Ich verstehe das Problem nicht.

if ($nameAlt != $nameNeu) {

validiereName();
}
if ($plzAlt != $plzNeu) {
validierePlz();
}
if ($straßeAlt != $straßeNeu) {
validiereStrasse();
}
if ($ortAlt != $ortNeu) {
validiereOrt);
}
if ($hausnrAlt != $hausnrNeu) {
validiereHausnr();
}

Und fertig?!

Kommentar von theplayer95 ,
function bdchange(){
$firstname = length(isset($_POST['firstname']) ? $_POST['firstname'] : '', 20);
$lastname = length(isset($_POST['lastname']) ? $_POST['lastname'] : '', 20);
$street = length(isset($_POST['street']) ? $_POST['street'] : '', 50);
$zip_code = length(isset($_POST['zip_code']) ? $_POST['zip_code'] : '', 5);
$city = length(isset($_POST['city']) ? $_POST['city'] : '', 40);
$pwab = length(isset($_POST['aktpw']) ? $_POST['aktpw'] : '', 30);
$csrf = length(isset($_POST['csrf']) ? $_POST['csrf'] : '', 32);
$bdch = length(isset($_POST['bdchange']) ? $_POST['bdchange'] : '', 1);
$error = '';

if($bdch == 1 && $csrf == $_SESSION['csrfToken']){
if(userout('password') == pwsalt($pwab)){
if($firstname != userout('firstname')){
$change = mysql_query("Update ".DB."_user Set firstname = '$firstname' Where id = '".userout('id')."'");
}else{
$error = 'Du kannst nicht den selben Vornamen angeben!';
}
if($lastname != userout('lastname')){
$change = mysql_query("Update ".DB."_user Set lastname = '$lastname' Where id = '".userout('id')."'");
}else{
$error = 'Du kannst nicht den selben Nachnamen angeben!';
}
if($street != userout('street')){
$change = mysql_query("Update ".DB."_user Set street = '$street' Where id = '".userout('id')."'");
}else{
$error = 'Du kannst nicht die selbe Straße angeben!';
}
if(check_plz_de($zip_code) != userout('zip_code')){
$change = mysql_query("Update ".DB."_user Set zip_code = '$zip_code' Where id = '".userout('id')."'");
}else{
$error = 'Du kannst nicht die selbe Postleitzahl angeben!';
}
if($city != userout('city')){
$change = mysql_query("Update ".DB."_user Set city = '$city' Where id = '".userout('id')."'");
}else{
$error = 'Du kannst nicht die selbe Stadt angeben!';
}
}else{
$error = 'Falsches Passwort! Versuchen Sie es erneut.';
}
return sondertext($error);
}
}

Meinst du das so? Aber das geht nicht...
Wenn ich z.B. nur Nachname ändere dann löscht er alles andere.
Kommentar von fluffiknuffi2 ,

Dein Code ist unnötig aufgebläht! 

1. Das hier

$firstname = length(isset($_POST['firstname']) ? $_POST['firstname'] : '', 20);

$lastname = length(isset($_POST['lastname']) ? $_POST['lastname'] : '', 20);
$street = length(isset($_POST['street']) ? $_POST['street'] : '', 50);
$zip_code = length(isset($_POST['zip_code']) ? $_POST['zip_code'] : '', 5);
$city = length(isset($_POST['city']) ? $_POST['city'] : '', 40);
$pwab = length(isset($_POST['aktpw']) ? $_POST['aktpw'] : '', 30);
$csrf = length(isset($_POST['csrf']) ? $_POST['csrf'] : '', 32);
$bdch = length(isset($_POST['bdchange']) ? $_POST['bdchange'] : '', 1);

Kann man auch wie folgt schreiben (nicht gestestet):

$data = array('firstname' => 20, 'lastname' => 20, 'street' => 50, 'zip_code' => 5, 'city' => 40, 'aktpw' => 30, 'csrf' => 32, 'bdchange' => 1)
check(&$data);

Funktion check:

function check($items)
{
  foreach ($items as $name => $length) {
    $items[$name] = length(isset($_POST[$name]) ? $_POST[$name] : '', $length);
  }
}

(Ich würde diese Umbenennungen wie bdchange zu bdch weg lassen.)

Ist dann viel übersichtlicher!

Auch den nachfolgenden Code kann man vermutlich viel kürzer schreiben.

2. Ich verstehe dein Problem nicht. An deiner Stelle würde ich versuchen ein minimalistisches (fiktives) Code-Beispiel zu bauen, dass dein Problem zeigt und nur dein Problem - kein unnötiges Zeug was nichts mit deinem Problem zu tun hat! Vermutlich ist dein Problem sehr einfach zu lösen es hapert nur derzeit an der Kommunikation.

Keine passende Antwort gefunden?

Fragen Sie die Community