Enviando dados para php via ajax

Olá, estou tendo um problema ao tentar mandar um valor para uma pagina php via ajax. Pra tentar resolver eu simplifiquei ao maximo o codigo que segue:

<!DOCTYPE html>
<html>
     <title>index.php</title>
     <head>
          <script type="text/javascript"></script>
          <script>
               function clic() {
                    var ajax = new XMLHttpRequest();
                    ajax.open("POST", "index.php", true);
                    ajax.setRequestHeader("Cache-Control", "no-cache, must-revalidate");
                    ajax.setRequestHeader("Pragma", "no-cache");
                    ajax.send("variavel=FUNCIONOU");
               }
          </script>
     </head>
     <body>
          <button onclick="clic()">TestButton</button>
    
          <?php
               $x = $_POST['variavel'];
               echo $x;
          ?>
     </body>
</html>

A idéia de tudo isso é fazer com que minha aplicação envie um valor conforme um botão clicado pelo usuario, e através do php armazene em mysql, mas eu não estou obtendo nenhuma resposta na minha variavel no php.

vamos la

o php é sincrono. ajax não.

vc vai carregar index.php e ai vc entra nesse echo $x que… nao tem nada.

ajax é assincrono. em algum momento ele vai mandar esse post. o seu objeto XMLHttpRequest é que vai receber o resultado.

quer brincar?

  1. coloque esse codigo em um index.html
  2. o seu index.php tem só o echo da variavel vinda por POST
  3. antes do ajax.send, adicione algo assim
ajax.onreadystatechange = function () {
        if(ajax.readyState === XMLHttpRequest.DONE && ajax.status === 200) {
            alert(xhr.responseText);
        }
    };

em algum momento apos o click vc vai ver um alert.

nesse ponto vc entendeu ajax. e entendeu php. e entendeu que uma coisa fala com a outra com o protocolo HTTP

ai como vc escreve o conteudo na pagina? ai vc usa o DOM.

vc pode criar uma div de id “qqcoisa”

pede pro document um elemento de id “qqcoisa” - via document.getElementById(…)

vai retornar um objeto que tem propriedade .innerHTML

vai brincando com isso. faz objeto.innerHTML= “BUUU”;

com jQuery é mais facil. mas aprende com js puro primeiro q é mais divertido.

ps: movi ora Front-end que faz mais sentido

Peczenyj, você pode me ajudar? Eu uso Ajax sem jQuery igual ao Leandro e tenho um erro…Após enviar minhas requisições Ajax para o PHP, no fim do script php, eu retorno um echo, echo “envio_ok”; por exemplo, e pego essa string com responseText e comparo com ==

If (a.responseText == "envio_ok"){ 
Faça isso } else { faça aquilo } 

O JavaScript não entende esse IF e acaba travando aqui, se eu colocar apenas um = ele executa o IF , porém se eu tiver um ELSE IF nessa condição do responseText, ele executa o ELSE… Faz tempo que eu tento solucionar isso.

Não posso colocar o código agora, porque estou com o note quebrado. Mas se você tiver tempo e puder me ajudar, eu envio para você meus códigos assim que consertar o note aqui!

Peço desculpas ao Leandro por invadir a dúvida dele com a minha!

no javascript faz um alert(a.responseText) e ve o que retorna.

usar = puro em um if é completamente errado, = é operador de atribuição, enquanto == e === são de comparação ( o primeiro tem regras de coerção se os tipos forem diferentes, o ultimo verifica se o conteudo E o tipo são os mesmos ).

Já havia testado o alert, e ele retorna o echo do php normal, envio_ok , muito estranho esse erro, testei no local host e num servidor online, o erro persiste, já tentei usar === também, tentei muita coisa e nada…O pior é que meu site está todo assim, com = nos IFS do AJAX :cry:

= no if ate faz sentido. mas em casos bem particulares

if( variavel = alguma_coisa ){
 //  variavel aqui dentro vai 'alguma_coisa', SE esta coisa for algo que se entenda como verdadeiro
}

agora vamos ver, faz um alert assim

alert(" recebido >" + a.responseText + "< ");

assim se tiver uma quebra de linha ou um espaço em branco em algum lugar, vc vai saber.

é por isso que em ajax é comum retornar um json, pois o javascript vai parsear a estrutura de dados e encontrar os valores certos. como

{ “status”:“OK”}

isso + http status code ajuda muito.

Vou testar assim que pude esse exmplo do
alert(" recebido >" + a.responseText + "< ");
assim que puder e fazer mais testes. valeu pela força Peczeny!