Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][jQuery] dodanie wierszy i przeliczenie
lustfingers
post 14.02.2017, 21:22:47
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


W ramach nauki programowania zacząłem pisać formularz który może pomóc mi wykonywać codzienne obliczenia, znudził mi sie excel a jak to ogarnę to spróbuję jeszcze dopisać zapis i odczyt z bazy danych.

Mam to:
https://jsfiddle.net/mq3da7kb/3/

  1. Weight: <input type="text" name="weight" id = "weight" value="" /><br/><br/>
  2.  
  3.  
  4. Line: <input type="text" name="percent" id = "percent" value="" />
  5. <input type="text" name="additional" id = "additional" value="" />
  6. Line total: <span class="total"></span>
  7. <br/>+<br/>
  8. <p>Total percent (from #percent): </p>


  1. $("#additional, #percent, #weight").on('keyup',function(){
  2. var total= $("#weight").val() * $("#percent").val() / (100 -$("#additional").val())
  3. $(".total").html(total.toFixed(2));
  4. })
  5.  


Wiersz Line ma sie powielać gdy przyciśniemy na + natomiast Weight ma występować tylko raz ponieważ będzie identyczny dla każdego Line, a Total percent ma zliczać z każdego Line wartości.

Potrzebuje nakierowania jak dodać możliwość powielania wierszy? Za pewne będę musiał przerobić skrypt i dodać jakąś inkrementacje dla każdego id żeby dobrze zliczało każdą linię oddzielnie? Macie może jakieś przykłady takiego formularza albo coś na czym mógłbym się uczyć?
Go to the top of the page
+Quote Post
pmir13
post 15.02.2017, 00:00:22
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


Ustawiasz pierwszą linię w jakimś divie, wrzucasz go do zmiennej np linesdiv, przycisk z plusikiem też niech ma jakiś id np addline, robisz z niego link i dodajesz coś typu: ( i to licznik linii )
  1. $("#addline").live("click", function() {
  2. $("<p> tutaj html nastepnej linii </p>").appendTo(linesdiv);
  3. i++;
  4. return false;
  5. });

Oczywiście potem musisz jeszcze zliczać ze wszystkich linii.

Ten post edytował pmir13 15.02.2017, 00:03:20
Go to the top of the page
+Quote Post
viking
post 15.02.2017, 07:51:22
Post #3





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


@pmir13: Halo, halo. Jest 2017 rok, live już dawno nie istnieje.
Możesz też klonować element - clone();

A przede wszystkim to powinieneś uporządkować html. id nie mogą być dla linii bo będą się powtarzać, zamień na klasu. weight może pozostać. plusa opakuj w jakiś dodatkowy element (może button) żeby podpiąć zdarzenie.

https://jsfiddle.net/mq3da7kb/4/

Ten post edytował viking 15.02.2017, 08:24:32


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 15.02.2017, 19:11:54
Post #4





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


Dzięki za pomoc, @viking trochę przerobiłem to co napisałeś. Wsadziłem wszystko w form dodałem ukrytego inputa który ma sie powielać zamiast ostatniego i teraz próbuję dopisać obsługę zliczania ale nie wiem czemu zlicza mi tylko z pierwszego inputa: https://jsfiddle.net/mq3da7kb/6/
Go to the top of the page
+Quote Post
viking
post 15.02.2017, 20:41:11
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Inputy są dodawane dynamicznie a ty wybierasz jeden przed dodaniem dynamicznie kolejnych. Dlaczego delegate skoro jest to przestarzała metoda?

Poza tym już to wszystko masz. Po co ponownie przypinać kolejne identyczne prawie zdarzenia (change jest na utratę focusa)?
https://jsfiddle.net/mq3da7kb/7/

Ten post edytował viking 15.02.2017, 20:53:24


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 16.02.2017, 17:44:44
Post #6





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


Dzięki za pomoc mam pytanie odnośnie struktury pliku czy da się to łatwo zapisać do bazy danych? Generalnie chce zrobić opcje dodawania formularzy i ich zapisu do bazy, każdy formularz może posiadać nieokreśloną liczbę linii i trzeba je jakoś jeszcze rozróżnić żeby się to później dało odczytać.
Go to the top of the page
+Quote Post
Lord
post 16.02.2017, 21:28:09
Post #7





Grupa: Zarejestrowani
Postów: 239
Pomógł: 32
Dołączył: 10.03.2004

Ostrzeżenie: (10%)
X----


Cytat(lustfingers @ 16.02.2017, 19:44:44 ) *
Dzięki za pomoc mam pytanie odnośnie struktury pliku czy da się to łatwo zapisać do bazy danych? Generalnie chce zrobić opcje dodawania formularzy i ich zapisu do bazy, każdy formularz może posiadać nieokreśloną liczbę linii i trzeba je jakoś jeszcze rozróżnić żeby się to później dało odczytać.

Jezeli chodzi ci o to zeby ustawienia formularzy (jakie maja pole itd) miec w bazie to możesz zrobic tabele w ktorej masz

fomularz
  1. id ( w relacji z tabela_pol.id_formularza)
  2. method
  3. action



tabela_pol
  1. id
  2. id_formularza
  3. typ_inputu
  4. value
Go to the top of the page
+Quote Post
lustfingers
post 17.02.2017, 09:01:31
Post #8





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


Chodzi mi o to że klikając na znak + tworzy się kolejne inputy które są identyczn a różnią się tylko wartością, oraz tym że nigdy nie wiadomo z góry ile ich będzie więc raczej nie będzie to prosty zapis do bazy gdzie z góry mogę sobie zdefiniować jakie to pola.
Go to the top of the page
+Quote Post
viking
post 17.02.2017, 09:12:53
Post #9





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Nie ma żadnej rożnicy czy pole jest jedno czy 20. Będziesz miał te dane w POST. Może najpierw "na sucho" przećwicz podstawowe operacje na bazie.


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 18.02.2017, 18:14:22
Post #10





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


Próba zapisu do bazy nie powiodła się sukcesem z dwóch powodów, pierwszy jest taki że total nie jest inputem więc w bazie jest zapisywany NULL, a drugi powód jest taki że przy kilku liniach jest zapisywana tylko jedna czyli ta z ostatniego li.

Kod który wykorzystuje do zapisania w bazie wygląda następująco:
  1. <?php
  2.  
  3. try
  4. {
  5. $pdo = new PDO('mysql:host=localhost;dbname=zpe5', 'root', '');
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $pdo->exec('SET NAMES "utf8"');
  8. }
  9. catch (PDOException $e)
  10. {
  11. $error = 'Nie można nawiązać połączenia z serwerem bazy danych.';
  12. //include 'error.html.php';
  13. exit();
  14. }
  15.  
  16. if (isset($_POST['weight']) OR isset($_POST['percent']) OR isset($_POST['additional']) OR isset($_POST['income_sum']) OR isset($_POST['total']))
  17. {
  18. try
  19. {
  20. $sql = 'CREATE TABLE IF NOT EXISTS `frominput` (
  21. weight INT(10),
  22. percent float,
  23. additional float,
  24. income_sum float,
  25. total float
  26. );
  27. INSERT INTO frominput SET
  28. weight = :weight,
  29. percent = :percent,
  30. additional = :additional,
  31. income_sum = :income_sum,
  32. total = :total';
  33. $s = $pdo->prepare($sql);
  34. $weight = $_POST['weight'];
  35. $percent = $_POST['percent'];
  36. $additional = $_POST['additional'];
  37. $income_sum = $_POST['income_sum'];
  38. $total = $_POST['total'];
  39. $s->bindValue(':weight', $_POST['weight']);
  40. $s->bindValue(':percent', $_POST['percent']);
  41. $s->bindValue(':additional', $_POST['additional']);
  42. $s->bindValue(':income_sum', $_POST['income_sum']);
  43. $s->bindValue(':total', $_POST['total']);
  44. $s->execute();
  45. }
  46. catch (PDOException $e)
  47. {
  48. $error = 'Błąd przy zapisie: ' . $e->getMessage();
  49. //include 'error.html.php';
  50. exit();
  51. }
  52.  
  53. //header('Location: .');
  54. //exit();
  55. }
  56.  
  57. ?>
