PHP Datenbank updaten

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
Hallo Community,

erstmal mein Script :)

Code:
<?php
session_start();
if(!isset($_SESSION['userid'])) {
    die('Bitte zuerst <a href="Mac_Version1.php">einloggen</a>');
}
$userid = $_SESSION['userid'];
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'drago10');
?>
<!DOCTYPE html>
<html>
<head>
<title>Profil</title>
    
<link rel="stylesheet" href="Formdesign.css" type="text/css" />
<link href='https://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
    
</head>
<body>
        
<?php
$Wohnort = (isset($_POST["Wohnort"]) && is_string($_POST["Wohnort"])) ?
$_POST["Wohnort"] : "";
$Job = (isset($_POST["Job"]) && is_string($_POST["Job"])) ?
$_POST["Job"] : "";
    
    
    
$ok = false;
$fehlerfelder = array();
if (isset($_POST["Submit"])) {
    $ok = true;
    if (!isset($_POST["Job"]) ||
    !is_string($_POST["Job"]) ||
    trim($_POST["Job"]) == ""  ){
    $ok = false;
    $fehlerfelder[] = "Job";
    }


if (!isset($_POST["Wohnort"]) ||
    !is_string($_POST["Wohnort"]) ||
    trim($_POST["Wohnort"]) == ""  ){
    $ok = false;
    $fehlerfelder[] = "Wohnort";
    }
    
    if ($ok) {
?>   
    
<h1>Formulardaten</h1>
    
<?php

$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'drago10');
$statement = $pdo->prepare("UPDATE adressen SET wohnort = '$Wohnort', job = '$Job' WHERE id = '$userid'");
$statement->execute();   
 

        
$Wohnort = htmlspecialchars($Wohnort);         
$Job = htmlspecialchars($Job);         
echo "<b> Wohnort:</b> $Wohnort<br />";       
echo "<b> Job:</b> $Job<br />";       
echo "<br/>";
echo "Super! Alle Daten wurden erfolgreich &uumlbermittelt. <a href =Menu_Link_1log.php>Hier geht es weiter.</a>";
?>

<?php
        
  } else {
    echo "<p><b>Formular unvolst&auml;ndig</b></p>";
    echo "<ul><li>";
    echo implode("</li><li>", $fehlerfelder);
    echo "</li></ul>";
  }
}
if (!$ok) {
?>   
<fieldset>
<legend>Profil</legend>
<form method="post">
    
    
<label for="whort"> Wohnort:</label> <input type="text" name="Wohnort" value="<?php   

echo htmlspecialchars($Wohnort);
    
?>" /><br />
    
<label for="job"> Job:</label> <input type="text" name="Job" value="<?php

echo htmlspecialchars($Job);
    
?>" /><br />
    
<input class="button" type="submit" name="Submit" value="Senden"/>
</form>
</fieldset>
<?php
 }
?>   
</body>
</html>

Und nun zu meinem Problem. Wie ihr seht habe ich ein Script geschrieben mit dem ich meine Datenbank um zwei Werte updaten kann. Nämlich "Wohnort und Job". Das ganze funktioniert soweit auch. Was jedoch nicht funktioniert ist die Sache das wenn ich nur einen von beiden Werten updaten möchte, der andere bereits vorhandene Wert dann mit einem leerem Wert geupdatet wird so das dann in der Datenbank nichts mehr steht.

Versteht ihr ? Ich will also bewerkstelligen das es möglich ist auch nur einen von zwei Werten zu updaten.

Ich weiß das gerade noch eine Meldung aufkommt, wenn einer der beiden Wert nicht gesetzt ist durch die Variable $fehlerfelder. Durch diese Variable kommt es dazu das eine Zeile nicht leer sein kann so das der User etwas dafür eingeben muss. Mir ist klar das dass ganze dahingehend abgeändert werden muss.

Nehme ich bspw. folgende Zeilen aus dem Code:

if (!isset($_POST["Wohnort"]) ||
!is_string($_POST["Wohnort"]) ||
trim($_POST["Wohnort"]) == "" ){
$ok = false;
$fehlerfelder[] = "Wohnort";
}

Dann passiert das was ich oben bereits geschrieben habe, nämlich das dann der Wert"Null" übermittelt wird obwohl bereits ein Eintrag zu Wohnort vorhanden war.

Also ich hoffe ihr versteht was ich meine und könnt mir weiterhelfen :)
 

seaker

Empire
Registriert
19.04.10
Beiträge
88
Du hast das Statement was an deine Datenbank abgegeben wird fest vorgegeben. D.h. du updatest immer zwei Spalten auch wenn du für diese keinen Wert übergibst.

Folglich musst du auch den DB-String dynamisch aufbauen. Du überprüfst ja schon ob die entsprechenden Felder gefüllt sind die du setzen willst (isset($_POST[....])). nach dem du die geprüft hast bau dir doch deinen DB-String damit zusammen:

(exemplarisch)

PHP:
$updatefelder = [];
if(isset(...)){
$updatefelder[] = ['wohnort' => 'wert']
}

$query = "UPDATE tablename SET ";

foreach ($updatefelder AS $key => $value){
 $query .= $key ." = ".$value;
}

$query .= " WHERE id = '".$userid."'";

$statement = $pdo->prepare($query);


(es ist kein lauffähiger PHP Code da ich gerade keinen editor zur hand hab, aber er sollte zum demonstrieren reichen)

Damit sollte zumindest mal beispielweise dein Statement dynmamisch generiert werden und auch nur die Felder updaten die einen Wert haben. EIne überprüfung welche Felder geupdated werden sollen musst du natürlich noch einbauen, ebenso dass die zu setzenden Felder in der Query per "Komma" getrennt werden.

Hoffe das war etwas verständlich.
 

ThisIsBeat

Empire
Registriert
02.02.16
Beiträge
85
@seaker Hey danke für die Antwort. Ich muss sagen das ich mich noch im Lernprozess befinde was PHP angeht und ich nicht immer ganz genau weiß was ich machen muss deswegen entschuldige wenn ich nicht alles auf anhieb verstehe.

Das ganze Script soll jetzt "exemplarisch" zeigen das nur die Zeilen geupdatet werden, die auch einen Wert enthalten. Soweit so gut. Ich werde jetzt von oben nach unten mal fragen stellen.

Direkt in der zweiten Zeile kommt es zu einer Abfrage mit if(isset(...)).
1. Was soll ich hier jetzt nochmal genau überprüfen ? Ob die Variable Wohnort vorhanden ist ? Würde das ganze dann so aussehen müssen: if(isset($Wohnort)) ?


Die Variable $updatefelder enthält diesen Wert ['wohnort' => 'wert'].
2. Was bedeutet dieser Pfeil => und warum ist wohnort => wert ?

Mit dem darauffolgenden Teil habe ich meine größten Probleme.
$query = "UPDATE tablename SET ";

foreach ($updatefelder AS $key => $value){
$query .= $key ." = ".$value;
}

$query .= " WHERE id = '".$userid."'";
3. Wie sollen $key und $value belegt werden ?
4. Ist die Variable $query eigentlich nichts anderes als das hier:

$statement = $pdo->prepare("UPDATE adressen SET wohnort = '$Wohnort', job = '$Job' WHERE id = '$userid'");

Wäre super wenn ich das alles beantwortet bekomme. Will das wirklich verstehen :D