Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949
Post gewoon heel de reut naar save.php (in mijn geval save.asp
1
2
3
4
5
| Als Actie="nieuw" Then Insert Else Update End Als |
Ik doe het meestal nog een tikkie anders: Ik heb meestal een StoredProcedure (UpdateMember bijvoorbeeld). Die heeft als parameters het Member ID, Naam, Email enzovoorts. Als het ID>0 dan is het een bestaande member en dien ik 'm te updaten (mits controles als wachtwoord e.d. goed zijn natuurlijk) en is het ID<0 (-1 in mijn geval altijd) dan is het een nieuwe member.
De stored Procedure laat ik dan uitzoeken wat het ID is en afhankelijk daarvan een insert of update doen en het nieuwe/gewijzigde ID teruggeven.
Een "uitgekleed" voorbeeldje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| CREATE PROCEDURE [sp_UpdateProduct]
@intID as int,
@strCode as varchar(10),
@strOmschrijving as varchar(100),
@intDefAantal as int,
@cPrijs as money,
@intBTWCID as int
AS
SET nocount ON
BEGIN TRANSACTION
IF @intID>0
BEGIN
UPDATE tbl_Producten Set
prod_code = @strCode,
prod_omschrijving = @strOmschrijving,
prod_defaultaantal = @intDefAantal,
prod_btwc_id = @intBTWCID,
prod_prijs = @cPrijs
Where prod_ID = @intID
IF @@error <> 0 GOTO _error
END
ELSE
BEGIN
INSERT INTO tbl_Producten (
prod_code, prod_omschrijving, prod_defaultaantal, prod_btwc_id, prod_prijs
) VALUES (
@strCode, @strOmschrijving, @intDefAantal, @intBTWCID, @cPrijs
)
IF @@error <> 0 GOTO _error
SET @intID = @@IDENTITY
END
_exit:
BEGIN
COMMIT TRANSACTION
set nocount off
SELECT @intID AS success
RETURN
END
_error:
BEGIN
ROLLBACK TRANSACTION
set nocount off
SELECT -1 AS success
RETURN
END
GO |
Het grappige is dat je in je PHP/ASP/Whatever je dus geen zorgen hoeft te maken of het een nieuw of bestaand record is. Je stampt gewoon tegen dezelfde Stored Procedure aan met dezelfde parameters. En je kunt je SP centraal aanpassen (dus maak je er een parameter bij, dan zit je meteen in de buurt van de update en insert). En dan heb ik het nog niet over de overige voordelen van SP's
Nu heb je in MySQL geen stored procedures, maar ik kan me voorstellen dat je gewoon een PHP include maakt met daarin dus functies als UpdateMember(id,name, email...) en dus die functies gewoon aanroept. In die functies doe je dezelfde "If ID>0"-test et voila. Je kunt nu vanuit iedere pagina gewoon tegen die functie aan stampen (mits je de juiste includes meeneemt etc. natuurlijk) alsof het SP's waren.
[ Voor 201% gewijzigd door RobIII op 10-03-2005 16:29 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
En, ik had het er vooral over dat je ook maar 1 form hoeft te maken, voor edits, ipv 2 verschillende. Dat los je ook niet op met 1 eenduidige save.
Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949
Daarom zeg ik ook dat je het nog beter in een functie kunt stoppen. Je zult toch Update en Inserts blijven houden en het dus op 2 plaatsen aan moeten passen. Als je dat lekker centraal in een functie (in een include) doet heb je de minste problemen met het aanpassen. Ik zou niet weten hoe je het anders zou moten doen.PanMan schreef op vrijdag 11 maart 2005 @ 01:51:
Met 1 save.php moet je natuurlijk nogsteeds 2 verschillende code's aanpassen voor een verandering in tabelstruktuur, alleen zitten deze nu in hetzelfde bestand..
PanMan schreef op vrijdag 11 maart 2005 @ 01:51:
En, ik had het er vooral over dat je ook maar 1 form hoeft te maken, voor edits, ipv 2 verschillende. Dat los je ook niet op met 1 eenduidige save.
Pseudo-code voorbeeldje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <%
MYID = Request.querystring("id")
If MYID > 0 ' Klant ophalen uit database
Select_from_database_blabla("id = " + MYID )
'vangen wat je doet als de klant niet bestaat blabla
MyName= Database_blabla("Name")
MyAddress = Database_blabla("Address")
else
MYID = -1
MyName = "Nieuwe klant"
MyAddress = "voer uw adres is"
end if
%>
<form name="frmTest" action="save.php" method="post">
<input type="hidden" name="hdID" value="$MYID">
Naam : <input name="txtName" type="text" value="$MyName"><br>
Adres : <input name="txtAddress" type="text" value="$MyAddress "><br>
...
...
</form> |
vervolgens vul je met PHP het ID. Gebruik >0 voor een bestaande persoon, <0 voor een nieuwe. (Ik gebruik altijd -1). Ik zie niet waarom je daar 2 forms voor zou moeten maken. En dat los je dus wel degelijk op met 1 form. Ik gebruik het al jaren zo. 1 form voor inserts en updates.
Iets zegt me (gezien je homepage http://www.panman.nl ) dat je met een WYSIWYG editor ofzo werkt en je code dus niet "zelf" of beter: "met de hand" schrijft. Ik denk dan ook dat je een te "omslachtige" methode hebt aangeleerd. Maar ik kan me natuurlijk vergissen.
Kun je anders eens een voorbeeld geven van hoe je het nu doet en wat je bedoelt?
[ Voor 27% gewijzigd door RobIII op 11-03-2005 02:18 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
zou je dus net zo goed semantisch je database kunnen genereren, dan is de vraag, waarom zou je SQL nog willen gebruikenGomez12 schreef op vrijdag 11 maart 2005 @ 02:35:
Gewoon dynamisch je sql opbouwen, dat je gewoon alle velden definieert in je code en dan adhv update/nieuw of een update statement genereren of een insert statement genereren. Een database verandering is dan maar 1x je velden veranderen en de rest volgt vanzelf ( als je het goed doet )
Steun Elkaar, Kopieer Nederlands Waar!
Dit is precies de manier waarop ik het al tijden doe. Mijn 'gestandariseerde' manier van werken gaat via 1 form voor add/edit en 1 formulier voor remove. In het form van add/edit is in principe zo goed als alles gelijk voor add/edit, afgezien van bv een vinkje om meerdere keren een item in te kunnen voegen zonder steeds op de overzichtpagina op 'nieuw item' (or whatever) te moeten klikken.PanMan schreef op donderdag 10 maart 2005 @ 16:15:
Nu zit ik voor een nieuw projectje een andere aanpak te overwegen: Alleen een minimale insert, en vervolgens maar 1 formulier ontwerpen voor het edditen van gegevens, aan de hand van het ID van de insert. Als er dan een nieuw item wordt gemaakt, zit je feitenlijk te edditen in al bestaande, lege, gegevens.
In mijn geval heb ik nog wel aparte afhandeling van de data, alhoewel dat ook eens op de schop moet omdat inderdaad zo goed als alles gelijk is (afgezien van de insert/update dus). Voor mij is echter de consistentie in mijn code erg belangrijk (anders raak ik het spoor bijster), dus als ik dit verander moet het gelijk voor al m'n websites.
Ook Knor is aangestoken met het ligfietsvirus!
Ik denk dat je je inderdaad vergistRobIII schreef op vrijdag 11 maart 2005 @ 02:14:
Daarom zeg ik ook dat je het nog beter in een functie kunt stoppen. Je zult toch Update en Inserts blijven houden en het dus op 2 plaatsen aan moeten passen. Als je dat lekker centraal in een functie (in een include) doet heb je de minste problemen met het aanpassen. Ik zou niet weten hoe je het anders zou moten doen.
vervolgens vul je met PHP het ID. Gebruik >0 voor een bestaande persoon, <0 voor een nieuwe. (Ik gebruik altijd -1). Ik zie niet waarom je daar 2 forms voor zou moeten maken. En dat los je dus wel degelijk op met 1 form. Ik gebruik het al jaren zo. 1 form voor inserts en updates.
Iets zegt me (gezien je homepage http://www.panman.nl ) dat je met een WYSIWYG editor ofzo werkt en je code dus niet "zelf" of beter: "met de hand" schrijft. Ik denk dan ook dat je een te "omslachtige" methode hebt aangeleerd. Maar ik kan me natuurlijk vergissen.
Kun je anders eens een voorbeeld geven van hoe je het nu doet en wat je bedoelt?
Dat je toch altijd inserts en updates houd is dus niet helemaal waar: Ik stel dus voor om alleen een minimale insert te doen, waarbij niets wordt opgeslagen behalve een nieuwe row.
Die nieuwe row kan je dan altijd met updates bewerken. En daardoor heb je dus nog maar 1 query die je aan hoeft te passen, en alleen een form voor updates, geen inserts. (want die zijn altijd een heel simpele query, die niet zal veranderen). Zal zo even een voorbeeldje posten.
Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949
Ik ken het probleemPanMan schreef op vrijdag 11 maart 2005 @ 11:34:
Ik denk dat je je inderdaad vergist. Ik begrijp dat m'n homepage niet een heel uitgebreide indruk geeft, van mijn werk, maar zolang ik zo genoeg werk heb, heeft die nooit echt veel prioriteit gehad. Ik schrijf iig al mijn code zelf, in Ultraedit.
PanMan schreef op vrijdag 11 maart 2005 @ 11:34:
Dat je toch altijd inserts en updates houd is dus niet helemaal waar: Ik stel dus voor om alleen een minimale insert te doen, waarbij niets wordt opgeslagen behalve een nieuwe row.
Die nieuwe row kan je dan altijd met updates bewerken. En daardoor heb je dus nog maar 1 query die je aan hoeft te passen, <knip>
En hoeveel werk heb je nou werkelijk als er 1 veldje bij komt? In mijn voorbeeld (met de SP) moet je op 2 plaatsen (binnen dezelfde SP!) een veldnaampje typen. Hoewel dat misschien inderdaad meer typewerk is (goh, 15 tekens ofzo...) komt dat de overzichtelijkheid wel ten goede denk ik.
En nogmaals: Ik gebruik ook "maar" 1 form voor inserts én updates. Ik zie niet waar je het idee vandaan haalt om 2 (of meer?) forms te moeten gebruiken voor een insert / updatePanMan schreef op vrijdag 11 maart 2005 @ 11:34:
...en alleen een form voor updates, geen inserts. (want die zijn altijd een heel simpele query, die niet zal veranderen). Zal zo even een voorbeeldje posten.
[ Voor 27% gewijzigd door RobIII op 11-03-2005 11:45 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
1
2
3
| $dbclass->insert("<TABLENAME>", $array); // of $dbclass->update("<TABLENAME>", $array, "<WHERE CLAUSE>"); |
De array is als volgt opgebouwd.
1
| $array = array ("<DB_FIELDNAME>" => $data); |
In de in db class word alle strings geescaped en veilig de database in gegooid.
Het grootte voordeel van deze manier bijna rechtstreeks form data in de database kan posten.
Programmer - an organism that turns coffee into software.