+1

Pegando dados do Array $_GET dinamicamente

criado por Klaus P. Laube em 21/12/2005 6:48am
Primeiramente iremos montar um formulário simples em HTML para haver daonde retirar os dados da URL.

<html>
    <head><title>Form Exemplo</title></head>
    <body>
        <form name="form" action="resultado.php" method="get">
        <input type="hidden" name="acao" value="validar">
         Nome: <input type="text" name="nome" maxlength="50" value="" >
         <br><br>
         E-mail: <input type="text" name="email" maxlength="50" value="" >
         <br><br>
         <input type="submit" name="submit" value="enviar"> 
         </form>
    </body>
</html>

Os valores deste formulário serão passados pelo método GET(valores através da URL) para a página 'resultado.php'. Simularemos o preenchimento dos dados com os seguintes valores:

Campo nome = João Da Silva
Campo email = jdasilva@provedor.com.br

Ao pressionarmos o botão 'enviar', seremos enviados à página 'resultado.php', nesta é que está todo o esquema que quero mostrar-lhes.

<?php
$msg = '';

// Verificamos se foi feito o preenchimento pelo formulário 
if (isset($_GET['acao']) && $_GET['acao'] == 'validar') {  
    // Aqui damos um foreach no array $_GET  
    foreach($_GET as $chave=>$valor) {
        $$chave = $valor;  
    }

    if ($nome == '') {
        $msg = 'Campo Nome não foi preenchido';
    } 
    if ($email == '') {
        $msg = 'Campo E-mail não foi preenchido';
    }
  } else {
      // Se não foi feito o preenchimento voltamos à página formulario.php  
      header('Location: formulario.php');
  }
?>
<html>
    <head><title>Form Exemplo 2</title></head>
    <body>
    <?php
    // Se foram preenchidos todos os campos
    if ($msg == '') {
        echo "Olá $nome, seu e-mail é $email!";
    } else { 
        // Senão mostra que campo não foi preenchido
        echo $msg;
    }
    ?>
    </body>
</html>

Simples não?
Se você não entendeu aonde ocorreu a atribuição dos valores "dinamicamente" do array $_GET para variáveis do PHP, simples:
No momento em que damos o foreach no array $_GET percorremos todos os índices de $_GET (acao,nome,email) chamando-os de $chave, e também todos os valores (validar,João da Silva,jdasilva@provedor.com.br) chamando-os de $valor. Durante este foreach dizemos que:

$$chave = $valor

Em tempo de execução é o mesmo que:

$acao = validar
$nome = João da Silva
$email = jsdasilva@provedor.com.br

Quando utilizamos um '$' na frente de uma variável, transformamos o valor daquela variável em um outra variável. Tornando-a em outra variável, damos a ela o valor que aquele índice tinha no array $_GET.

Se você têm problemas em entender os fundamentos de "array" ou do "foreach" no PHP, entre em contato (klaus@onspot.com.br) que terei prazer em lhe auxiliar.

Obrigado, e até a próxima!

Comentários:

Mostrando 1 - 10 de 28 comentários
ok gostei do $$chave acho que tem muita utilidade, obrigado por apresentar esta funcionalidade para nos
14/02/2006 7:26am (~10 anos atrás)

&sql= "INSERT INTO 'tabela_DB' ('nome_db', 'mail_db') VALUES ('$nome', '$mail')";


NA verdade eh
$sql= "INSERT INTO 'tabela_DB' ('nome_db', 'mail_db') VALUES ('$nome', '$mail')";

Botei & no lugar de $
13/02/2006 9:13am (~10 anos atrás)

queria saber se depois que fazer essa verificaçao(Se digitou tudo pedido) Tem como enviar ao banco de dados?

Pelo que imaginei seria mais ou menos assim(Seguindo a sequencia do Klaus)

1º Formulario
2ºresultado.php
3° aki q eu acho q seria (no caso eu usaria $_POST)


<html>
<head><title>Form Exemplo 2</title></head>
<body>
<?php
$nome=$_POST['nome'];
$mail-$_POST['email'];
// Se foram preenchidos todos os campos
if ($msg == '') {
&sql= "INSERT INTO 'tabela_DB' ('nome_db', 'mail_db') VALUES ('$nome', '$mail')";
} else {
// Senão mostra que campo não foi preenchido
echo $msg;
}
?>
</body>
</html>