Go to the top of the page
+Quote Post
Lord
post 18.02.2017, 23:19:31
Post #11





Grupa: Zarejestrowani
Postów: 239
Pomógł: 32
Dołączył: 10.03.2004

Ostrzeżenie: (10%)
X----


A możesz pokazać co masz w momencie zapisu w POST?

Jesteś pewien, że każde pole jakie przekazujesz ma innego name?
Go to the top of the page
+Quote Post
viking
post 19.02.2017, 07:41:45
Post #12





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Po co wywołujesz create dla każdego odwołania? Nie ma też sensu przypisywanie zmiennych post do zmiennych skoro nigdzie tego nie używasz później. Oczywistym jest też że skoro wszystkie mają takie samo name to będą nadpisane. Myślałem że trochę pomyślisz sam i wstawisz tam np tablicę wartości [].


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 20.02.2017, 15:25:26
Post #13





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


Ok, teraz są przekazywane w tablicy tylko jak to zapisać do bazy? Gdy próbuję tak:

  1. if (isset($_POST['weight']) OR isset($_POST['percent']) OR isset($_POST['additional']) OR isset($_POST['income_sum']) OR isset($_POST['total']))
  2. {
  3. try
  4. {
  5. $percent = $_POST['percent'];
  6. $additional = $_POST['additional'];
  7. foreach($percent as $percent):
  8. foreach($additional as $additional):
  9. $sql = 'CREATE TABLE IF NOT EXISTS `frominput` (
  10. weight INT(10),
  11. percent float,
  12. additional float,
  13. income_sum float,
  14. total float
  15. );
  16. INSERT INTO frominput SET
  17. percent = :percent,
  18. additional = :additional';
  19. $s = $pdo->prepare($sql);
  20. $s->bindValue(':percent', $percent);
  21. $s->bindValue(':additional', $additional);
  22. $s->execute();
  23. endforeach;
  24. endforeach;
  25. }


