Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача данных из JS в PHP - что не так? (https://javascript.ru/forum/misc/21736-peredacha-dannykh-iz-js-v-php-chto-ne-tak.html)

Rokugan 22.09.2011 11:15

Передача данных из JS в PHP - что не так?
 
Прошу заранее прощения за возможное ламерство, так как с JS только начал знакомиться.
Возникла задача - передать каким-то образом некое значение из скрипта обратно в PHP. Почитал форумы, сделал тестовый пример - и не работает. Как говорится, что я делаю не так?
Есть php файл примерно такой (заголовки опускаю)
<script src="test.js"></script>
<script type="text/javascript">
var x = 3;
var php_source = "http://mysite/test.php";
</script>

<img src="http://mysite.ru/test.png" onclick="testing();">

<?php
if (isset($_POST['count']))
{
$count=$_POST['count'];
echo 'Счетчик - '.$count;
} else { echo 'Упс';}

?>


И есть этот test.js
function testing() {

var http_request = false;

   if (window.XMLHttpRequest)
   { // Mozilla, Safari, ...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {
         http_request.overrideMimeType('text/xml');
         // Читайте ниже об этой строке
      }
   }
   else if (window.ActiveXObject)
   { // IE
      try
      {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try
         {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }


   if (!http_request)
   {
      alert('Не вышло :( Невозможно создать экземпляр класса XMLHTTP ');
      return false;
   }

   http_request.onreadystatechange = function() { alertContents(http_request); };
   http_request.open('POST', php_source, true);
   http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
   http_request.send('count='+x);
}

function alertContents(http_request) {
              
				  if (http_request.readyState ==4) {
				  
				  }

}


По идее, мне бы хотелось, что в переменную $count из массива $_POST попала бы ранее определенная переменная х - но вместо этого выводится текст "Упс", т.е. $_POST['count'] не определен.
Где ошибка закралась?
Спасибо!

Genius 22.09.2011 11:47

Гораздо проще, имхо, через $_GET передать данные...

systemiv 22.09.2011 12:50

1. Можно просто прописать var http_request = XMLHttpRequest();
2. Делай две проверки, if(http_request.readyState == 4) и if(http_request.status == 200);

Rokugan 22.09.2011 13:50

А все таки - почему может не работать данный код?
Проверки или там GET - это здорово, но почему так-то не работает?

melky 22.09.2011 21:32

Цитата:

Сообщение от Rokugan (Сообщение 127604)
function testing() {

var http_request = false;

   if (window.XMLHttpRequest)
   { // Mozilla, Safari, ...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {
         http_request.overrideMimeType('text/xml');
         // Читайте ниже об этой строке
      }
   }
   else if (window.ActiveXObject)
   { // IE
      try
      {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try
         {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }


   if (!http_request)
   {
      alert('Не вышло :( Невозможно создать экземпляр класса XMLHTTP ');
      return false;
   }

*!*
   http_request.onreadystatechange = function() { alertContents(http_request); };
   http_request.open('POST', php_source, true);
   http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
   http_request.send('count='+x);
*/!*

}

function alertContents(http_request) {
              
				  if (http_request.readyState ==4) {
				  
				  }

}


// params = "count=2" (string)
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
*!*
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
*/!*
http.send(params);

Rokugan 27.09.2011 18:04

Добавил в меру своего разумения указанные строчки...и все равно не работает.
Судя по FireBug, POST запрос проходит успешно, только вот в php файле получить переменную count не получается.
Плиз хелп! Просто не понимаю, в чем косяк - вроде ж должно работать.

melky 27.09.2011 18:28

что-нибудь пересылается в запросе?

Rokugan 28.09.2011 15:45

Цитата:

Сообщение от melky (Сообщение 128330)
что-нибудь пересылается в запросе?

Простите за глупый вопрос, но как это понять?
Если в самом скрипте поставить вывод переменной "х", то она отображается правильно.
В файрбаге POST запрос без ошибок показывается, но в php, который этот запрос передается, ничего нет. Т.е. похоже, что не пересылается - но как это точно отловить, я не знаю, увы.

melky 28.09.2011 16:50

это значит вот это :
Цитата:

Сообщение от Rokugan (Сообщение 128421)
В файрбаге POST запрос без ошибок показывается

т.е. переменная пересылается. точно?

тогда в начале php скрипта проверьте, чо тама переслалось

это можно сделать так.

echo "<pre>";
print_r( $_POST );
die('</pre>');

Rokugan 28.09.2011 22:02

Цитата:

Сообщение от melky (Сообщение 128440)
это значит вот это :
т.е. переменная пересылается. точно?
тогда в начале php скрипта проверьте, чо тама переслалось

Вот в чем и собака порылась...
Файрбаг пишет:
POST http://www.site.ru/test.php [HTTP/1.1 200 OK 16мс]
Т.е. вроде бы все успешно передалось.
А в php приходит пустой $_POST - ваш код проверки показывает Array ()

melky 28.09.2011 22:24

Цитата:

Сообщение от Rokugan (Сообщение 128501)
Вот в чем и собака порылась...
Файрбаг пишет:
POST http://www.site.ru/test.php [HTTP/1.1 200 OK 16мс]

это значит, что страница такая есть. насчет данных тут ничего не видно.

Цитата:

Сообщение от Rokugan (Сообщение 128501)
Т.е. вроде бы все успешно передалось.
А в php приходит пустой $_POST - ваш код проверки показывает Array ()

у вас взаимоисключающие параграфы!

ройтесь в скрипте.

покажите его.

Rokugan 29.09.2011 17:05

Цитата:

Сообщение от melky (Сообщение 128508)
ройтесь в скрипте.

покажите его.

Так уже показал в самом первом посте.
Скрипт тестовый, хотел понять, как работает передача данных из JS в PHP. Так пока и не понял.
Правда ,если пойти другим путем - в php сгенерить форму со скрытым полем, типа
<form method="post">
<input type="hidden" name="tform" value="" />
</form>


А в скрипте написать

var f = document.forms[0];
f.tform.value = params;
f.submit();


То потом в $_POST можно этот params успешно отловить.
Есть ли косяки у такого способа, по сравнению с XMLHTTPRequest?

melky 29.09.2011 21:58

да-он синхронный. правда, можно указать target форме.

используйте ajax.

Rokugan 30.09.2011 09:16

Цитата:

Сообщение от melky (Сообщение 128789)
да-он синхронный. правда, можно указать target форме.

используйте ajax.

Дык пытаюсь, но что-то у меня никак каменный цветок не выходит :(
Не передается, хоть тресни - что POST, что GET. Причем пробовал даже на разных хостингах. Могут ли какие то настройки PHP на сервере на это влиять?
В любом случае спасибо вам за помощь!

melky 30.09.2011 09:33

нет. это мы запрос неверно отправляем :)

с таким кодом :

var callback = function(data,req){
    // выполнится по завершении запроса. this - req.
    alert(data);
};

var ajax=new XMLHttpRequest();

ajax.onreadystatechange=function(){ 
    if( ajax.readyState==4 ){
        callback.call( ajax,ajax.responseText,ajax );
    }
};

ajax.open("POST", "/echo/html/");

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

ajax.send("myvar=mylolko");


данные (myvar=mylolko) отправляются. я проверил в jsfiddle :)

Rokugan 30.09.2011 14:37

Цитата:

Сообщение от melky (Сообщение 128843)
нет. это мы запрос неверно отправляем :)

Так, я кажется понял.
Спасибо!
Данные действительно передаются, только обработчик то мой ничего обратно не возвращает, поэтому на странице, с которой вызывался скрипт, ничего и не меняется.
responseText вернул всё правильно, теперь вопрос, что с этим делать :)
В общем следующий вопрос, попробую сформулировать, и заранее прошу прощения за тупость :)
Вот возьмем нмой пример.
Если мы вызываем JS скрипт из некоего php, а обрабатывает POST, сделанный в этом JS скрипте, снова тот же php-файл, то в responsetext у нас оказывается целиком результат работы php, т.е. фактически вся страничка. Значит ли это, что php-обработчик, который мы вызываем в ajax.open, должен быть отдельным, другим php, не тем же самым, в котором мы формировали страничку для пользователя с картинкой и прочим? Т.е. в нем я уже сделаю нужные манипуляции, а потом выведу responsetext куда мне надо через document.getElementById к примеру?
Или же можно из responsetext как-то выдрать нужный мне элемент сразу?
Еще раз спасибо вам, кажется я стал потихоньку понимать, как что работает :)

