Pegando dados do Array $_GET dinamicamente
Primeiramente iremos montar um formulário simples em HTML para haver daonde retirar os dados da URL.
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:
Ao pressionarmos o botão 'enviar', seremos enviados à página 'resultado.php', nesta é que está todo o esquema que quero mostrar-lhes.
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:
Em tempo de execução é o mesmo que:
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!
<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!
ok gostei do $$chave acho que tem muita utilidade, obrigado por apresentar esta funcionalidade para nos
14/02/2006 7:26am
(~19 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 $
NA verdade eh
$sql= "INSERT INTO 'tabela_DB' ('nome_db', 'mail_db') VALUES ('$nome', '$mail')";
Botei & no lugar de $
13/02/2006 9:13am
(~19 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!
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
(~19 anos atrás)
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...
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
(~19 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!
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
(~19 anos atrás)
Vai ajudar muito no projeto que estou desenvolvendo! Muito obrigado!
10/01/2006 10:56am
(~19 anos atrás)
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?
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
(~19 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
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
(~19 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
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
(~19 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
(~19 anos atrás)