• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[JS] Mały problem z ajaxem

Object Storage Arubacloud
0 głosów
285 wizyt
pytanie zadane 27 września 2020 w JavaScript przez Marak123 Stary wyjadacz (11,190 p.)

Mam problem z wysłaniem zmiennej do php za pomocą ajaxa niby wysyłać wysyła się ta zmienna ale php nie chce jej odczytać, nie wiem o co chodzi. Wie ktoś może o co może chodzić??

Kod js:

var titles = "dane w zmiennej";
$('.options-button div').click((event) => {

    $(document).attr('title', titles); //ustawianie tytułu strony
    localStorage.setItem('title', titles);  //zapisywanie zmiennej w pamięci aby przekazać do innego pliku js

//wysyłanie zmiennej do pliku index.php
//niby jest wysyłany bo wyskakuje alert działa ale php nie odbiera tej zmiennej
    $.ajax({
        type: 'post',
        url:  'php/przeglad_plikow/index.php',
        data:  { json_one: titles }
    }).done(function(){
        alert("dziala");  //ten tutaj alert
    }).fail(function(){
        alert("Wystąpił błąd");
    });

    location.href = "php/przeglad_plikow"  //uruchamianie strony index.php
})

Kod php:

$json_one = $_POST["json_one"]; //odbiór zmiennej

Error:

Notice: Undefined index: json_one in C:\Xampp\htdocs\Strona_szkoła\php\przeglad_plikow\index.php on line 33

 

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
location.href = "php/przeglad_plikow"

Rozważ, czy nie lepiej jest zrobić przekierowanie przez zwrotny nagłówek location. Poza tym, to przekierowanie wykonujesz nie czekając na zwrotkę ajaxa (który wykonuje się asynchronicznie), więc jeśli już w ten sposób, to umieść to w callbacku do metody done.

2 odpowiedzi

+1 głos
odpowiedź 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Według dokumentacji zmiennej $_POST, są tam dostępne dane przesłane metodą POST, ale wtedy gdy w nagłówku Content-Type jest application/x-www-form-urlencoded lub multipart/form-data. Upewnij się więc (w devtoolsach przeglądarki), czy jQuery pod spodem nie zserializowało danych do postaci JSON. Jeśli tak, to dane po stronie PHP odczytasz funkcją file_get_contents (z parametrem "php://input") i będziesz je musiał sparsować funkcją json_decode.

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

Wysyłać niby wysyła ale z odbiorem to nic nie ma 

1
komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)

@ScriptyChris, Potwierdzam, też miałem taki problem i rozwiązaniem było dodanie nagłówka.

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

@Marak123, a możesz pokazać co jest w zmiennej $_POST? Przez np var_dump($_POST);

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
Nic array(0){ } ale rozwiązałem problem tak ze zrobiłem drugi plik w którym odebrałem tą zmienną z js o dziwo tam zadziałało i normalnie były dane. Potem stworzyłem sesje do której włożyłem te dane a we właściwym pliku otworzyłem tą sesje i odebrałem dane z sesji

Takie samo pytanie znalazłem i jeden z ostatnich komentarzy to rozwiązanie:

https://forum.pasja-informatyki.pl/444885/przeslanie-zmiennej-z-js-do-php-ajaxem

Ale czemu nie chciało mi odebrać danych w pliku index.php tylko usialem utworzyć osobny plik to nadal nie wiem
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

@Artek, jakiego nagłówka??

komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)
Niezbyt dobre rozwiązanie. Powinna być możliwość normalnie to odebrać a nie takie kombinacje.
komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)

Content-Type jest application/x-www-form-urlencoded lub multipart/form-data.

Inna kwestia, że zamiast jQuery użyłbym fetch i funkcji asynchronicznej. Bardziej nowoczesne i czytelniejsze.

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
ok zobaczę te fetch
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

Ogółem poczytałem o tym fetch i znalazłem jak wysyłać dane tylko że nie za bardzo znalazłem jak odebrać te dane w php, i teraz pytanie do ciebie czy wiesz jak odebrać takie dane wysłane funkcją fetch w php??

fetch("php/przeglad_plikow/scr.php",{
        method: "post",
        headers: {
            "Content-Type": "application/json"
        },
        body: titles
    })
    .then(response => response.json())
    .then(response => {
        console.log(response);
    })

