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

question-closed Przesłanie zmiennej z JS do PHP Ajaxem

Object Storage Arubacloud
+1 głos
272 wizyt
pytanie zadane 14 sierpnia 2019 w JavaScript przez Bartłomiej Bolesta Obywatel (1,630 p.)
zamknięte 14 sierpnia 2019 przez Bartłomiej Bolesta

Nie mogę kompletnie zrozumieć jak to zrobić. Zacząłem nawet przeklejać różne kody 1:1, żeby tylko zobaczyć w jaki sposób to działa i kompletnie nic mi nie chcę działać. Nie wiem czy pomijam jakąś oczywistość o której się nie wspomina w przykładach czy jaki pies? 

Poniżej jeden z przykładów, który prawie zadziałał wraz z dodatkiem ode mnie w postaci zmiennej timzone.

plik js:

$(document).ready(function(){

	var tz = jstz.determine(); 
    var timezone = tz.name(); 

	$.ajax({
        type: "POST",   
        url: "phpfiles/ajaxphpfiles/test.php",       
        data: {
			zmienna: timezone
		},
        success: function() {
            console.log(timezone);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
});

plik php:
 

$result = [ //nowsza składnia
    "zmienna" => $zmienna,
];

$_SESSION['TimeZone'] = $zmienna;

Lub:

echo $_POST['zmienna'];

W obu przypadkach dostaje po prostu:

Notice: Undefined index: zmienna in"

Kompletnie nie rozumiem czemu. W pliku js odpala się success i w consoli wyświetla strefę czasową (niedokładnie, bo niedokładnie, jeśli chodzi o nazwę, ale w tej samej strefie).

Jak poprawnie odebrać w pliku php tą zmienną i zrobić z niej zmienną sesyjną?

komentarz zamknięcia: Rozwiązano problem.
1
komentarz 14 sierpnia 2019 przez Kamil Łydka Stary wyjadacz (13,600 p.)

A co dostajesz w 

var_dump($_POST);

?

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
array(0) { }
komentarz 14 sierpnia 2019 przez Kamil Łydka Stary wyjadacz (13,600 p.)

No to wychodzi na to że w ogóle niczego nie dostajesz. Wygląda w miarę zdrowo, oprócz tego type: "POST", ale type to chyba allias dla method. Zacząłbym od upewnienia się czy na pewno podajesz poprawnie ścieżkę (przypuszczam że nie) i na czas testów sobie przemień na GET, będziesz widział w pasku przeglądarki czy cokolwiek dostajesz. 

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Ścieżka jest prawidłowa. Jeśli w niej namieszam, wtedy dostaje consoleloga: error Not Found.

Ale ogólnie robię to tak:

index.php => includuje test.php, potem w head daje: 
 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js"></script>
<script type="text/javascript" src="scripts/timezone.js"></script>

Zastanawiałem się czy z kolejnością nie jest problem, ale includowanie pliku po odwołaniu do skryptu nic nie zmieniło. Także w samym indexie próbowałem, ale post nadal pusty.

oprócz tego type: "POST", ale type to chyba allias dla method.

 

Tak. Spróbowałem podmienić na method w razie czego, ale to nic nie dało. 

1
komentarz 14 sierpnia 2019 przez Kamil Łydka Stary wyjadacz (13,600 p.)
No to niestety musisz czekać na kogoś kto używa na co dzień ajaxa. Pewnie jakaś błahostka. Celowo nie użyłem opcji odpowiedzi, żeby nie oznaczać postu mylnie z odpowiedzią, a sam dawno ajaxa nie używałem. :)

Jedyne co mi przychodzi jeszcze do głowy to ustawić odpowiedni dataType (spróbuj z 'json'). Powodzenia
komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Z początku miałem tak ustawione właśnie, ale wtedy dostawałem w consoli błąd na który nawet nie mogłem znaleźć odpowiedzi, nie takiej, która by coś pomogła:

parsererror SyntaxError: Unexpected token < in JSON at position 0
    at parse (<anonymous>)
    at jquery.min.js:2
    at l (jquery.min.js:2)
    at XMLHttpRequest.<anonymous> (jquery.min.js:2)

 

1 odpowiedź

0 głosów
odpowiedź 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Otóż zrób tak:

$.ajax({
        type: "POST",   
        url: "phpfiles/ajaxphpfiles/test.php",       
        data: {
            "zmienna": "timezone"
        },
        success: function(data) {
            console.log(data);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });

Przesylajac cos jako data wysylsz do pliku PHP z tego pliku wychodzi ci opdoiwedz wiec wpisanie timezone w console nie ma prawa ci nic zwrocic. to co ci zwroci php bedzie w DATA o ile dasz to data tutaj success: function(data)

Oczywiscie nic nie stoi na przeszkodzie bys dal kod

success: function(calineczka) {
            console.log(calineczka);
        },

 

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

console log:

array(1) {
  ["zmienna"]=>
  string(8) "timezone"
}

Zaś var_dump($_POST);

array(0) { }

komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

czyli wszystko sie zgadza: masz odpowiedz dostales z php. natomiast samo zrobienie var_dump w php i odpalenie pliku nie moze ci nic zwrocic bo nic tam nie wysylasz do niego

daj kod swojego pliku php jeszcze i napisz co chcesz zrobic w tym pliku co ma ci zworcic do ajaxa ?

w php zrob czyty plik i daj:

<?php
echo json_encode(['status' => 'success']);
?>

a w JS wpisz

success: function(data) {
    console.log(data.status);
}

Dzięki temu możesz w php zrobić tablice z odpowiedzią jaka ma być o widoku do ajaxa

<?php
$resp = [
'var_1' => 'abc',
'var_2' => '765',
'var_3' => '55ff',
'arr_1' => [
    'hey' => 'jupi',
],
// etc
];
echo json_encode($resp);
?>

jak wyslesz taka odpowiedz do ajaxa to w ajaxie masz dostep do tej tablicy przez dostęp do danych 

success: function(data) {
    console.log(data.var_1);
    console.log(data.arr_1.hey);
}

 

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

W jaki sposób się zgadza, jeśli tablica post jest pusta?

w php zrob czyty plik i daj:

W pliku test.php? Czy zrobić kolejny?

Dzięki temu możesz w php zrobić tablice z odpowiedzią jaka ma być o widoku do ajaxa

Nie za bardzo rozumiem? Znowu zaczynam przesyłać rzeczy do pliku js? I czy to znowu w pliku test.php czy nowym?

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Dobra od nowa krok po kroku

Najpierw zrob plik o nazwie test.php i w nim napisz

<?php
echo json_encode(['status' => 'success']);
?>

i w przegladarce otworz ten plik i zobacz czy masz takie cos zwrocone

{"status":"success"}

 

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
Tak, do tego momentu zrobiłem wcześniej i jest dobrze.
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Teraz zrob plik o nazwie super.php 

I w nim wklej

<html>
<body>

<script>
$(document).ready(function(){
    $.ajax({
        type: "POST",   
        url: "phpfiles/ajaxphpfiles/test.php",       
        data: {"Zmienna1": "costam"},
        success: function(resp) {
            console.log(resp);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
});

</script>
</body>
</html>

i zobacz co ci zwraca console.log

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Jeszcze z

<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>

I consola pokazuje:

{"status":"success"}

 

 

 

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

No i teraz zmien plik test.php na taki

<?php
$zmienna_z_post = $_POST['Zmienna1'];
echo json_encode(['status' => $zmienna_z_post]);
?>

Czyli ajaxem wysylasz zmienna o nazaiw Zmienna = costam to idzie ci do PHP w php odbierasz to $_POST['Zmienna'] bo w AJAX dales type: "POST",   jakbys dal type: "GET" to byts musial w php odebrac to jako $_GET['Zmienna'] i ta zmienna jest zwracana do AJAXA i w cosnoli powinienes zobaczyc status:costam

nie trzeba nic do ajaxa zwracac ale jesli potrzebujesz informacji np przy wgrywaniu pliku ajaxem to dobrze wiedziec kiedy zakonczysz wgrywanie stad komunikacja miedzy php a ajaxem tez  

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

A co z plikiem super.php? Bez podpięcia lub odwołania? Bo jeżeli nie wejdę na tą podstronę to przecież nic nie ma. Zmieniając plik test.php mam teraz na index.php:

Notice: Undefined index: Zmienna1 in C:\xampp\htdocs\GWPHPOBJ2\phpfiles\ajaxphpfiles\test.php on line 3
{"status":null}

A w konsoli undefined

Zaś na super.php
Nie mam nic i w konsoli {"status":"costam"}

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
No tak bo nie mozesz wejsc na plik test.php musisz wejsc na plik super.php i zobaczyc w consoli co ci zwraca console.log

nie ma tu mowy na razie o pliku index zadnym. Sa tylko dwa pliki super.php w ktorym jest wywolanie ajaxa i plik test.php dla ktorego idzie zapytania z tego ajaxa. Jak wejdziesz na plik test.php bezposrednio to musi byc blad bo nie wysylasz nic postem
komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
No, ale to masło maślane, w console.log to ja już dawno miałem jak zaczynałem ten temat. A mi nie jest potrzebna informacja w console.log tylko konkretna wartość do wykorzystania w php.
1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

No to jak uzywasz w AJAXIE takiego zapisu

data: {
            zmienna: timezone
        },

to w php mozesz go uzyc jako

$_POST['zmienna']

i to wszystko

 

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

No i właśnie nie. Jak w pierwszym poście, dostaje:

Notice: Undefined index: zmienna in" 


A var_dump($_POST) zwraca pustą tablicę

array(0) { }

Próbuję wykminić czemu i nic.

 

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Jest różnica między GET a POST 

GET to wartosci przesylane przez adres url na przyklad twojastrona.pl/index.php?zmienna=samochod

jesli wpiszesz taki adres to w php mozesz zrobic 

<?php
var_dump($_GET['zmienna']);
?>

W tym przypadku wyskoczy ci samochod:

z POSTEM tak nei zrobisz. jEsli chcesz zobaczyc co zwraca post to zainstaluj wtyczke do przegladarki albo uzyj tego ajaxa co ci mowilem zeby zobaczyc czy zwraca ci wartosc COSTAM. a jesli chcesz sprawdzic co zwraca to zapisz do pliku

<?php
echo file_put_contents("test.txt", $_POST['zmienna']);
?>

i teraz jak wejdziesz na super.php zobacz co masz zapisane w pliku test.txt powinna byc zmianna z data igodzina

 

Jezeli ty robisz var_dump($_POST); w pliku test.php albo index.php i potem wchodzisz na niego z adresu url. To czego oczekujesz ze co tam beda za parametry ? skoro nic do tego pliku nie zostalo wyslane ? wiadomo ze musi byc NULL

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
Chyba bardzo się nie rozumiemy.

Mam wartość w JS, przesyłam ją do PHP ajaxem, dostaje informację zwrotną success z console logu, ale nie mam jej w pliku php pomimo to.

Nie chcę i nie używam GET, a tym bardziej nie chcę mnożyć bytów i jeszcze zapisywać do plików txt. Chcę odebrać w php to co wysłałem.
1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
Tak jak mowilem twoja wartosc w pliku test.ph jest w zmiennej

$_POST['zmienna']

i nie ma innej mozliwosci by jej tam nie bylo skoro ja wysylasz
komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Tak jak mowilem twoja wartosc w pliku test.ph jest w zmiennej 

No nie ma. " Notice: Undefined index: zmienna in" 

 

Od początku piszę, że nie ma. I próbuję zrozumieć czemu.

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

a jak sprawdzesz te wartosc skad masz to Notice: Undefined index: zmienna in

daj kod zrodlowy pliku z ktorego ci to wyskakuje i jak sie do niego dostajes

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Wchodzę na moją stronę:

http://localhost/projekt/index.php

Tutaj mam 

include("phpfiles/ajaxphpfiles/test.php");

I potem standardowa budowa strony (<!DOCTYPE HTML><html><head></head></body>, gdzie head zawiera: 
 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js"></script>
<script type="text/javascript" src="scripts/timezone.js"></script>

Ten ostatni zawiera skrypt z pierwszego postu.

W test.php mam

echo $_POST['zmienna'];

Które daje owe notice:

Notice: Undefined index: zmienna

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
edycja 14 sierpnia 2019 przez Wraith
Zgadza sie masz błąd logicznie to wygląda tak.

Jesteś listonoszem. Wchodzisz do pracy (index.php) i bierzesz bierzesz pudełko z listami (include test.php) patrzysz a to pudełko jest puste ponieważ nikt nie wysłał listu POST (czyli nie wrzucił listu do skrzybki pocztowej wiec nie dotarł na poczte do twojego pudełka). Zatem dla ciebie na pytanie (var_dump($_POST['zmienna'])) czy jest list o nazmwie zmienna mowisz: Undefined index: zmienna

Bo nie masz listu bo nikt go nie wyslal AJAXEM jeszcze zgadza sie ?

Pytanie moje jest nastepujące. Co ma robic twoj lik test.php co chcesz zrobic kiedy będziesz już mał tą zmienna $_POST['zmienna'] - to co ma sie z nia stac ?
komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Ma włożyć wartość do zmiennej sesyjnej:

$_SESSION['TimeZone'] = $_POST['zmienna']


Bo nie masz listu bo nikt go nie wyslal AJAXEM jeszcze zgadza sie ?

Ok. Czyli tak jak myślę, czegoś nie rozumiem, coś pomijam. Więc w jaki sposób mam to wysłać? Czemu to

 

$(document).ready(function(){
 
    var tz = jstz.determine(); 
    var timezone = tz.name(); 
 
    $.ajax({
        type: "POST",   
        url: "phpfiles/ajaxphpfiles/test.php",       
        data: {
            zmienna: timezone
        },
        success: function() {
            console.log(timezone);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
});

Nie wykonuje swojej pracy?

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)

Wykonuje swoja prace zatem jeśli chcesz wlozyc to do zmiennej sesyjnej zrob tak:

1. z pliku index.php wywal include test.php ten plik nie ma byc nigdzie zalaczony jest on tylko do uzytku ajaxowego 

2. wpliku test.php daj

<?php
session_start();
$_SESSION['TimeZone'] = $_POST['zmienna'];
?>

3. w pliku index.php daj

<?php
session_start();
var_dump($_SESSION['TimeZone']);
?>

i wejdz na strone index.php. a potem ja odswiez i powinenes zobaczyc zaktualizowana zmienna

komentarz 14 sierpnia 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

1. z pliku index.php wywal include test.php ten plik nie ma byc nigdzie zalaczony jest on tylko do uzytku ajaxowego 

A więc tu był błąd! Za daleko poleciałem. No i teraz działa. 
Zupełnie nie pomyślałem, że przecież już się odwołuje do test.php, gdy włącze skrypt. Miałem w głowie cały czas, że muszę ty jakoś to włączyć.

Samo odświeżanie strony, żeby mieć tą zmienną byłoby słabe, ale nie potrzebuje jej na indexie, tylko po zalogowaniu ze strony indexu tak jak miało być. Wielkie dzięki.

1
komentarz 14 sierpnia 2019 przez Wraith Gaduła (4,370 p.)
Ciesze się że zadziałało. Pozdrawiam

Podobne pytania

0 głosów
2 odpowiedzi 288 wizyt
pytanie zadane 20 marca 2020 w JavaScript przez saseq Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 515 wizyt
pytanie zadane 24 sierpnia 2016 w JavaScript przez Alterwar Dyskutant (7,650 p.)
–1 głos
3 odpowiedzi 233 wizyt
pytanie zadane 23 grudnia 2018 w JavaScript przez Q7V Gaduła (4,250 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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!

...