Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX]Bład z przesyłem danych
Forum PHP.pl > Forum > Przedszkole
Sklep102
Cześć,

  1.  
  2. <script>
  3. var raitings = 0;
  4. $(function () {
  5. $(".ratings").starrr().on("starrr:change", function (event, value){
  6. //alert (value);
  7. raitings = value;
  8. });
  9. });
  10.  
  11.  
  12. function saveRating(form){
  13. var film_id = form.new_id.value;
  14.  
  15. $.ajax({
  16. url:'modules/script/query/rating.php'
  17. type: 'POST',
  18. data: {
  19. 'new_id': new_id,
  20. 'raitings': raitings
  21. }
  22. succes: function(response){
  23. alert(response);
  24. },
  25. });
  26.  
  27.  
  28. return false;
  29. }
  30.  
  31.  
  32.  
  33.  
  34. </script>

Czy może mi ktoś wytłumaczyć co jest źle w próbie przesłania danych?
Jeśli usunę $.ajax to wszytskie elementy strony wyśiwetlają się poprawnie jeśli dodam $.ajax przestaje prawidło działać. Może ktoś mi wyjaśnić gdzie jest błąd?

nospor
Zajrzyj do konsoli przegladarki a zobaczysz BLAD ktory to wszystko powoduje
Sklep102
Dzięki!

Nie chce zakładać osobnego tematu to spytam tutaj:

  1. <script>
  2. var ratings = 0;
  3. $(function () {
  4. $(".ratings").starrr().on("starrr:change", function (event, value){
  5.  
  6. ratings = value;
  7. alert (ratings);
  8.  
  9. var i = document.createElement("INPUT");
  10. i.setAttribute("name","star");
  11. i.setAttribute("type","hidden");
  12. i.setAttribute("value",ratings);
  13. i.setAttribute("id", 3);
  14. $("#divstr").append(i)
  15.  
  16. });
  17.  
  18.  
  19. });
  20.  
  21.  
  22.  
  23.  
  24.  
  25. </script>


Dlaczego alert działa poprawnie ale nie tworzy się input?
viking
A dlaczego skoro korzystasz z jquery to nie zrobisz tego jak trzeba?

Cytat
let i = $('<input/>', {
id: 3,
value: ratings //itd...
});
Sklep102
Cytat(viking @ 17.03.2020, 14:43:53 ) *
A dlaczego skoro korzystasz z jquery to nie zrobisz tego jak trzeba?


  1. <script>
  2. var ratings = 0;
  3. $(function () {
  4. $(".ratings").starrr().on("starrr:change", function (event, value){
  5.  
  6. ratings = value;
  7. //alert (ratings);
  8.  
  9. let i = $('<input/>', {
  10. id: 3,
  11. value: ratings
  12. });
  13.  
  14.  
  15. });
  16.  
  17.  
  18.  
  19. });
  20.  
  21. </script>


Hmmm, dalej coś źle robię... Dalej wyświetla mi się tylko alert i nie tworzy inputa :/ konsola też pusta.

nospor
Zapomniales dodac nowo utworzony input tam gdzie chcesz by byl...
Sklep102
  1. let i = $('<input/>', {
  2. id: 3,
  3. value: ratings,
  4. name: test
  5. }).appendTo('form1');


<form action="modules/upload.php" id="myForm" method="post" enctype="multipart/form-data" name="form1">

Zły kod...
Poprawiłem ale dalej ten sam problem :/
nospor
raz ze twoj form ma ID id="myForm"
dwa ze nie powiedziales ze laczysz z ID
appendTo('#myForm');
Sklep102
Dzięki!
nie wiedziałem że jeśli odnoszę się do id to trzeba użyć "#"
nospor
To sa podstawy selektorow CSS. Poczytaj o nich bo nie raz bedzie ci potrzebne
Sklep102
Pozwolę sobie zadać jeszcze jedno pytanie odnośnie ajaxa

mam diva który pobiera wartość za pomocą php chciałbym to zamienić na ajaxa

<div class='db_ratings' data-rating="<?php echo $rating_db; ?>"></div>

  1. $.ajax({
  2. url:'modules/test.php',
  3. type: 'POST',
  4. data: {
  5. "film_id": film_id
  6. },
  7.  
  8.  
  9. success: function( data ) {
  10. $('#db_ratings').replaceWith($('#db_ratings').html(data));
  11. $('#db_ratings').html(data);
  12.  
  13. }
  14.  
  15.  
  16. });


i w odpowiedzi dostaję id i chciałbym to id przypisać do diva w miejsce php, siedzę nad tym kilka godzin ale nadal nie udało mi się tego przypisać :/


