Ajax com PHPAjax é a sigla de Asynchronous JavaScript and XML.
O termo “assíncrono” – neste caso - significa que o usuário não precisa esperar que uma requisição seja processada para mandar outra(s).
Ajax não é uma linguagem de programação, mas uma técnica sugerida pelo Google em 2005.
Com Ajax é possível fazer requisições ao servidor sem submeter a página e assim criar sites parecidos com aplicações desktop (vide o Gmail, por exemplo) com melhor usabilidade e menor tráfego de dados.
A desvantagem é um pequeno aumento na complexidade da implementação e problemas com a inexistência de links para páginas criadas com essas requisições que impedem o usuário de ter uma referência a uma página específica (como fazer bookmark).
O Ajax é suportado pelos seguintes browsers: Internet Explorer 5.0+, Safari 1.2, Mozilla 1.0 / Firefox, Opera 8+ e Netscape 7.
O objeto XMLHttpRequest
É o ponto chave do negócio. Este objeto manipula as requisições e as respostas do Ajax.
A maioria dos fabricantes de browser implementa em Javascript uma classe nativa chamada XMLHttpRequest enquanto a Microsoft implementa uma classe ActiveXObject, mas ambos com interface semelhante.
Propriedades-chave:
- readyState: integer – estado atual da requisição
- responseText: string – a resposta do servidor
- status: integer – status de resposta (exemplo: se for 200, a requisição está ok, se for 404, a página não foi encontrada)
Métodos-chave:
- setRequestHeader() – define o cabeçalho da requisição.
- onreadystatechange() – evento acionado quando há mudança no estado da requisição (atributo readyState)
- open() – abre e configura uma conexão com o servidor
- send() – envia a requisição
Passos para a criação de uma rotina em Ajax:
1.) Definir o elemento que enviará a requisição
Normalmente a requisição é feita através de algum evento de um input, por exemplo, ao clicar em um botão.
2.) Instanciar o objeto XMLHttpRequest em Javascript. Esse objeto irá manipular a requisição e a resposta.
A rotina de criação sempre será como segue:
2:var requisicao;
3:
4:function criaObjetoAjax() {
5:
6: try { // Firefox, Opera 8.0+, Safari
7: requisicao = new XMLHttpRequest();
8: } catch (e) { // Internet Explorer
9: try {
10: requisicao = new ActiveXObject("Msxml2.XMLHTTP");
11: } catch (e) {
12: try {
13: requisicao = new ActiveXObject("Microsoft.XMLHTTP");
14: } catch (e) {
15: alert("Seu browser não suporta AJAX!");
16: return false;
17: }
18: }
19: }
20:}
3.) Enviar requisiçõesPrimeiramente, definir – se for o caso - as variáveis URL.
Exemplo:
1:var param = 'nome=joao&senha=123456';
Definir o cabeçalho da requisição (o método POST não funcionará direito sem essas definições, pois os dados são enviados no cabeçalho)
1:requisicao.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
2:requisicao.setRequestHeader('Content-length', param.length);
3:requisicao.setRequestHeader('Connection', 'close');Evocar os seguintes métodos do XMLHttpRequest (que são primitivas de um serviço na camada de transporte. Para mais informações, estude arquiteturas de redes OSI ou TCP/IP)
- open() - Abre a conexão
- send() - Envia os dados
O método open recebe os argumentos:
- Método de requisição (“GET” ou “POST”)
- URL do script PHP no servidor
- Se a conexão é assíncrona (true ou false)
Se o método for GET, os parâmetros devem ser enviados na URL. Se o método for POST, o método send() recebe os dados (que no caso é a variável param) para escrever no header da requisição.
4.) O script server-side
O script PHP no servidor recebe os dados nas variáveis $_GET ou $_POST respectivamente, é processado e gera uma resposta em formato de texto - que nada mais é do que o output do script.
5.) A propriedade readyState:
A propriedade readyState do objeto XMLHttpRequest armazena o estado atual da requisição. Seus valores possíveis são:
0: O request não está inicializado
1: O request foi configurado
2: O request foi enviado
3: O request está em processo
4: O request foi completo
6.) O evento onreadystatechange
O evento onreadystatechange do objeto XMLHttpRequest ocorre toda vez que a propriedade readyState muda. Ouvindo este evento vamos processar a resposta vinda do servidor quando seu estado for 4 (concluída). A resposta é guardada no atributo responseText do objeto XMLHttpRequest.
1:requisicao.onreadystatechange = function() {
2: if (requisicao.readyState == 4) {
3: document.getElmentById('resposta').innerHTML = requisicao.responseText;
4: }
5:}
Considerações:
- Nem sempre uma requisição é acionada por uma ação do usuário. Um auto reload na página também pode requerer dados. Um exemplo disso é um sistema de chat que precisa fazer requisições periódicas para saber se houve novas mensagens.
- Para exibir uma mensagem do tipo “Carregando...”, deve-se tratar a propriedade readyState quando seu valor for 2 ou 3.
- Se a resposta enviar um javascript, este não será validado automaticamente. Para saber como validar os scripts enviados, leia o tutorial http://oreidophp.blogspot.com/2007/11/validando-javascript-no-ajax.html.
- Também é possível enviar como resposta um XML contendo dados para serem tratados via Javascript.
Exemplo
Vamos colocar o que foi dito em prática. O exemplo a seguir é composto de dois arquivos na raiz da aplicação. É enviado o nome do usuário e recebido nome do servidor de aplicação.
Tela:

index.html 1:<html>
2: <body>
3: <h1>Teste de Ajax</h1>
4: Seu nome: <input type='text' name='nome' id='nome' />
5: <input type='button' value='Requisitar' onclick='requisita()' />
6: <div id='resposta'></div>
7: </body>
8:</html>
9:
10:<script type='text/javascript'>
11: var requisicao;
12: try { // Firefox, Opera 8.0+, Safari
13: requisicao = new XMLHttpRequest();
14: } catch (e) { // Internet Explorer
15: try {
16: requisicao = new ActiveXObject("Msxml2.XMLHTTP");
17: } catch (e) {
18: try {
19: requisicao = new ActiveXObject("Microsoft.XMLHTTP");
20: } catch (e) {
21: requisicao = false;
22: }
23: }
24: }
25:
26: function requisita() {
27: if (!requisicao) {
28: alert('Seu browser não suporta Ajax');
29: return false;
30: }
31:
32: requisicao.onreadystatechange = function() {
33: var resposta = document.getElementById('resposta');
34: switch (requisicao.readyState) {
35: case 2:
36: resposta.innerHTML = "Carregando...<br/>";
37: break;
38: case 4:
39: if (requisicao.status == '200') {
40: resposta.innerHTML = requisicao.responseText;
41: } else {
42: resposta.innerHTML = "<p><b>Erro no servidor</b></p>";
43: }
44: }
45: }
46: var param = "nome=" + document.getElementById('nome').value;
47: requisicao.open("POST", "processaRequisicao.php", true);
48: requisicao.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
49: requisicao.setRequestHeader('Content-length',param.length);
50: requisicao.setRequestHeader('Connection','close');
51: requisicao.send(param);
52: }
53:</script>
processaRequisicao.php
1:<hr/>
2:Ola <?= $_POST['nome'] ?>
3:<br/>
4:O software do servidor de aplicacao é <?= $_SERVER["SERVER_SOFTWARE"] ?>
5:<hr/>