Eh isso mesmo ou estou enganado?(nao tentei ainda xD) Se tiver enganado alguem me ajuda ae!

13/02/2006 9:11am (~10 anos atrás)

Felipe Lopes disse:
Talvez até mais fácil seria:

extract($_GET); // ou extract($_POST); em caso de usar method="post"

Uma forma de "resolver" a questão do register_globals seria usando o seguinte código no topo de cada página:

extract($_REQUEST);

Observem que a utilização de $_POST, $_GET,... é extremamente recomendada por questões de segurança...
12/01/2006 6:02am (~11 anos atrás)

Olá,

Devido à discussão aqui eu resolvi fazer um post sobre um pouco de cada:

Sobre a segurança dessa função. Ela faz exatamente o que o register_globals = on faz... então é óbvio que tem os mesmos problema de segurança como por ex. no seu script vc faz um teste se:

if( $login == true ) {

};

seuscript.php?login=true vai ser um problema serio de segurança. Assim como no register globals vc pode (e DEVE) tratar a variavel no momento antes de usála:

$login = $_SESSION['login'];
if($login == true) {

};

Claro que é um exemplo mas o que eu quero dizer é que assim como no register globals você precisa tratar a variável antes de usa-la em casos importantes. Dados como nome, telefone etc... (inputs do visitante) nao precisam ser tratados por motivos obvios, onde entra a utilidade desse script acima.

Uma outra solução eficaz é tratar suas variaveis de campo como array:

<input name="formulario[nome]" type="text" />

assim substitui no foreach $_GET por $_GET['formulario'] assim eliminando o problema de segurança.

Quanto à redundância, é ridiculo falar disso, é claro que é necessário fazer a chamada do valor por razões óbvias então quando $nome = $_GET['nome']; não é redundância e sim um controle de que o valor certo será utilizado naquela variável.

No caso do exemplo acima de CASE, cai no mesmo problema de ter que atribuir valores entao fica melhor utlizar $nome = $_GET['nome']; do que utlizar o CASE que aí sim é mais trabalho, mais consumo de desempenho e mais "redundancia" hehehe :)

Acho que é só!!

Abraço!

12/01/2006 4:48am (~11 anos atrás)

Vai ajudar muito no projeto que estou desenvolvendo! Muito obrigado!
10/01/2006 10:56am (~11 anos atrás)

Gregory disse:
Uma pergunta. Porque nao usar o array _GET diretamente?
Eu quero dizer, pra que sair atribuindo ele a variaveis?
Nao seria menos redundante fazer algo do genero:
foreach($_GET as $chave=>$valor) {
switch($chave){
case "nome":...
case "email":...
default:....
}
}
Assim vc evita criar um monte de variaveis desnecessariamente e deixa tudo mais facil de organizar.
Nao seria mais logico?
09/01/2006 8:13am (~11 anos atrás)

temos funções melhores para se fazer isso... como a import_request_variables('g', 'prefixo_');
além do mais eu prefiro mesmo é pegar cada variável...
$nome = $_POST['nome'] e assim com todas as variáveis... depois se pode ir usando outras funções agragadas como trim, e funções para tirar formatações de php ou html... realmente o script fica mais claro e organizado...

vlw... abraço...

PS.: concordo com o Fabyo Guimaraes Oliveira
08/01/2006 2:02pm (~11 anos atrás)

Muito fraco esse artigo e ainda mais usando GET

e gente esqueça register_globals ele morreu em off e acabou e no php6 nem vai dar pra deixar em on "ainda bem", mas tem gente que nao se atualiza fica sempre na mesma nunca se preoculpa com segurança
03/01/2006 10:43am (~11 anos atrás)

Eu também acho que não é seguro pegar os dados com register_globals = on, por causa dessa historia do pessoal que entende poder mexer nos parâmetros que são passados por GET. Inclusive comprei um livro há dois meses que utiliza register_globals = on em todos os exemplos, e tive que adaptar todos por causa disso (estava baseado no PHP versão 4 e eu tenho instalada a versão 5).
28/12/2005 3:24pm (~11 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)