Wat is de juist manier van uitvoer UPDATE

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Iris B

Iris B

15/07/2015 19:39:45
Quote Anchor link
Dag allen,

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
 
PHP hulp

PHP hulp

26/04/2024 00:20:07
 
Ward van der Put
Moderator

Ward van der Put

15/07/2015 20:12:42
Quote Anchor link
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.

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/07/2015 20:17:13
Quote Anchor link
(EDIT: dit is een reactie op het oorspronkelijke topic, niet op Wards reactie :))

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
 
Eddy E

Eddy E

15/07/2015 20:48:05
Quote Anchor link
Precies. Je kan (moet) het formulier wel van te voren vullen met de reeds bekende data uiteraard.
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.
 
Iris B

Iris B

15/07/2015 20:49:25
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.