PHP e HTML

PHP e HTML possuem muita intera√ß√£o: PHP pode gerar HTML, e o HTML pode passar informa√ß√Ķes para o PHP. Antes de ler esses faqs, √© importante que voc√™ aprenda como recuperar vari√°veis de fontes externas. A p√°gina do manual neste t√≥pico inclui muitos exemplos. Tamb√©m preste aten√ß√£o no que significa register_globals para voc√™.

Que codificação/decodificação é preciso quando eu passo um valor através de um formulário/URL?

Existem muitos estágios para o qual a codificação é importante. Assumindo que você tenha uma string $data, o qual contém a string que você quer passar de um jeito não codificado, esses são os estágios relevantes:

  • Interpreta√ß√£o HTML. A fim de especificar uma string aleat√≥ria, voc√™ precisa inclu√°-la entre aspas, e converter todo o valor dos caracteres especiais para a realidade HTML usando htmlspecialchars().

  • URL: Uma URL consite de diversas partes. Se voc√™ quer que seus dados sejam interpretados como um item, voc√™ precisa codific√°-los com urlencode().

Exemplo #1 Um elemento oculto de formul√°rio HTML

<?php
    
echo "<input type='hidden' value='" htmlspecialchars($data) . "' />\n";
?>

Nota: √Č errado urlencode() $data, porque √© a responsabilidade do navegador em urlencode() os dados. Todos os navegadores populares o fazem isso corretamente. Note que isso ir√° acontecer independentemente do m√©todo (i.e., GET ou POST).Voc√™ s√≥ vai perceber isso em caso de solicita√ß√£o GET, porque as requisi√ß√Ķes POST s√£o normalmente escondidas.

Exemplo #2 Dados a serem editados pelo usu√°rio

<?php
    
echo "<textarea name='mydata'>\n";
    echo 
htmlspecialchars($data)."\n";
    echo 
"</textarea>";
?>

Nota: Os dados são mostrados no navegador como pretendido, porque o navegador irá interpretar os simbolos de escape do HTML. Em consequência do envio, tando via GET como POST, os dados vão ser urlencoded pelo navegador para transferência, e urldecoded diretamente pelo PHP. Resumindo, você não precisa fazer qualquer urlencoded/urldecoded pelo php, tudo é feito automaticamente.

Exemplo #3 Em uma URL

<?php
    
echo "<a href='" htmlspecialchars("/nextpage.php?stage=23&data=" .
        
urlencode($data)) . "'>\n";
?>

Nota: De fato você está fingindo uma requisição HTML GET, portanto é necessário urlencode() os dados manualmete.

Nota: Voc√™ precisa htmlspecialchars() toda a URL, porque a URL ocorre como um valor de um atributo-HTML. Neste caso, o navegador ir√° primeiramente un-htmlspecialchars() o valor, e ent√£o passar a URL. O PHP vai entender a URL corretamente, porque voc√™ urlencoded() os dados. Voc√™ vai notar que & na URL √© substituido por &amp;. Embora a maioria dos navegadores v√£o se recuperar se vec√™ esquecer disto, isso nem sempre √© possivel. Ent√£o, memso se a URL n√£o √© din√Ęmica, voc√™ precisa htmlspecialchars() a URL.

Estou tentando usar uma tag <input type="image">, mas as variáveis $foo.x e $foo.y não estão disponíveis. $_GET['foo.x'] não existem também. Onde elas estão?

Ao enviar um formulário, é possivel usar uma imagem em vez de um botão submit padrão, como na tag:

<input type="image" src="image.gif" name="foo" />
Quando o usu√°rio clica em qualquer lugar na imagem, o formul√°rio que o acompanha ser√° transmitido para o servidor com duas vari√°veis adicionais: foo.x e foo.y.

Porque foo.x e foo.y faria nome de variáveis inválidas no PHP, elas são automaticamente convertidas para foo_x e foo_y. Ou seja, os periodos são substituidos por sublinhados. Então, você teria acesso a essas variáveis como qualquer outro descrito na seção sobre como recuperar variáveis de fontes externas. Por exemplo, $_GET['foo_x'].