To zapisuje sie do bazy tylko wartości z additional natomiast te z percent już nie.

W powyższym kodzie zamieniłem to

  1. $percent = $_POST['percent'];
  2. $additional = $_POST['additional'];
  3. foreach($percent as $percent):
  4. foreach($additional as $additional):


na to

  1. $percents = $_POST['percent'];
  2. $additionals = $_POST['additional'];
  3. foreach($percents as $percent):
  4. foreach($additionals as $additional):


I teraz zapisuje do bazy natomiast nie w sposób chciany gdy np. uzupełnię 2 linie + trzecia linia ukryta to w bazie powinno być 3 wpisy natomiast jest ich 9.

Powinno być np.:

|0|0|- ukryty input
|1|3|- wartości z inputa 1
|2|4|- wartości z inputa 2

a robi mi kombinacje wszystkich:

|0|0|
|0|3|
|0|4|
|1|0|
|1|3|
|1|4|
|2|0|
|2|3|
|2|4|

Go to the top of the page
+Quote Post
viking
post 20.02.2017, 15:36:02
Post #14





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


No i słusznie. Nauczyłeś się jak działa podwójny foreach. Naprawdę, pomyśl trochę. Nikt nie będzie za ciebie ciągle kodu pisał. Ja bym tam wstawił 1 for i wykorzystał licznik.


--------------------
Go to the top of the page
+Quote Post
lustfingers
post 20.02.2017, 15:47:23
Post #15





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

Ostrzeżenie: (0%)
-----


EDIT.

Ogarnąłem swój błąd i idę dalej, zapis zrobiłem tak:

  1. $values = array();
  2. for($i=0 ;$i < count($_POST['percent']); $i++) {
  3. $values[] = '("' . $_POST['percent'][$i] . '","' . $_POST['additional'][$i] . '")';
  4. }
  5. $sql = "CREATE TABLE IF NOT EXISTS `frominput` (
  6. //weight INT(10),
  7. percent float,
  8. additional float,
  9. //income_sum float,
  10. //total float
  11. );
  12. INSERT INTO frominput (percent, additional) VALUES " . implode(',', $values);
  13. $s = $pdo->prepare($sql);
  14. $s->execute();


Pytanie jeszcze odnośnie zamiany w inpucie znaku przecinka na kropkę gdy dodam w inpucie onChange="this.value=this.value.replace(/,/g, '.');" wtedy wynik jest NaN.
Go to the top of the page
+Quote Post
viking
post 20.02.2017, 16:30:16
Post #16





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


  1. for($i=0 ;$i < count($_POST['percent']); $i++) {

Podstawowy błąd początkującego. Przy każdym przebiegu pętli liczysz od nowa elementy tablicy:

  1. for($i=0, $count = count($_POST['percent']) ;$i < $count; $i++) {


... onChange="... Po co pchasz w html zdarzenia skoro masz je ładnie wydzielone? Żeby później szukać w szablonach kodu js? https://jsfiddle.net/mq3da7kb/8/


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.08.2025 - 03:14