to jest ogółem ta funkcja 

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Jeśli wysyłasz dane w formacie JSON, to w mojej odpowiedzi masz wskazówki z linkami, jak to odebrać po stronie PHP.

Jeśli w PHP mimo wszystko nie otrzymujesz tych danych (czy to jako JSON, czy jako application/x-www-form-urlencoded), to może być kwestia nieprawidłowego podpięcia/uruchamiania skryptu przez serwer.

komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)

Ja już długo nie korzystam z czytsego php, ale wydaje mi się, że powinno być to normalnie dostępne czyli $_POST['nazwa_zmiennej']. Ponadto pokażę ci jak fajnie używa się funkcji asynchronicznej. Taki kod mam u siebie i działa jak trzeba(backend w larvie)

editUserData : async function(userDataThatShouldBeChanged){
          
         const root = this.$root;
         try{
         
               const requestData = {
                  method : 'PATCH',
                  body : JSON.stringify(userDataThatShouldBeChanged),
                  headers : {
                     'X-CSRF-TOKEN' : this.csrfToken,
                     'Content-type': 'application/json; charset=UTF-8'
                  }
               };
               root.showExpectationDecoration('changing_user_data')
               const response = await fetch('/user/profile/settings/basic',requestData);
          
               switch(response.status){
                  case 200:
                     this.showNotification('data_has_been_changed_successfully');
                     this.resetInputs();
                  break;

                  case 400:
                     let errors = await response.json();
                     throw new Error(this.translator.translate('the_following_errors_occured') + this.translator.translate(errors));
                  break;

                  case 429:
                     throw new Error("to_many_user_settings_change_attempts");
                  break;

                  case 500:
                    throw new Error("the_requested_data_is_ok_but_a_server_error_occured");
                  break;

                  default:
                     throw new Error("undefined_error");
                  break;

 

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
jakiej zmiennej nazwa??
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

@ScriptyChris, w jakim sensie nie prawidłowego uruchomienia?? To jak to ja mam prawidłowo uruchomić?

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

A sprawdziłeś użycie funkcji file_get_contents?

To jak to ja mam prawidłowo uruchomić?

W jaki sposób używasz pliku PHP, w którym próbujesz odczytać dane przesłane przez Ajax? To jest samodzielny plik, czy jest przez coś załączany (require/include)?

komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)

@Marak123, No w JS w body podajesz zapewne jakiś obiekt typu { userID : 54}  to odczyt powinien być $_POST['userID']

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
próbowałem tej funkcji i nie działa a jest to samodzielny plik
komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
Pokaż kod i co zwróciła ta funkcja.
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

@Artek, A no to coś mi nie działa bo nie chce odczytać mi tych danych

komentarz 27 września 2020 przez Artek Stary wyjadacz (11,800 p.)
No czyli dzień jak co dzień. Tak jak kolega Ci zasugerował, musisz zbadać dokładnie co jest przekazywane. Ja w swoim kodzie używam JSON.stringyfy, może to jest przyczyna. Problem nie jest poważny to jakiś szczegół Ci umknął.
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
pewnie tak jak zawsze jakiś mały szczególik po patrze może uda mi się to rozwiązać dzięki za pomoc
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

@ScriptyChris,  jak mam takie coś 

file_get_contents("php://input", $_POST['js_one']);

to błąd:

Notice: Undefined index: json_one in C:\Xampp\htdocs\Strona_szkoła\php\przeglad_plikow\index.php on line 33

 

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Drugi parametr przekazany do funkcji generuje błąd - niepotrzebnie go przekazujesz. Co zwraca samo file_get_contents("php://input")?

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
Nic nie zwraca var_dump() pokazuje 0
komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Pokaż jeszcze raz (skoro teraz używasz fetch) nagłówki i payload requesta z devtoolsów.

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

I jeszcze jedna - być może nie mająca znaczenia - rzecz. Czy możesz sprawdzić, czy usunięcie fragmentu, o którym wspomniałem w komentarzu do Twojego pytania pomoże? Coś mi się wydaje, że próba zmiany URLa z poziomu JS tuż po wysłaniu requesta może tutaj mieć wpływ na problem, ale to tylko przypuszczenie.

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)

To jest devtools z strony która odbiera dane 

a to jest devtools strony która wysyła dane za pomocą fetch

a odnośnie usunięcia tej linijki to jak ja mam to zrobić jeżeli muszę mieć dostęp do strony która odbiera dane a jeżeli usunę tą linijkę to mi nie przejdzie na tą stronę

edit:: 

z dodaną linijką przechodzenia też jest wysyłana zmienna

komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Teraz wysyłasz niejawnie zserializowany metodą toString obiekt w formie "[object Object]" a nie JSON'a reprezentującego ten obiekt. Brakuje użycia JSON.stringify (jak wspomniał @Artek) na zmiennej, którą przypisujesz do propertisa body w parametrach do fetch. Chociaż mimo to, PHP powinien to odczytać przynajmniej jako string "[object Object]".

a odnośnie usunięcia tej linijki to jak ja mam to zrobić jeżeli muszę mieć dostęp do strony która odbiera dane a jeżeli usunę tą linijkę to mi nie przejdzie na tą stronę

Ja bym się tym zajął w następnej kolejności, bo aktualnie masz problem z odbiorem danych z Ajaxa w PHP. Więc warto sprawdzić, czy usunięcie przekierowania ze strony JS pomoże.

komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
usunąłem te przekierowanie js ale dodałem przekierowanie w html jako zwykły link ale i tak nie działa odbiór danych w tym php
komentarz 27 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
Hmm, to nie wiem w czym problem. Testowo postawiłbym jeszcze serwer w Node i sprawdził, czy tam mogę odebrać dane z Ajaxa - jeśli tak, to winą jest coś po stronie PHP/serwera na którym on działa.
komentarz 27 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
sprawdzę

ale mimo to dzięki za pomoc
0 głosów
odpowiedź 27 września 2020 przez VBService Ekspert (253,400 p.)

Według komunikatu błędu, nie istnieje w POST zmienna json_one

Notice: Undefined index: json_one in ...

Sprawdź, może przez var_dump($_REQUEST['json_one']);

Spróbuj dla testów, wysłać jakąś "prostą" zawartość zmiennej np.:

    $(document).attr('title', titles); //ustawianie tytułu strony
    localStorage.setItem('title', titles);  //zapisywanie zmiennej w pamięci aby przekazać do innego pliku js 

    const one = 1;
//wysyłanie zmiennej do pliku index.php
//niby jest wysyłany bo wyskakuje alert działa ale php nie odbiera tej zmiennej
    $.ajax({
        type: 'post',
        url:  'php/przeglad_plikow/index.php',
        data:  { one: one }
    }).done(function(){
        alert("dziala");  //ten tutaj alert
    }).fail(function(){
        alert("Wystąpił błąd");
    });
$_REQUEST['one'];

Spróbuj dodać dataType: "html"

    $.ajax({
        type: 'post',
        url:  'php/przeglad_plikow/index.php',
        data:  { one: one },
        dataType: "html"
    }).done(function(){

Może titles zawiera znaki, które trzeba przepuścić przez encodeURIComponent();

var titles = encodeURIComponent("dane w zmiennej");
$('.options-button div').click((event) => {
 
    $(document).attr('title', titles); //ustawianie tytułu strony
    localStorage.setItem('title', titles);  //zapisywanie zmiennej w pamięci aby przekazać do innego pliku js
 
//wysyłanie zmiennej do pliku index.php
//niby jest wysyłany bo wyskakuje alert działa ale php nie odbiera tej zmiennej
    $.ajax({
        type: 'post',
        url:  'php/przeglad_plikow/index.php',
        data:  { json_one: titles }
    }).done(function(){

    ...
})
komentarz 28 września 2020 przez Marak123 Stary wyjadacz (11,190 p.)
Niestety nic nie działa nadal nie odbiera danych i wyskakuje error

Podobne pytania

0 głosów
1 odpowiedź 100 wizyt
pytanie zadane 11 listopada 2020 w JavaScript przez Jacuchna0 Użytkownik (640 p.)
+1 głos
1 odpowiedź 284 wizyt
pytanie zadane 14 sierpnia 2019 w JavaScript przez Bartłomiej Bolesta Obywatel (1,630 p.)
–1 głos
3 odpowiedzi 235 wizyt
pytanie zadane 23 grudnia 2018 w JavaScript przez Q7V Gaduła (4,250 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...