jQuery gegenereerde input velden opslaan in database?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xaboteur X

Xaboteur X

13/03/2012 20:20:03
Quote Anchor link
Hallo allemaal,

Ik ben bezig met het creëren van een eigen facturatiesysteem (invullen, opslaan, wijzigen, pdf, afdrukken)
Tot op heden heb ik de eerste fase afgerond. Er kan dus een factuur worden ingevuld en met behulp van jQuery kunnen er extra factuurvelden (rijen) worden toegevoegd.

Probleem:
Nu zou ik dus graag de ingevulde velden allemaal willen opslaan in een database, en nadien ophalen.
Maar omdat verschillende invul velden gegenereerd zijn met jQuery, kom ik er totaal niet uit hoe ik al deze velden kan verwerken met php..
Hoe zou ik ieder gegenereerd veld een aparte naam kunnen geven, en het juiste aantal velden door php laten verwerken? Aangezien niet elke factuur evenveel velden vereist.

Kan iemand mij uitleggen hoe ik dit het best kan doen? Eventueel met voorbeeld?

Bedankt!
 
PHP hulp

PHP hulp

22/12/2024 19:42:05
 
Reshad F

Reshad F

13/03/2012 20:36:07
Quote Anchor link
dit probleem had ik zelf ook, ik had het simpel opgelost gewoon 8 rows toegevoegd in een table en ervoor gezorgd dat ik max 8 dingen aan kon maken met jquery wat in die rows werd weggeschreven..

dus dan had ik met jquery steeds bijv.

rij1
rij2
rij3

waarbij alleen de cijfer veranderde en in mijn table had ik rij1 tm rij 8 zelf erin gezet..

als je hiermee genoeg geholpen zou kunnen zijn dan zou je het zo op kunnen lossen als er iemand een beter manier weet dan wil ik dat zelf ook graag weten :)
 
Xaboteur X

Xaboteur X

13/03/2012 20:39:16
Quote Anchor link
Dat is inderdaad een mogelijkheid, die ik zeker ga hanteren als niemand een efficiëntere manier kan uitleggen. :)
Bedankt.
Gewijzigd op 13/03/2012 20:40:10 door Xaboteur X
 
Vincent Huisman

Vincent Huisman

13/03/2012 21:00:17
Quote Anchor link
dan moet je een extra tabel maken waar je al die waarden in gaat zetten en die linken naar je andere tabel. Om het er in te zetten kan je de html input name's als array maken.

zie ook als vergelijkbaar materiaal:
http://www.php.net/manual/en/features.file-upload.multiple.php
 
Xaboteur X

Xaboteur X

13/03/2012 21:22:49
Quote Anchor link
Een extra tabel met nog eens dezelfde waardes? Is dat niet wat omslachtig?

Maar om de velden zo te verwerken, als array, is wel mogelijk, maar dan ga ik problemen krijgen met ze te onderscheiden vrees ik...
Gewijzigd op 13/03/2012 21:24:10 door Xaboteur X
 
Erwin H

Erwin H

13/03/2012 21:54:55
Quote Anchor link
Als je het makkelijk wilt doen dan kan je de methode van Reshadd gebruiken. Echter zal je dan snel tegen problemen aanlopen. Wat doe je als een factuur 9 velden nodig heeft bijvoorbeeld? Wat als er bijna nooit het maximum nodig is en je dus veel overbodige lege velden in je tabel hebt?
Als je het op een juiste, genormaliseerde manier wilt oplossen dan moet je een manier bedenken om elke "regel" met extra velden op je factuur ook als een regel (record) in je database op te slaan. Zodat je altijd genoeg records kunt aanmaken en nooit te veel lege records hebt. Dan kom je dus bij de manier van Vincent uit. Op zich is dit ook zeker geen omslachtige manier en zeker niet minder efficient, in tegendeel. In het begin misschien wat lastiger, zeker conceptueel, maar voor de toekomst een betere methode.

Als je hier iets meer info kan plaatsen met hoe de info er uit ziet, of kan zien, dan kunnen we je vast wel op weg helpen met de juiste structuur.
 
Xaboteur X

Xaboteur X

13/03/2012 23:09:03
Quote Anchor link
Ok, omdat het moeilijk is om die code te laten zien, ga ik het met images wat meer uitleggen. :)

Dus, zodra de factuurpagina wordt geladen, staat er één rij invulvelden hard-gecodeerd in de html.

Afbeelding


Door middel van het '+' en '-' icoontje, kan ik met jQuery rijen toevoegen, of verwijderen.
En met behulp van de vinkjes aan de rechterkant kan ik vooraf ingestelde modules toevoegen.