Swoją drogą w jakim celu używa się json? skoro można zrobić echo w pliku i dostać odpowiedz zaraz po wysłaniu danych?

  1. <?php
  2.  
  3. include "../db/connection.php";
  4.  
  5. $id = $_POST["film_id"];
  6.  
  7. $result = $pdo->prepare("SELECT * FROM `films` WHERE id = '$id'");
  8. $result->execute();
  9. foreach($result as $wat)
  10.  
  11. $myObj = $wat['rating'];
  12.  
  13.  
  14.  
  15. $myJSON = json_encode($myObj);
  16.  
  17. echo $myObj;
  18. ?>
viking
Dla jednej danej odczytywanej w ten sposób wielkiej różnicy nie robi ale dla całych tablic przetwarzanych w Angularze/Vue/React już tak. Do tego brak u ciebie odpowiednich nagłówków odpowiedzi. W twoim kodzie nie ma id #db_ratings tylko klasa .db_ratings
Sklep102
zrobiłem to tak:

  1. success: function( data ) {
  2. var id = data;
  3. $('.db_ratings').attr("data-rating",id)
  4. }


mam jeszcze 1 problem

  1. <script>
  2. var ratings = 0;
  3. $(function () {
  4. $(".ratings").starrr().on("starrr:change", function (event, value){
  5. //alert (value);
  6. ratings = value;
  7. });
  8.  
  9.  
  10. });
  11.  
  12.  
  13. function saveRating(form){
  14. var film_id = form.new_id.value;
  15.  
  16. $.ajax({
  17. url:'modules/script/query/ratings.php',
  18. type: 'POST',
  19. data: {
  20. "film_id": film_id,
  21. "ratings": ratings
  22. },
  23. succes: function(response){
  24. alert(response);
  25. }
  26. });
  27.  
  28.  
  29.  
  30.  
  31. var film_id = document.getElementById("new_id").value;
  32.  
  33. $.ajax({
  34. url:'modules/test.php',
  35. type: 'POST',
  36. data: {
  37. "film_id": film_id
  38. },
  39.  
  40.  
  41. success: function( data ) {
  42. var id = data;
  43. $('.db_ratings').attr("data-rating",id)
  44. }
  45.  
  46.  
  47. });
  48.  
  49. setInterval(function(){
  50. var db_ratings = document.getElementsByClassName("db_ratings")
  51. for (var a = 0; a < db_ratings.length; a++){
  52. $(db_ratings[a]).starrr({
  53. readOnly: true,
  54. rating: db_ratings[a].getAttribute("data-rating")
  55. })
  56. }
  57.  
  58. }, 3000);
  59.  
  60. return false;
  61.  
  62. }

Chodzi o funkcje

  1. setInterval(function(){
  2. var db_ratings = document.getElementsByClassName("db_ratings")
  3. for (var a = 0; a < db_ratings.length; a++){
  4. $(db_ratings[a]).starrr({
  5. readOnly: true,
  6. rating: db_ratings[a].getAttribute("data-rating")
  7. })
  8. }
  9.  
  10. }, 3000);


funkcja ma wyświetlić diva w którym są gwiazdki i są zaznaczane z poziomu skryptu po otrzymaniu id pytanie dlaczego po kliknięciu zapisu raz jeszcze funkcja przestaje działać? jak to ewentualnie poprawić?
nospor
Napisz mi prosze co robi setInterval() a nastepnie napisz czemu to uzyles tutaj
Sklep102
opóźnia skrypt o 3000 milisekund zrobiłem to tak ponieważ bez tego skrypt wcale się nie wykonywał, ponieważ zanim przyszła odpowiedź z ajaxa to skrypt został już wykonany i takie rozwiązanie przyszło mi do głowy. Mimo że czekam 1 min to nic się nie zmienia. A chciałbym aby po zmianie wartości skrypt znów się wykonał.
nospor
Nie, nie opoznia skryptu. Zajrzyj laskawie do dokumetnacji i doczytaj co to tak naprawde robi a nie strzelasz na pale.

Cytat
ponieważ zanim przyszła odpowiedź z ajaxa to skrypt został już wykonany

Piszesz kod i w ogole nie ogarniasz co piszesz. Ot losowo strzelasz w klawiature palcami...
Przeciez masz juz
success: function( data ) {

tak, wlasnie kod w SUCCESS wykonuje sie gdy ajax sie skonczy. Wlasnie tam masz wlozyc wszystko co ma sie wykonac gdy AJAX sie skonczy pomyslnie. Nie potrzebujesz do tego zadnych pseudo opozniaczy kodu
Sklep102
Poprawiłem tak jak napisałeś. Niestety dalej nie działa tak jak trzeba tzn raz wyświetli i później się nic nie dzieje mimo że zmieniła się 3 np na 5
nospor
1) Pokaz kod po zmianach
2) Czemu w saveRating masz dwa ajax?
3) gdzie masz przypisanie cos odnosnie klikania i wywolywania saveRating. Nie widze tego tutaj
4) Czemu w saveRating za kazdym razem inicjujesz star na divie db_ratings ? To teraz wyglada jakbys nadpisywal ciagle tego samego diva co juz samo w sobie jest zle i raczej nic dziwnego ze za kolejnym razem wszystko przestaje dzialac.


