Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Checkbox i suma wartości checkboxa
Forum PHP.pl > Forum > Przedszkole
hunter777
mam problem ze rozwiązaniem zagadnienia z wartością checkboxow, bez problemu mam działający skrypt usuwający dane za pomocą chceckboxów ale potrzebuję także zrobić sumę wartości checboxów, może ktoś ma pomysł jak tu zrobić sumę wartości tego pola z mysql np po tabeli wartość
np
Numer Produkt Wartość Usuń[Checkbox]
1 Jabłka 2 []
2 Gruszki 3 []

i po zaznaczeniu dwóch checkboxów okno Zaraz usuniesz 5 produktów, Potwierdź

  1. <script>
  2. $(document).ready(function(){
  3.  
  4. $('#btn_delete').click(function(){
  5.  
  6. if(confirm("Are you sure you want to delete this?"))
  7. {
  8. var id = [];
  9.  
  10. $(':checkbox:checked').each(function(i){
  11. id[i] = $(this).val();
  12. });
  13.  
  14. if(id.length === 0) //tell you if the array is empty
  15. {
  16. alert("Please Select atleast one checkbox");
  17. }
  18. else
  19. {
  20. $.ajax({
  21. url:'delete.php',
  22. method:'POST',
  23. data:{id:id},
  24. success:function()
  25. {
  26. for(var i=0; i<id.length; i++)
  27. {
  28. $('tr#'+id[i]+'').css('background-color', '#ccc');
  29. $('tr#'+id[i]+'').fadeOut('slow');
  30. }
  31. }
  32.  
  33. });
  34. }
  35.  
  36. }
  37. else
  38. {
  39. return false;
  40. }
  41. });
  42.  
  43. });
  44. </script>
  45.  
trueblue
Skoro w pętli zapisujesz wartości zaznaczonych checkboxów, to możesz je od razu sumować.
Albo w ten sposób: https://developer.mozilla.org/pl/docs/Web/J...ty/Array/Reduce
hunter777
niestety też miejsce w skrypcie gdzie pobrać wartość z tablicy i jak jest dla mnie problemem, ponieważ mam moment gdy pyta mnie czy potwierdzam usunięcie i tutaj jak mamy potwierdzenie już nie ma znaczenia sumowanie tylko usuwa dane, chciałbym by to było wcześniej gdy mam potwierdź usunięcie tych wartości.
viking
To przenieś te obliczenia przed ifa
hunter777
na razie odpuściłem usuwanie - spróbuję to później połączyć - zająłem się sumą i udało mi się zrobić sumowanie danych wpisanych ręcznie pod parametr val

  1. <td><?php echo $row["wartosc"]; ?> <input type="checkbox" class="check_list" val="wartosc_recznie"/></td>


ale nie potrafię pobrać wartości z pola z bazy - po prostu nie sumuje mi warosci z mysql a próbuję to robić po prostu tak:

  1. <td><?php echo $row["kwota_netto"]; ?> <input type="checkbox" class="check_list" val="$row["kwota_netto"]"/></td>


a oto skrypt sumujący:

  1. <script>
  2. $(document).ready(function(){
  3. update();
  4. });
  5. $('input[type=checkbox]').click(function(){
  6. update();
  7. })
  8. function update(){
  9. var sum = 0;
  10. $('.check_list').each(function () {
  11. if (this.checked) {
  12. sum += Number($(this).attr("val"));
  13. }
  14. });
  15. $("#sum").html(sum);
  16. var checkCount = $(".check_list:checked").length;
  17. $("#avg").html(parseFloat(sum/checkCount).toFixed(2));
  18. }
  19. </script>
trueblue
Nie dostrzegasz nic nieprawidłowego w Twoim drugim podanym fragmencie?
hunter777
poprawiłem te nawiasy jeśli chodziło o to, pisałem to na szybko, tutaj wklejam skopiowane z kodu

  1.  
  2. <td><?php echo $row["kwota_netto"]; ?> <input type="checkbox" class="check_list" val="$row["kwota_netto"]"/></td>
  3.  
trueblue
Podejrzyj w źródle strony jaki jest efekt.
hunter777
dziekuję - działa - zabrakło echo...
trueblue
Tak, wiem jaki jest efekt, a Ty nadal nie widzisz błędu w tym fragmencie kodu.
hunter777
wyedytowałem ten stary post, znalazłem błąd, dziękuję za pomoc! teraz zabieram się za próbę usunięcia zaznaczonych rekordów czyli spróbuję połączyć te dwa skrypty