Afbeelding


De lege, 'custom' rijen hebben volgende html:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<tr class="tr-custom">
    <td><input type="text" class="input-custom input-txt" name="customtxt[]" /></td>
    <td><input type="text" class="input-custom input-int input-aantal" name="customamount[]" /></td>
    <td><input type="text" class="input-custom input-int input-prijs" value="0,00" name="customprice[]" /></td>
    <td><input type="text" class="input-custom input-int input-totaal" value="0,00" name="customtotal[]" /></td>
</tr>



En de modules worden als volgt ingevoegd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$("table.fact-table tr:last").after("
<tr class=\"tr-"+module+" tr-module\">
    <td class=\"module\"><span class=\"module-tag\">[module]</span>&nbsp; "+module+"<input type=\"hidden\" value=\""+module+"\" name=\""+module+"\" /></td>
    <td><input type=\"text\" class=\"input-int input-aantal\" value=\"1\" name=\""+module+"Amount\" /></td>
    <td class=\"module-prijs\"><input type=\"text\" class=\"input-int input-prijs\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Price\" /></td>
    <td class=\"column-total module-total\"><input type=\"text\" class=\"input-int input-totaal\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Total\" /></td>
</tr>");



Ik hoop dat dit een beetje duidelijk is... :)
Gewijzigd op 13/03/2012 23:09:55 door Xaboteur X
 
Erwin H

Erwin H

13/03/2012 23:21:41
Quote Anchor link
Dus heel kort gezegd zijn de regels op je factuur producten die de volgende gegevens hebben:
- beschrijving (naam van het product)
- aantal
- prijs
(- totaal, maar dat is een product van aantal en prijs, kan je dus op elk moment berekenen)

Dit is in feite al de structuur van je tabel, hoewel je het nog ietsje moet uitbreiden als je het echt netjes genormaliseerd wilt hebben. Dan maak je een tabel voor de producten (waarin je product specifieke info zet als naam, beschrijving en prijs) en een koppel tabel waarin je de producten aan de facturen koppelt. Je zou dan uitkomen op een structuur min of meer als volgt:

tabel: facturen (deze tabel heb je als het goed is al)
- factuur_id
- klant
- adres
- etc etc

tabel: producten
- product_id
- product_naam
- beschrijving
- prijs

tabel: factuur_product
- id
- factuur_id
- product_id
- aantal

Zo kan je een many-to-many relatie aanleggen tussen je producten en de facturen.
Gewijzigd op 13/03/2012 23:22:11 door Erwin H
 
Reshad F

Reshad F

13/03/2012 23:26:00
Quote Anchor link
voor de normalisatie van een shop is dit een hele goede tutorial

http://www.phphulp.nl/php/tutorial/overig/normaliseren/150/

en dit in combinatie wat erwin voorgelegd heeft kom je al een heel eind met normaliseren volgens mij.

ik had toen ik met zoiets bezig was mijn db niet goed genormaliseerd en kwam wel tegen behoorlijk veel problemen aan.
dus normaliseren is wat erwin zegt inderdaad heel verstandig en belangrijk voor in de toekomst ook.

mijn methode dus alleen gebruiken als het echt niet meer kan. :)
 
Xaboteur X

Xaboteur X

13/03/2012 23:28:55
Quote Anchor link
Hmm... Die tabel structuren lijken mij goed ja.

Maar mijn probleem is nu, als ik dus mijn factuur heb ingevuld (vb: img 2), hoe ik al die velden kan opslaan in de database?
Aangezien lege invulvelden en modulevelden gegenereerd worden met bovenstaande code via jQuery...

Het probleem is dus eigenlijk het genereren van nieuwe invulvelden, die ook door php verwerkt moeten worden en in de database moeten worden gestoken. En nadien kunnen opgehaald worden op de juiste plaats, voor wijzigingen aan te brengen. Maar dit laatste is nog niet echt van belang nu.
 
Erwin H

Erwin H

13/03/2012 23:31:17
Quote Anchor link
Hoe stuur je het van de client naar de server? Via een standaard form actie (post)?
 
Xaboteur X

Xaboteur X

13/03/2012 23:33:31
Quote Anchor link
Dat is de bedoeling ja, eventueel met een $.ajax post.
 
Erwin H

Erwin H

