Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: xmlhttprequest i problem wysłania danych
Forum PHP.pl > Forum > XML, AJAX
Kwazi
Witam,
Być może temat był już wałkowany, z góry przepraszam

Mianowicie mam kłopot z którym się już jakiś czas męczę.
Od razu mówię że nie używam żadnych bibliotek AJAXa, a sam tworzę instrukcje xmlhttprequest, kwestia przyzwyczajenia
Kłopot polega na tym że kiedy tworzę sobie obiekt xmlhttprequest i metodą post lub get przesyłam zmienne do skryptu php w tle, to ten wogóle ich nie odczytuje...

Co dziwne na localhoscie wszystko śmiga jak marzenie, a po wgraniu na serwer już nie, choć kiedyś na tym serwerze chodziło wszystko bez zarzutu (tak kojarze).

Skrypt JS z wywołaniem żądania
  1. if(navigator.appName == "Microsoft Internet Explorer") http = new ActiveXObject("Microsoft.XMLHTTP");
  2. else http = new XMLHttpRequest();
  3.  
  4. function deleteFile(myFileName){
  5.  
  6. var ret;
  7. http.abort();
  8. http.open("POST","Ajax/port_delfile.php?tmpFile="+myFileName, true);
  9. http.onreadystatechange=function() {
  10.  
  11. if(http.readyState == 4) {
  12. ret = http.responseText;
  13. alert(ret);
  14. }
  15. }
  16.  
  17. http.send(1);
  18.  
  19. }



Prosty skrypt usuwający plik
  1. <?php
  2. unlink($tmpFile);
  3. echo "moj katalog: $tmpFile";
  4. ?>



Oczywiście sam unlink wyrzuca błąd w tle za pomocą alerta bo nie może usunąć pustego pliku.
Z kolei alert(ret) zwraca alert ("moj katalog: "), a powinien zwrócić np: alert ("moj katalog: data_user/example.jpg")

Czytałem trochę tu i tu na necie, gdzieś tam pisali o jakiś odwołaniach do domen,
ale wiele mi to nie pomogło. Nie wiem gdzie leży problem, być może trzeba mi to łopatologicznie wyjaśnić

Gdzie popełniam błąd? Czemu na lokalu chodz oki?
Jest to kwestia serwera?(chyba nie), źle wywołuję metodę open?

Pozdrawiam,
dziękuje
erix
Cytat
Jest to kwestia serwera?(chyba nie), źle wywołuję metodę open?

register_globals?
omeck
Skoro używasz bezpośrednio obiektu XMLHTTPRequest i chcesz użyć metody POST, to musisz dodatkowo wysłać nagłówek - myślę, że to stanowi problem:

Kod
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");


Czyli cuś takiego:

  1. var http;
  2. if(navigator.appName == "Microsoft Internet Explorer") http = new ActiveXObject("Microsoft.XMLHTTP");
  3. else http = new XMLHttpRequest();
  4.  
  5. function deleteFile(myFileName){
  6.  
  7. var ret;
  8. http.abort();
  9. http.open("POST","Ajax/port_delfile.php?tmpFile="+myFileName, true);
  10. http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  11. http.onreadystatechange=function() {
  12. if(http.readyState == 4) {
  13. ret = http.responseText;
  14. alert(ret);
  15. }
  16. }
  17. http.send(1);
  18. }
Kwazi
hej,
dzięki za reakcje, co do register_globals to dyrektywa ustawiona jest na on, więc nie ma znaczenia,
czy użyje tablicy superglobalnej $_POST czy nie, w zasadzie jasna sprawa że powinno tam być $_POST

Co do nagłówka, to już dokładałem
  1. http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

nie pomógł, ale żeby się upewnić, sprawdziłem raz jeszcze


Wykonałem kolejnych kilka testów i zaobserwowałem ciekawą rzecz:
Inna funkcja korzystająca z xmlhttprequest, sprawdza czy e-mail jest w bazie
  1. function checkEmail(email){
  2.  
  3. var ret;
  4. http.abort();
  5. http.open("POST","Ajax/reg_checkemail.php?tmpMail="+email, true);
  6. http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  7. http.onreadystatechange=function() {
  8.  
  9. if(http.readyState == 4) {
  10. ret = http.responseText;
  11. if(ret!="") {
  12. existEmail=true;
  13. }
  14. else {
  15.  
  16. existEmail=false;
  17. }
  18.  
  19. }
  20. }
  21.  
  22. http.send(1);
  23. }