niestety skrypt z pierwszego wątku nie chce teraz zmienić flagi zgodnie z plikiem delete.php, po kliknięciu ze skryptu są ostrzeżenia ale nic się nie zmienia niestety.

  1.  
  2. require('db.php');
  3. $id=$_REQUEST['id'];
  4. $query = "UPDATE `new_record` SET `rozliczenia` = '0' WHERE id=$id";
  5. $result = mysqli_query($con,$query) or die ( mysqli_error());
  6.  




mam także drugi problem, chciałbym wyświetlać tylko rekordy, które mają flagę 1 i gdy poniżej dam do "ifa" nie działa to niestety... czy to dobre miejsce na ten warunek?


  1. $query2 = "SELECT * FROM new_record WHERE rozliczenia = 0";
  2. $rozlicz = mysqli_query($con, $query2);
  3.  
  4. <body>
  5. <div class="container">
  6. <br />
  7. <h3 align="center">Lista</h3><br />
  8. <?php
  9.  
  10. if((mysqli_num_rows($result) > 0) && ($rozlicz=1))
  11.  
  12. {
  13. ?>
  14. <div class="table-responsive">
  15. <table class="table table-bordered">
  16. <tr>
  17. <th>Customer Name</th>
  18. <th>Customer Address</th>
  19. <th>Delete</th>
  20. </tr>
  21. <?php
  22. while($row = mysqli_fetch_array($result))
  23. {
  24. ?>
  25. <tr id="<?php echo $row["id"]; ?>" class="check_list" val="#">
  26.  
  27. <td><?php echo $row["nazwa"]; ?> </td>
  28. <td><?php echo $row["kwota_netto"]; ?> </td>
  29. <td><input type="checkbox" name="kwota_netto" class="check_list" val="<?php echo $row["kwota_netto"]; ?>"/></td>
  30. </tr>
  31. <?php
  32. }
  33. ?>
  34. <tr><td style="text-align: right">Suma</td><td><span id="sum"></span></td>
  35.  
  36. </table>
  37. </div>
  38. <?php
  39. }
  40. ?>
  41. <div align="center">
  42. <button type="button" name="btn_delete" id="btn_delete" class="btn btn-success">Delete</button>
  43. </div>
  44. </body>


zmieniłem to delete.php na

  1. <?php
  2.  
  3.  
  4. $connect = mysqli_connect("localhost", "root", "password", "new_record");
  5.  
  6. if(isset($_POST["id"]))
  7. {
  8. foreach($_POST["id"] as $id)
  9. {
  10. $query = "UPDATE `new_record` SET `rozliczenia` = '0' WHERE id= '".$id."'";
  11. mysqli_query($connect, $query);
  12. }
  13. }
  14.  
  15. ?>


ale także nie działa...
trueblue
Jeśli chcesz wyświetlać rozliczenia z flagą=1, to od razu zrób to w zapytaniu.
Nawet jeśli poprawisz w linii 10 drugiego skryptu, to zapytanie nie wybiera założonych rekordów.

Jeśli kod HTML checkboxów nadal wygląda tak jak podałeś, to w ogóle nie przesyłasz id.
hunter777
ok w sumie mogę zrobić dwa piliki, rzeczy z flagą 0 i 1 w zapytaniu i linki do nich...

co do przesyłania id to oczywiście go nie pobierałem pod checboxem, chyba powinno w checkbox pojawić się id i wpisałem je pod val3 ale i tak tego nie przesyła, gdzieś jeszcze nie widzę błędu, teraz ładnie mi sumuje(niestety nie zaokrągla jeszcze do 2 miejsc po przecinku pomimo iż mam DECIMAL(9,2)), netto i brutto ale nie pozwala zmienić flagi przyciskiem

  1. td><input type="checkbox" name="kwota_brutto" class="check_list" val="<?php echo $row["kwota_brutto"]; ?>" val2="<?php echo $row["kwota_netto"]; ?>" val3="<?php echo $row["id"]; ?>"/></td>
  2.  

trueblue
Ach, Ty przesyłasz dane Ajaxem.
Sprawdź jakie dane przesyłasz.
hunter777
zmieniłem w skrypcie

  1. id[i] = $(this).val3();


ale to nic nie dało...

Ajaxem przesyłam

  1. url:'delete.php',
  2. data:{id:id}


czyli id... przyznam się szczerze iż nie rozumiem jeszcze tego

  1.  
  2. $('tr#'+id[i]+'').css('background-color', '#ccc');
  3. $('tr#'+id[i]+'').fadeOut('slow');
viking
jquery nie posiada funkcji val3().
Ostatnio zapis oznacza tr#identyfikator gdzie identyfikator pobierany jest po wartości klucza z tablicy i.
trueblue
Metoda val z jQuery nie pobiera wartości z atrybutu o nazwie val, lecz value.
Nie ma metod val2, val3. Masz pobierać wartości z atrybutów o tych nazwach.
hunter777
czyli mój chyba przeładowany checkbox ma teraz postać

  1. <td><input type="checkbox" name="btn_rozlicz" class="check_list" val="<?php echo $row["kwota_brutto"]; ?>" val2="<?php echo $row["kwota_netto"]; ?>" value="<?php echo $row["id"]; ?>"/></td>


