UPDATE `tablename`
SET `field` = IF(? <> '', ?, `field`)
WHERE ...
Detta subordnar jobbet att leta efter tomma poster till MySQL och fältet använder dess tidigare värde istället för ett tomt värde. Du måste skicka värdet till execute()
två gånger för att detta ska fungera. Den gör i princip samma sak som du gör men utan att behöva lagra värdet i din PHP-session.
Med detta tillvägagångssätt skulle din uppdateringskod se ut så här:
/*
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']
));
Din befintliga kod skulle ha hindrat användaren från att ange en enda 0
på egen hand, vilket detta inte gör - du kanske vill lägga till en check för det också.