po stronie serwera skrypt php
  1. <?
  2. //------ Połączenie z bazą -------------------------------------------------------------------------------------------------------------
  3. require ("../Bin/db_class.php");
  4. $dbClass=new dbClass();
  5. $dbClass->dblogon();
  6.  
  7. //-----------------------------------------------------------------------------------------------------------------------------------------
  8. $returnEmail=$dbClass->getValuleFromTable("users", "email", "where lower(email)='".strtolower($_POST['tmpMail'])."'");
  9. echo "$returnEmail";
  10. //-----------------------------------------------------------------------------------------------------------------------------------------
  11. ?>


I chyba faktycznie z tymi domenami jest coś na rzeczy.
bo gdy wywołuje adres stronki z rodzimej domeny serwera: http://ottargo.altaynet.masternet.pl/
to działa ok, i jeśli adres jest już w bazie to zwraca błąd.

Natomiast jeśli stronkę wywołam z adresu http://www.ottargo.pl/ to już jest lipa...
Zrobiłem też prosty przykład z jQuery i to samo...
Ciekawe? Ma ktoś jakieś wyjaśnienia?

Pozdrawiam,
dziękuje za sugestie
viking
Ale odwołujesz się do tej samej domeny czy nie? Tutaj sytuacja nie jest do końca jasna, trwają rozmowy czy to wprowadzić w przeglądarkach, czy nie stanowi luki w bezpieczeństwie. Przykładowo w FF 3.0.11 (https://bugzilla.mozilla.org/show_bug.cgi?id=424923) zostało usunięte.
Kwazi
Jak podałem w przykładzie odwołuje się względnie do katalogu "Ajax" z plikami php działającymi w tle.
Nie odwołuje się do tych plków zaczynając od http://...
Z resztą nie jest to problem tylko w FF, ale w IE jest to samo


Może podam nowy testowy przykład z linkami:

Kod pliku JS wysyła do pliku php zmienną tmpFile, a w zwrocie powinien dostać alert z napisem: example
  1. <?php
  2. <script language=JavaScript>
  3. var http = false;
  4. if(navigator.appName == "Microsoft Internet Explorer") http = new ActiveXObject("Microsoft.XMLHTTP");
  5. else http = new XMLHttpRequest();
  6.  
  7. //----------------------------------------------------------------------------------------------------------------------
  8. function test_ajax(myFileName){
  9.  
  10.    var ret;
  11.    http.abort();
  12.    http.open("POST","ajax.php?tmpFile="+myFileName, true);
  13.    http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  14.    http.onreadystatechange=function() {
  15.  
  16.                if(http.readyState == 4) {
  17.                        ret = http.responseText;
  18.                        alert(ret);
  19.              }
  20.        }
  21.  
  22.     http.send(1);
  23.  
  24. }
  25. //------------------------------------------------------------------------------------------------------------
  26. </script>
  27.  
  28. <script language=JavaScript>
  29. test_ajax("example");
  30. </script>
  31. ?>


kod php w tle:
  1. <?
  2. echo "moj katalog: ".$tmpFile;
  3. ?>


nie ma znaczenia czy $tmpFile czy $_POST['tmpFile'], bo register_globals=on

i wynik finalny pod linkami
pod oryginalną domeną serwera: http://ottargo.altaynet.masternet.pl/xmlht...quest/index.php -> działa ok
pod wykupioną domeną: http://www.ottargo.pl/xmlhttprequest/index.php -> nie działa

Pomóżcie, bo zwariuje w końcu
Pozdrawiam

Kombinuje i kombinuje,
jakiś mały kroczek jest, tyle że nie do końca rozwiązuje problem.

Wszedłem na konfiguracje serwera przez www, udostępnioną przez usługodawcę www.masternet.pl
i zmieniłem dla mojej domeny, która stoi na www.home.pl wersję z php5 na php4 i wszystko chodzi bez zarzutu...

Hmmm... ciekawe, czemu z php4 działa a z php5 nie?
Czy problemem może być to że domena wykupiona jest na home.pl,
a fizycznie zawartość serwisu znajduje się na innym serwerze?
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.