w skrypcie wróciłem do

  1.  
  2. id[i] = $(this).val();
  3.  


ale niestety button nie zmienia flagi na 0...


może to jeszcze kwestia plku php w którym mam

  1. <?php
  2.  
  3.  
  4. $connect = mysqli_connect("localhost", "root", "password", "new_record");
  5.  
  6. if(isset($_POST["id"]))
  7. {
  8. foreach($_POST["id"] as $id)
  9. {
  10. $query = "UPDATE `new_record` SET `rozliczenia` = '0' WHERE id = '".$id."'";
  11. mysqli_query($connect, $query);
  12. }
  13. }
  14.  
  15. ?>
viking
Sam input htmlowy ma atrybut value i do niego odnosi się $('input').val(); Jeśli chcesz coś więcej tam dopisać to wstaw to przez data-brutto, data-netto i albo $.data() albo $.attr().
hunter777
ok, rozumiem to tak, że ten checkbox powinien mieć postać

  1. <td><input type="checkbox" name="btn_rozlicz" class="check_list" value="<?php echo $row["id"]; ?>"/></td>


ponieważ on cały przekazuje jedną wartość value=...

niemniej jednak gdy ma postać jak powyżej to funkcja rozlicz.php, którą pokazałem powyżej i tak nie zmienia flagi na 0...
viking
W pliku php var_dump($_POST); na samym początku. W konsoli przeglądarki, zakładka sieć, kliknij na żądanie i sprawdź co wysyłasz i odbierasz. Bez tego ani rusz w pracy z ajax.
hunter777
genialne narzędzie - dziękuję! - namierzyłem wszystkie błędy i wszytko działa!

teraz mam pytanie pisząc ten system i ucząc się przy tym zrobiłem podział na admina i usera i po zalogowaniu user otwiera plik index.php z głównego katalogu a admin index.php z katalogu admin lecz jeśli wpiszę w przeglądarce localhost/admin/index.php a jestem zalogowany jako user to i tak pozwoli mi zobaczyć menu przeznaczone dla admina, czegoś brakuje...
viking
Na początku powinieneś sprawdzić grupę / użytkownika i odmówić dostępu. Twoje zapytania są podatne na sql injection. Poczytaj o bindowaniu parametrów. Dodatkowo jeżeli pole rozliczenia jest int to samo 0 bez ''.
hunter777
poczytam o sql injection dziękuję za sugestie - sprawdzę także kwestie loginów ale chciałem dokończyć na teraz listę z checkbox'ami, w/g ostatnich skryptów zmienia mi flagę, sumuje pola ale chciałem móc jeszcze zaznaczyć wszystkie checbox'y jednym przyciskiem i zrobiłem to za pomocą skryptu:

  1. <script>
  2.  
  3. //select all checkboxes
  4. $("#select_all").change(function(){ //"select all" change
  5. var status = this.checked; // "select all" checked status
  6. $('.check_list').each(function(){ //iterate all listed checkbox items
  7. this.checked = status; //change ".checkbox" checked status
  8. });
  9. });
  10.  
  11. $('.check_list').change(function(){ //".checkbox" change
  12. //uncheck "select all", if one of the listed checkbox item is unchecked
  13. if(this.checked == false){ //if this item is unchecked
  14. $("#select_all")[0].checked = false; //change "select all" checked status to false
  15. }
  16.  
  17. //check "select all" if all checkbox items are checked
  18. if ($('.check_list:checked').length == $('.check_list').length ){
  19. $("#select_all")[0].checked = true; //change "select all" checked status to true
  20. }
  21. });
  22.  
  23. </script>


wywołanie html

  1. <th><input type="checkbox" class="check_list" id="select_all"/> Zaznacz wszystkie </th>


ale pojawiają się dwie kwestie:

1) zaznacza mi wszystko po kliknięciu ale nie ma sumy tzn jak klikam po kolei w checkbox'y to sumuje wiersze a zaznaczenie przez ten skrypt powoduje tylko zaznaczenie checkbox'ow sumy juz niestety nie wiem czemu nie robi ponieważ flagę zmienia na raz wszystkim bez problemu

2) czy mógłby przy ładowaniu witryny od razu mieć zaznaczone wszystkie checbox'y i robić sumę?


