Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][jQuery] dodanie wierszy i przeliczenie
Forum PHP.pl > Forum > Przedszkole
lustfingers
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ć?
pmir13
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.
viking
@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/
lustfingers
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/
viking
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/
lustfingers
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ć.
Lord
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
lustfingers
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.
viking
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.
lustfingers
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. ?>
Lord
A możesz pokazać co masz w momencie zapisu w POST?

Jesteś pewien, że każde pole jakie przekazujesz ma innego name?
viking
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 [].
lustfingers
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|

viking
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.
lustfingers
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.
viking
  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/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.