13/03/2012 23:43:21
Quote Anchor link
Als je het met een Ajax methode doet wordt het makkelijker, omdat je dan regel voor regel kan doen. Zelfs al voordat de hele factuur klaar is. In dat geval kan je de waardes in de inputs per regel versturen, zelfs als ze leeg zijn. Aan de server kant kijk je of het product al in de database staat, zo niet dan sla je het op in de product tabel. Daarna pak je het id van het product en maak je de koppeling in de koppel tabel.
Probeer het gewoon stap voor stap te doen. Alles bij elkaar lijkt het misschien een beetje complex, maar stap voor stap zijn het allemaal zaken die je al kent.

Wil je het niet via ajax doen, maar gewoon met een normale post actie dan kan het ook. Zorg dat je hele tabel in een form staat zodat alles mee gaat. Geef dan elke regel een volgnummer (de eerste 0, de tweede 1, de derde 2 etc) en geef de naam van de inputs hetzelfde volgnummer mee ("naam0", "aantal0", "prijs0" etc.). Zelf zou ik er ook een hidden input bij geven waarin dit volgnummer ook verwerkt zit, dan weet je zeker dat je een element in je POST array krijgt die elk volgnummer heeft. Dus bijvoorbeeld een hidden input met een naam "regel0", waarde doet er niet toe, kan gewoon 1 zijn.
Dan op de server loop je met een while loop door de POST array heen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$count
= 0;
while ( isset( $_POST['regel'.$count] ) ){
  //lees de waardes uit voor alle inputs in de regel
  $count++;
}

?>

Per loop kan je dus een regel uitlezen en opslaan.
Gewijzigd op 13/03/2012 23:44:57 door Erwin H
 
Xaboteur X

Xaboteur X

14/03/2012 23:46:16
Quote Anchor link
Ik ga dat eens uitproberen Erwin, bedankt!
Maar hoe zou ik best de waardes opslaan in de database?
Dan moet ik de facturen tabel op voorhand een groot aantal kolommen geven, zodat ik zeker alle waardes kan opslaan?
Graag zou ik de waardes makkelijk onderscheidbaar willen kunnen ophalen..
Gewijzigd op 14/03/2012 23:48:21 door Xaboteur X
 
Erwin H

Erwin H

15/03/2012 09:29:03
Quote Anchor link
Zie een vorige post. Je hebt drie tabellen nodig. De factuur tabel, een product tabel en een koppeltabel.
 
Xaboteur X

Xaboteur X

15/03/2012 13:50:56
Quote Anchor link
Ja, maar een factuur kan toch meerdere producten bevatten?
Hoe kan ik het best al die gegevens in één record zetten?
Of mis ik iets?
Gewijzigd op 15/03/2012 13:51:28 door Xaboteur X
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

15/03/2012 15:06:19
Quote Anchor link
Erwin H op 13/03/2012 23:21:41:

tabel: facturen (deze tabel heb je als het goed is al)
- factuur_id
- klant
- adres
- etc etc

tabel: producten
- product_id
- product_naam
- beschrijving
- prijs

tabel: factuur_product
- id
- factuur_id
- product_id
- aantal

Zo kan je een many-to-many relatie aanleggen tussen je producten en de facturen.


Dat lijkt me toch duidelijk genoeg.
1 kanttekening: De prijs van een product is momentgebonden dus zou in de factuur_product tabel erbij moeten
 
Erwin H

Erwin H

15/03/2012 15:09:55
Quote Anchor link
Xaboteur X op 15/03/2012 13:50:56:
Ja, maar een factuur kan toch meerdere producten bevatten?
Hoe kan ik het best al die gegevens in één record zetten?
Of mis ik iets?

Blijkbaar wel, want zoals ik dus al zei je kan per facturen meerdere regels in die andere tabel hebben.

En Ger heeft inderdaad gelijk met die prijs. Misschien wil je die niet in de producttabel hebben inderdaad. Ik dacht later ook aan kortingen die bepaalde klanten kunnen krijgen waardoor de prijs anders is en als de prijs in de product tabel staat heb je daar een probleem mee.
 
Xaboteur X

Xaboteur X

15/03/2012 16:02:18
Quote Anchor link
Ik denk dat ik weet wat ik over het hoofd zag...

De Factuur-Product tabel kan er dus als volgt uitzien:

fact_id - prod_id
123 - 22
123 - 23
123 - 34
124 - 11
124 - 14

Ik had er dus niet rekening mee gehouden dat er meerdere dezelfde factuur_id's in die tabel konden, maar dat is net de bedoeling van heel die normalisatie he! :)
Excuses..
Bedankt!
 
Erwin H

Erwin H

15/03/2012 16:06:37
Quote Anchor link
Precies ;-)
 



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.