melky 30.09.2011 18:52

Цитата:

Сообщение от Rokugan (Сообщение 128915)
Если мы вызываем JS скрипт из некоего php, а обрабатывает POST, сделанный в этом JS скрипте, снова тот же php-файл, то в responsetext у нас оказывается целиком результат работы php, т.е. фактически вся страничка.

всё верно.

Цитата:

Сообщение от Rokugan (Сообщение 128915)
Значит ли это, что php-обработчик, который мы вызываем в ajax.open, должен быть отдельным, другим php, не тем же самым, в котором мы формировали страничку для пользователя с картинкой и прочим?

??????????

Цитата:

Сообщение от Rokugan (Сообщение 128915)
Т.е. в нем я уже сделаю нужные манипуляции, а потом выведу responsetext куда мне надо через document.getElementById к примеру?
Или же можно из responsetext как-то выдрать нужный мне элемент сразу?

нужный элемент можно выдрать так
// ajax responseText
var text = '<body>*!*<div class="myclass">нужный текст</div>*/!*<div>ненужный текст</div></body>';

// создаем контейнер
var a = document.createElement("span");
// помещаем в него загруженный html
a.innerHTML = text;

// вуаля. в контейнере полноценные html-элементы
var myElement = a.querySelector("div.myclass");

// для проверки выведем его содержимое
alert( myElement.innerHTML ); // "нужный текст"


Часовой пояс GMT +3, время: 11:09.