a tu jeszcze ponawiam skrypt sumujący:

  1. <script>
  2. $(document).ready(function(){
  3. update();
  4. });
  5. $('input[type=checkbox]').click(function(){
  6. update();
  7. })
  8. function update(){
  9. var sum = 0;
  10. var sum_n = 0;
  11.  
  12. $('.check_list').each(function () {
  13. if (this.checked) {
  14. sum += Number($(this).attr("val"));
  15. sum_n += Number($(this).attr("val2"));
  16.  
  17.  
  18. }
  19. });
  20. $("#sum_b").html(sum);
  21. $("#sum_n").html(sum_n);
  22.  
  23.  
  24. var checkCount = $(".check_list:checked").length;
  25. $("#avg").html(parseFloat(sum/checkCount).toFixed(2)); }
  26. </script>
  27.  
nospor
No naprawde moglbys postarac sie zrozumiec te pare linijek kodu co masz...
Toc sumowanie robi funkcja update(). Teraz odpalasz ja za kazdym razem jak klikniesz na jakis checkbox. A jak klikasz "zaznacz wszystkie" to juz jej nie odpalasz i wielce zdziwiony ze nie sumuje... Odpal funkcje update() i tam i bedzie ci sumowac
hunter777
dzięki za pomoc, brzmi to logicznie ale pomimo iż zrobię funkcję update w zaznaczaniu lub nawet wrzucę to funkcji update sumy nie sumuje poprzez zaznaczenie wszystkich, oczywiście analizuję te pare linijek kodu, tzn staram się to robić...

  1. <script>
  2. $(document).ready(function(){
  3. update();
  4. });
  5. $('input[type=checkbox]').click(function(){
  6. update();
  7. })
  8. function update(){
  9.  
  10. $("#select_all").change(function(){ //"select all" change
  11. var status = this.checked; // "select all" checked status
  12. $('.check_list').each(function(){ //iterate all listed checkbox items
  13. this.checked = status; //change ".checkbox" checked status
  14. });
  15. });
  16.  
  17. $('.check_list').change(function(){ //".checkbox" change
  18. //uncheck "select all", if one of the listed checkbox item is unchecked
  19. if(this.checked == false){ //if this item is unchecked
  20. $("#select_all")[0].checked = false; //change "select all" checked status to false
  21. }
  22.  
  23. //check "select all" if all checkbox items are checked
  24. if ($('.check_list:checked').length == $('.check_list').length ){
  25. $("#select_all")[0].checked = true; //change "select all" checked status to true
  26. }
  27. });
  28. var sum = 0;
  29. var sum_n = 0;
  30.  
  31. $('.check_list').each(function () {
  32. if (this.checked) {
  33. sum += Number($(this).attr("val"));
  34. sum_n += Number($(this).attr("val2"));
  35.  
  36.  
  37. }
  38. });
  39. $("#sum_b").html(sum);
  40. $("#sum_n").html(sum_n);
  41.  
  42.  
  43. var checkCount = $(".checkbox:checked").length;
  44. $("#avg").html(parseFloat(sum/checkCount).toFixed(2)); }
  45. </script>
nospor
Pewnie slepne, ale nie widze bys dodal update() do klikniecia na "zaznacz wszystkie"... Mozesz mnie oswiecic i wskazac palcem gdzie to dodales dla "zaznacz wszystkie"?
hunter777
nie... to ja głupieje raczej niż Ty ślepniesz...

myślałem, że to update wystarczy

  1. function update(){
  2.  
  3. $("#select_all").change(function(){ //"select all" change
  4. var status = this.checked; // "select all" checked status
  5. $('.check_list').each(function(){ //iterate all listed checkbox items
  6. this.checked = status; //change ".checkbox" checked status
  7. });
  8. });


ale teraz zmieniłem na

  1. function update(){
  2.  
  3. $("#select_all").change(function update(){ //"select all" change
  4. var status = this.checked; // "select all" checked status
  5. $('.check_list').each(function update(){ //iterate all listed checkbox items
  6. this.checked = status; //change ".checkbox" checked status
  7. });
  8. });

i także nie sumuje... hmm... szukam dobrego kursu jQuery! smile.gif, zamówiłem także książkę do algorytmów...
nospor
wake up exclamation.gif! wink.gif

Miales do kodu zaznacz wszystkie dodac wywolanie update a nie na odwrot....


Kod
$("#select_all").change(function(){  //"select all" change
    var status = this.checked; // "select all" checked status
    $('.check_list').each(function(){ //iterate all listed checkbox items
        this.checked = status; //change ".checkbox" checked status
    });

  // exclamation.gif!!!O TO MASZ DODAC!!!!!!
update();
});
viking
Musisz ustawić odpowiednie kodowanie przez nagłówki (header) oraz http://php.net/manual/en/mysqli.character-set-name.php
hunter777
a gdzie szukać pomocy/przykładów zapytań sql/php - jak połaczyc tabele klient z faktura by to dobrze działało?
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.