Wat is de juist manier van uitvoer UPDATE
Ik ben mijn basiskennis aan het testen en het lukt al aardig.
Nu loop ik tegen het volgende aan: ik heb een formulier waar een gebruiker zijn gegevens kan wijzigen. Niet alle velden input zullen hebben.
Ik probeer een 'updateUser' functie te schrijven die alleen de velden moet wijzigen in de db, waar input voor gegeven wordt. Alle lege velden moeten overgeslagen worden.
Wat is nu gebruikelijk?
Dat je dit doet dmv "CASE" in het update statement of dat je via if/else in php checkt welke velden input hebben of niet?
Mijn vraag komt voort uit dit item op Stackoverflow.
Alvast vriendelijk bedankt.
Iris
Verder is vooral belangrijk wat er moet gebeuren met bestaande data die leeg zijn in het formulier maar niet leeg in de database.
Stel dat je bijvoorbeeld dit adres hebt van iemand die in de Dwarssteeg 13-A woont:
- Straatnaam: Dwarssteeg
- Huisnummer: 13
- Huisnummertoevoeging: A
Wat doe je dan met die A als iemand verhuist naar een adres zonder toevoeging achter het huisnummer? Die A moet dan waarschijnlijk worden gewist, maar dat moet je dan ook in de query verwerken.
In andere gevallen zal de keuze echter anders uitvallen. Is iemands geboortedatum bijvoorbeeld al opgeslagen in de database, dan wil je meestal niet dat een formulier zonder ingevulde geboortedatum die data uit de database wist.
Dit klinkt allemaal veel te moeilijk. Wat nu als iemand een veld bewust leeg wil maken? Deze worden dan gewoon geskipt, en daarmee wordt de gewenste wijziging niet opgeslagen? Het is niet aan de programmacode om deze beslissing te maken. Dat doet de gebruiker.
Sla gewoon alles (letterlijk en ongewijzigd ten opzichte van de oorspronkelijke "rauwe" invoer) op.
Of deze invoer wordt geaccepteerd is een tweede en hangt af van de validatie van de specifieke formuliervelden.
Probeer formulieren niet te slim te maken, dat wekt waarschijnlijk alleen maar frustratie op en is contra-intuïtief.
Keep it simple.
Gewijzigd op 15/07/2015 20:19:15 door Thomas van den Heuvel
Dus niet dat hij alles opnieuw hoeft in te voeren, enkel te wijzigen/verwijderen.
En wat hij laat staan (ongewijzigd), overschrijf je toch. Zo veel tijd/resource kost dat toch niet.
Ward van der Put op 15/07/2015 20:12:42:
Geen van beide eigenlijk. Je kunt beter een array gebruiken met de data en die vervolgens voor alle niet-lege waarden omzetten in een x=1, y=2, z=3 in SQL.
Bedankt voor je feedback Ward!
Die array die heb ik toch al? Namelijk $_POST. Of bedoel je de waardes met input daaruit filteren en in een nieuwe array zetten?
Dit is de functie die ik nu heb :
function updateUser($user){
try{
if (is_array($user)) {
// update credentials, check if form is submitted
if ($user['credentials']) {
$stm = dbConnect()->prepare("UPDATE `clients`
SET email = CASE
WHEN :email = '' THEN email
ELSE :email
END,
passw = CASE
WHEN :passw = '' THEN passw
ELSE :passw
END,
firstname = CASE
WHEN :firstname = '' THEN firstname
ELSE :firstname
END,
lastname = CASE
WHEN :lastname = '' THEN lastname
ELSE :lastname
END,
address = CASE
WHEN :address = '' THEN address
ELSE :address
END,
city = CASE
WHEN :city = '' THEN city
ELSE :city
END,
zip = CASE
WHEN :zip = '' THEN city
ELSE :zip
END,
country = CASE
WHEN :country = '' THEN country
ELSE :country
END
WHERE userID = :userID");
$stm->bindParam(":email", $user['email']);
$stm->bindParam(":passw", $user['password']);
$stm->bindParam(":firstname", $user['firstname']);
$stm->bindParam(":lastname", $user['lastname']);
$stm->bindParam(":address", $user['address']);
$stm->bindParam(":city", $user['city']);
$stm->bindParam(":zip", $user['zip']);
$stm->bindParam(":country", $user['country']);
$stm->bindParam(":userID", $user['userID']);
$stm->execute();
// if update affected any rows, the new user data will be returned
if ($stm->rowCount() > 0) {
$user = $stm->fetchObject();
$result = $user;
} else {
$result = false;
}
}
} else {
$result = false;
}
}catch(PDOException $e) {
$message = $e->getMessage();
// log error in log file
error_log($message, 3, "../logs.txt");
}
return $result;
}
Toevoeging op 15/07/2015 20:53:51:
Bedankt Thomas en Eddy, simpel houden is inderdaad een goed advies!
De gebruikersinformatie die al in de db bekend is, wordt in het formulier ingevuld inderdaad.