Nota:

Os espaços nos nomes das variáveis requisitadas são convertidas para sublinhado.

Como eu crio arrays em um HTML <form>?

Para obter o resultado do seu <form> enviado como um array para seu script PHP você nomeia os elementos <input>, <select> ou <textarea> como estes:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
Observe os colchetes após o nome da variável, é isso que torna uma variável um array. Você pode agrupar os elementos dentro de diferentes arrays, atribuindo o mesmo nome a diferentes elementos:
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />
Isso poduz dois arrays, MyArray e MyOtherArray, que serão enviados para o script PHP. Também é possível atribuir chaves específicas para seus arrays:
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
O array AnotherArray ira conter agora as chaves 0, 1, email e phone.

Nota:

Especificar uma chave de array é opcional no HTML. Se você não especificar as chves, o array preenche na ordem em que os elementos aparecem no formulário. Nosso primeiro exemplo ira conter as chaves 0, 1, 2 e 3.

Veja tamb√©m: Fun√ß√Ķes de Array e Vari√°veis de fontes Externas.

Como eu fa√ßo para obeter os resultados de uma m√ļltipla sele√ß√£o de uma tag HTML?

A sele√ß√£o de multiplas tags em uma constru√ß√£o HTML permite os usu√°rios selecionar multiplos itens de uma lista. Esses itens s√£o ent√£o passados ao manipilador de a√ß√Ķes para o formul√°rio. O problema √© que eles s√£o todos passados com o mesmo nome widget. I.e.

<select name="var" multiple="yes">
Cada op√ß√£o selecionada chegar√° ao manipulador de a√ß√Ķes como:
var=option1
var=option2
var=option3
      
Cada op√ß√£o ir√° substituir o conte√ļdo da vari√°vel anterior $var. A solu√ß√£o √© usar a caracteristica "array de elementos do formul√°rio" do PHP. A seguir devem ser usados:
<select name="var[]" multiple="yes">
Isso diz ao PHP para tratar $var como um array e cada atribui√ß√£o de um valor para [var] acrescenta um item ao array. O primeiro item se torna $var[0], o pr√≥ximo $var[1], etc. A fun√ß√£o count() pode ser chamado para determinar quantas op√ß√Ķes foram selecionadas, e a fun√ß√£o sort() pode ser usada para classificar o array de op√ß√Ķes se necess√°rio.

Note que se você esta usando JavaScript o [] no nome do elemento pode lhe causar problemas quando você tenta se referir ao elemento pelo nome. Ao invés use o ID numérico do elemento do formulário, ou coloque o nome da variável entre aspas simples e use isso como um índice para os elementos do array, por exemplo:

variable = documents.forms[0].elements['var[]'];
      

Como eu posso passar uma vari√°vel do Javascript para o PHP?

Uma vez que o Javascript é (normalmente) uma tecnologia da parte do cliente, e o PHP é (normalmente) uma tecnologia da parte do servidor, e uma vez que o HTTP é um protocolo "sem lado", as duas linguagens não podem compartilhar variáveis diretamente.

√Č , no entanto, poss√≠vel passar vari√°veis entre as duas. Uma maneira de realizar isso √© gerar um c√≥digo Javascript com PHP, e ter um navegador que se atualize, passando vari√°veis especificas de volta para o script PHP. O exemplo abaixo mostra precisamente como fazer isso -- isso permite ao c√≥digo PHP capturar a altura e largura da tela, algo que normalmente s√≥ √© poss√≠vel no lado do cliente.

Exemplo #4 Gerando Javascript com PHP

<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
  
// output the geometry variables
  
echo "Screen width is: "$_GET['width'] ."<br />\n";
  echo 
"Screen height is: "$_GET['height'] ."<br />\n";
} else {
  
// pass the geometry variables
  // (preserve the original query string
  //   -- post variables will need to handled differently)

  
echo "<script language='javascript'>\n";
  echo 
"  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            
"&width=\" + screen.width + \"&height=\" + screen.height;\n";
  echo 
"</script>\n";
  exit();
}
?>