UPDATE `tablename`
SET `field` = IF(? <> '', ?, `field`)
WHERE ...
Dadurch wird die Aufgabe, nach leeren Einträgen zu suchen, an MySQL übergeben, und das Feld verwendet seinen vorherigen Wert anstelle eines leeren Werts. Sie müssen den Wert an execute()
übergeben zweimal, damit dies funktioniert. Es macht im Grunde dasselbe wie Sie, aber ohne den Wert in Ihrer PHP-Sitzung speichern zu müssen.
Bei diesem Ansatz würde Ihr Aktualisierungscode wie folgt aussehen:
/*
This block is no longer necessary
if($_POST['firstname']){ $firstname = $_POST['firstname']; }
else { $firstname = $_SESSION['uname']['firstname']; }
if($_POST['lastname']){ $lastname = $_POST['lastname']; }
else { $lastname = $_SESSION['uname']['lastname']; }
if($_POST['email']){ $email= $_POST['email']; }
else { $email = $_SESSION['uname']['email']; }
*/
$query = "
UPDATE `users`
SET
`firstname` = IF(? <> '', ?, `firstname`),
`lastname` = IF(? <> '', ?, `lastname`),
`email` = IF(? <> '', ?, `email`)
WHERE `id` = ?
";
$results = $condb->prepare($query);
$results->execute(array(
$_POST['firstname'], $_POST['firstname'],
$_POST['lastname'], $_POST['lastname'],
$_POST['email'], $_POST['email'],
$_SESSION['uname']['id']
));
Ihr vorhandener Code hätte den Benutzer daran gehindert, eine einzelne 0
einzugeben allein, was dies nicht tut - vielleicht möchten Sie auch dafür ein Häkchen hinzufügen.