Moze pokac calosc, a nie wyrwane z kontekstu kawalki i napisz co chcesz docelowo osiagnac bo na chwile obecna to te twoje kombinowanie wyglada tak samo jak bez sensu kombinowales z setInterval nie wiedzac co to tak naprawde robi
Sklep102
  1. <form method="POST" onsubmit="return saveRating(this);">
  2. <script src="modules/script/starrr.js"></script>
  3. <div id="<?php echo $new_id; ?>" class='db_ratings' data-rating=""></div>
  4.  
  5. Ocena Filmu
  6. <input type="hidden" id="new_id" value="<?php echo $new_id; ?>">
  7.  
  8. <br>
  9. <div id="<?php echo $new_id; ?>" class='ratings'></div><br><!--- gwiazdki na dole strony --->
  10. <input type="submit" value="Zmień ocenę">
  11.  
  12.  
  13. </form>
  14.  
  15. <!--- skrypt odpowiedzialny za aktualizację oceny --->
  16. <script>
  17. var ratings = 0;
  18. $(function () {
  19. $(".ratings").starrr().on("starrr:change", function (event, value){
  20. //alert (value);
  21. ratings = value;
  22. });
  23.  
  24.  
  25. });
  26.  
  27.  
  28. function saveRating(form){
  29. var film_id = form.new_id.value;
  30.  
  31. $.ajax({
  32. url:'modules/script/query/ratings.php',
  33. type: 'POST',
  34. data: {
  35. "film_id": film_id,
  36. "ratings": ratings
  37. },
  38. succes: function(response){
  39. alert(response);
  40. }
  41. });
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48. $.ajax({
  49. url:'modules/test.php',
  50. type: 'POST',
  51. data: {
  52. "film_id": film_id
  53. },
  54.  
  55.  
  56. success: function( data ) {
  57. var id = data;
  58. $('.db_ratings').attr("data-rating",id)
  59.  
  60.  
  61. var db_ratings = document.getElementsByClassName("db_ratings")
  62. for (var a = 0; a < db_ratings.length; a++){
  63. $(db_ratings[a]).starrr({
  64. readOnly: true,
  65. rating: db_ratings[a].getAttribute("data-rating")
  66. })
  67. }
  68. }
  69.  
  70.  
  71. });
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. return false;
  79.  
  80. }
  81.  
  82.  
  83. </script>


2. 1 ajax aktualizuje dane w bazie a 2 pobiera ilość gwiazdek po aktualizacji.
3. Do formularza
4. W jaki sposób powinno to być wykonane poprawnie?
nospor
Cytat
1 ajax aktualizuje dane w bazie a 2 pobiera ilość gwiazdek po aktualizacji.
No i znowu drugi ajax moze sie skonczyc szybciej niz pierwszy... Drugi ajax masz wykonac po zakonczeniu pierwszego to raz.
A nie moze ten pierwszy skrypt od aktualizacji zwracac poprostu info o stanie po aktualizacji?

Cytat
W jaki sposób powinno to być wykonane poprawnie?
Nie wiem, bo nie wiem co chcesz osiagnac. Nie sledze twoich watkow o gwiazdkach, nie wiem jak to dziala
Sklep102
Dzięki nospor jak zawsze w punkt...

poprawiłem to w najłatwiejszy sposób jaki chyba można


  1. FUNCTION saveRating(form){
  2. var film_id = form.new_id.value;
  3.  
  4. $.ajax({
  5. url:'modules/script/query/ratings.php',
  6. type: 'POST',
  7. DATA: {
  8. "film_id": film_id,
  9. "ratings": ratings
  10. },
  11.  
  12. success: FUNCTION( DATA ) {
  13. var id = DATA;
  14.  
  15.  
  16. var db_id = $('.db_ratings').attr("data-rating");
  17.  
  18. IF (db_id == 1) {
  19. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i> ";
  20. }
  21. else IF (db_id == 2) { //w przeciwnym razie...
  22. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i> ";
  23. }
  24. else IF (db_id == 3) { //w przeciwnym razie...
  25. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i> ";
  26. }
  27. else IF (db_id == 4) { //w przeciwnym razie...
  28. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i> ";
  29. }
  30. else IF (db_id == 5) { //w przeciwnym razie...
  31. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star fa fa-star fa-2x'></i> ";
  32. }
  33. else IF (db_id == 6) { //w przeciwnym razie...
  34. document.getElementById("star_db").innerHTML = "<i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i><i class='star-checked fa fa-star fa-2x'></i> ";
  35. }
  36.  
  37.  
  38.  
  39.  
  40. }
  41.  
  42.  
  43. });
  44.  
  45. RETURN false;
  46.  
  47. }


Poprawiłem również za twoją poradą 2 ajaxa... nie pomyślałem nawet o tym.
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.