PHP Conference Nagoya 2025

Variáveis de fontes externas

Formulários HTML (GET e POST)

Quando um formulário é submetido para um script PHP, a informação deste formulário estará automaticamente disponível para o script. Há algumas maneiras de acessar estas informações, por exemplo:

Exemplo #1 Um formulário HTML simples

<form action="foo.php" method="post">
    Nome:  <input type="text" name="username" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Me aperte!" />
</form>

Existem apenas duas formas de acessar dados de formulários HTML. Os métodos disponíveis atualmente são listadas a seguir:

Exemplo #2 Acessando dados de um formulário HTML via POST

<?php
echo $_POST['username'];
echo
$_REQUEST['username'];
?>

Utilizar um formulário GET é similar, exceto que será utilizada a variável predefinida GET em seu lugar. GET também se aplica à variável QUERY_STRING (a informação depois do '?' numa URL). Então, por exemplo, http://www.example.com/test.php?id=3 contém os dados GET que estarão acessíveis com $_GET['id']. Veja também $_REQUEST.

Nota:

Pontos e espaços em nomes de variáveis são convertidos para sublinhados. Por exemplo <input name="a.b" /> se tornará $_REQUEST["a_b"].

O PHP também entende arrays no contexto de variáveis de formulário (veja essa FAQ). Pode-se, por exemplo, agrupar variáveis relacionadas, ou utilizar este recurso para obter valores de uma entrada de seleção múltipla. No exemplo abaixo, o formulário é enviado para si mesmo, e depois de submetido, os dados são mostrados:

Exemplo #3 Variáveis de formulários mais complexos

<?php
if ($_POST) {
echo
'<pre>';
echo
htmlspecialchars(print_r($_POST, true));
echo
'</pre>';
}
?>
<form action="" method="post">
Nome: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Cerveja: <br />
<select multiple name="beer[]">
<option value="heineken">Heineken</option>
<option value="stella">Stella Artois</option>
<option value="av42">Double Rye Ipa</option>
</select><br />
<input type="submit" value="Enviar dados!" />
</form>

Nota: Se um nome de variável externa se parece com sintaxe de array válida, as letras finais são silenciosamente ignoradas. Por exemplo, <input name="foo[bar]baz"> se torna $_REQUEST['foo']['bar'].

Nomes de variáveis SUBMIT IMAGE

Ao submeter um formulário, é possível utilizar imagens em vez do botão de submissão padrão com uma tag do tipo:

<input type="image" src="image.gif" name="sub" />

Quando o usuário clicar em algum lugar da imagem, o formulário será transmitido para o servidor com duas variáveis adicionais, sub_x and sub_y. Elas contém as coordenadas do clique do usuário na imagem. Os mais experientes percebem que os nomes reais dessas variáveis enviadas ao navegador contêm um ponto ao invés de um sublinhado, mas o PHP converte o ponto para um sublinhado automaticamente.

Cookies HTTP

O PHP suporta transparentemente cookies HTTP como os definidos pela » RFC 6265. Cookies são um mecanismo o armazenamento de dados no navegador, rastreando e identificando o retorno de usuários. Você pode definir cookies com a função setcookie(). Cookies são parte do cabeçalho HTTP, então a função SetCookie precisa ser chamada antes de qualquer saída ser enviada ao navegador. Esta é a mesma restrição da função header(). Dados de cookies estão disponíveis nos arrays de dados de cookies apropriados, como $_COOKIE e também em $_REQUEST. Veja o manual de setcookie() para mais detalhes e exemplos.

Nota: A partir dos PHP 7.2.34, 7.3.23 e 7.4.11, respectivamente, os nomes dos cookies recebidos não são decodificados (a partir do formato URL) por razões de segurança.

Se a intenção for atribuir vários valores a uma única variável do cookie, deve-se atribuí-la como um array:

<?php
setcookie
("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>

Isso criará dois cookies separados embora MyCookie será agora um único array no script. Se a intenção for definir apenas um cookie com vários valores, pode-se utilizar serialize() ou explode() nos valores primeiro.

Note que um cookie substituirá um anterior com o mesmo nome no navegador, a menos que o caminho ou o domínio seja diferente. Portanto, para uma aplicação de carrinho de compras, pode-se manter um contador e repassá-lo:

Exemplo #4 Um exemplo de setcookie()

<?php
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

Pontos em nomes de variáveis recebidas

Normalmente o PHP não altera o nome de variáveis quando elas são passadas para um script. Entretanto, deve ser notado que o ponto (ponto final) não é um caractere válido em nome de variável do PHP. Para ilustrar o motivo, veja o seguinte exemplo:

<?php
$varname
.ext; /* nome de variável inválido */
?>
Dessa forma, o interpretador entende isso como uma variável com nome de $varname, seguida do operador de concatenação de strings, seguida de uma string crua (uma string não delimitada que não bate com nenhuma palavra-chave ou reservada) 'ext'. Obviamente, isso não tem os resultados pretendidos.

Nessa situação, é importante notar que o PHP substituirá automaticamente qualquer ponto nos nomes de variáveis recebidas por sublinhados.

Determinando o tipo das variáveis

Como o PHP determina os tipos de variáveis e faz conversões (geralmente) quando necessário, nem sempre é óbvio o tipo de uma variável em cada momento. O PHP inclui várias funções que permitem determinar qual o tipo de uma variável, por exemplo: gettype(), is_array(), is_float(), is_int(), is_object(),e is_string(). Veja também o capítulo sobre Tipos.

Pelo fato do HTTP ser um protocolo de texto, a maioria, se não todo o conteúdo presente nos arrays superglobais como $_POST e $_GET permanecerão como strings. O PHP não tentará converter valores para um tipo específico. No exemplo abaixo, $_GET["var1"] conterá a string "null" e $_GET["var2"] conterá a string "123".

/index.php?var1=null&var2=123

Registro de Alterações

Versão Descrição
7.2.34, 7.3.23, 7.4.11 Os nomes dos cookies recebidos não são mais decodificados (a partir do formato URL) por razões de segurança.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
22
Anonymous
16 years ago
The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP irreversibly modifies field names containing these characters in an attempt to maintain compatibility with the deprecated register_globals feature.
up
4
krydprz at iit dot edu
19 years ago
This post is with regards to handling forms that have more than one submit button.

Suppose we have an HTML form with a submit button specified like this:

<input type="submit" value="Delete" name="action_button">

Normally the 'value' attribute of the HTML 'input' tag (in this case "Delete") that creates the submit button can be accessed in PHP after post like this:

<?php
$_POST
['action_button'];
?>

We of course use the 'name' of the button as an index into the $_POST array.

This works fine, except when we want to pass more information with the click of this particular button.

Imagine a scenario where you're dealing with user management in some administrative interface. You are presented with a list of user names queried from a database and wish to add a "Delete" and "Modify" button next to each of the names in the list. Naturally the 'value' of our buttons in the HTML form that we want to display will be "Delete" and "Modify" since that's what we want to appear on the buttons' faceplates.

Both buttons (Modify and Delete) will be named "action_button" since that's what we want to index the $_POST array with. In other words, the 'name' of the buttons along cannot carry any uniquely identifying information if we want to process them systematically after submit. Since these buttons will exist for every user in the list, we need some further way to distinguish them, so that we know for which user one of the buttons has been pressed.

Using arrays is the way to go. Assuming that we know the unique numerical identifier of each user, such as their primary key from the database, and we DON'T wish to protect that number from the public, we can make the 'action_button' into an array and use the user's unique numerical identifier as a key in this array.

Our HTML code to display the buttons will become:

<input type="submit" value="Delete" name="action_button[0000000002]">
<input type="submit" value="Modify" name="action_button[0000000002]">

The 0000000002 is of course the unique numerical identifier for this particular user.

Then when we handle this form in PHP we need to do the following to extract both the 'value' of the button ("Delete" or "Modify") and the unique numerical identifier of the user we wish to affect (0000000002 in this case). The following will print either "Modify" or "Delete", as well as the unique number of the user:

<?php
$submitted_array
= array_keys($_POST['action_button']);
echo (
$_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]);
?>

$submitted_array[0] carries the 0000000002.
When we index that into the $_POST['action_button'], like we did above, we will extract the string that was used as 'value' in the HTML code 'input' tag that created this button.

If we wish to protect the unique numerical identifier, we must use some other uniquely identifying attribute of each user. Possibly that attribute should be encrypted when output into the form for greater security.

Enjoy!
To Top