Verificando se algum parâmetro foi passado via GET para uma página PHP sem precisar testar um a um
Dica publicada em PHP / Metodologias
Verificando se algum parâmetro foi passado via GET para uma página PHP sem precisar testar um a um
É uma situação bem comum. Digamos que você tenha uma página, uma pesquisa por exemplo, para a qual você passa uma lista variável de parâmetros. Basicamente então, supomos que tenhamos passado uma lista de parâmetros semelhante a esta:
/pesquisa.php?empresa=1&departamento=2&inicial=A
Hipoteticamente com base nestes parâmetros selecionaríamos todos os funcionários da empresa 1, do departamento 2, cujo nome começa com a letra A, num sql que seria mais ou menos assim:
Ok, baseado no exemplo acima, vemos que o parâmetro empresa é sempre obrigatório, e que se todos os demais parâmetros necessários foram passados, então podemos fazer a pesquisa normalmente. Caso um ou outro parâmetro não seja informado nós simplesmente não incluímos ele na cláusula WHERE do SQL, mas se o empresa não for passado logicamente teremos um erro na query.
Tudo bem que o exemplo aqui traz um número pequeno de parâmetros, então é fácil fazer esta verificação um a um, e prosseguindo, caso o usuário não informe nenhum parâmetro nós não realizamos a pesquisa e retornamos para o usuário uma mensagem do tipo "Por favor, informe algum parâmetro para a pesquisa!". Como eu disse, poderíamos fazer isso assim:
Com poucos parâmetros tudo bem, mas imaginemos que tenhamos uma lista de uns 15 parâmetros possíveis, mas nenhum deles foi passado - ficaria uma linha enorme depois do if. Porém existe um jeito melhor de fazer isso, o PHP tem um método que verifica se qualquer coisa foi passada via GET, que seja uma única letra, quer seja toda uma grande lista de parâmetros, assim faríamos:
Pronto, fica bem mais legível, e bem mais fácil de fazer.
/pesquisa.php?empresa=1&departamento=2&inicial=A
Hipoteticamente com base nestes parâmetros selecionaríamos todos os funcionários da empresa 1, do departamento 2, cujo nome começa com a letra A, num sql que seria mais ou menos assim:
$sql = "SELECT * FROM funcionarios";
if (!empty($_GET['empresa'])) $sql .= " WHERE empresa = ".$_GET['empresa'];
if (!empty($_GET['departamento'])) $sql .= " AND departamento = ".$_GET['departamento'];
if (!empty($_GET['inicial'])) $sql .= " AND nome LIKE '".$_GET['inicial']."%'";
if (!empty($_GET['empresa'])) $sql .= " WHERE empresa = ".$_GET['empresa'];
if (!empty($_GET['departamento'])) $sql .= " AND departamento = ".$_GET['departamento'];
if (!empty($_GET['inicial'])) $sql .= " AND nome LIKE '".$_GET['inicial']."%'";
Ok, baseado no exemplo acima, vemos que o parâmetro empresa é sempre obrigatório, e que se todos os demais parâmetros necessários foram passados, então podemos fazer a pesquisa normalmente. Caso um ou outro parâmetro não seja informado nós simplesmente não incluímos ele na cláusula WHERE do SQL, mas se o empresa não for passado logicamente teremos um erro na query.
Tudo bem que o exemplo aqui traz um número pequeno de parâmetros, então é fácil fazer esta verificação um a um, e prosseguindo, caso o usuário não informe nenhum parâmetro nós não realizamos a pesquisa e retornamos para o usuário uma mensagem do tipo "Por favor, informe algum parâmetro para a pesquisa!". Como eu disse, poderíamos fazer isso assim:
if ((empty($_GET['empresa'])) && (empty($_GET['departamento'])) && (empty($_GET['inicial'])))
{
echo "Por favor, informe algum parâmetro para a pesquisa!";
}
else
{
//Faz a pesquisa normalmente [...]
}
{
echo "Por favor, informe algum parâmetro para a pesquisa!";
}
else
{
//Faz a pesquisa normalmente [...]
}
Com poucos parâmetros tudo bem, mas imaginemos que tenhamos uma lista de uns 15 parâmetros possíveis, mas nenhum deles foi passado - ficaria uma linha enorme depois do if. Porém existe um jeito melhor de fazer isso, o PHP tem um método que verifica se qualquer coisa foi passada via GET, que seja uma única letra, quer seja toda uma grande lista de parâmetros, assim faríamos:
if (empty($_SERVER['QUERY_STRING']))
{
echo "Por favor, informe algum parâmetro para a pesquisa!";
}
else
{
//Faz a pesquisa normalmente [...]
}
{
echo "Por favor, informe algum parâmetro para a pesquisa!";
}
else
{
//Faz a pesquisa normalmente [...]
}
Pronto, fica bem mais legível, e bem mais fácil de fazer.
Original no meu blog: http://pedro-araujo.com/go?100716085808
Porém hoje em dia o padrão é trabalhar com um arquivo principal (index.php) que contém parametros passados por $_GET, para redirecionar e chamar as classes desejadas. O pessoal tem chamado isto comumente de roteamento.
Digamos que tenhamos,
./index.php
./autoload.php
./src/control
./src/control/PesquisaController.class.php
./src/model/
./src/model/Funcionarios.class.php
./src/view
então passamos por get o seguinte
?control=pesquisa&act=funcionario (com url_rewrite ficaria assim: site/pesquisa/funcionario)
através de eval ou Reflection ou algum metodo gambiarristico do PHP, chamamos as classes e metodos desejados.
Então a chave querystring do $_SERVER fica com alguns parametros.
Pensando agora nisto, acho que seria interessante fazer algo assim.
(NÃO TESTEI O CÓDIGO)
class DataInput{
public static function testaGet($parametrosDesejados){
foreach($_GET as $key => $value){
if(in_array($key, $parametrosDesejados))
if($value != null && $value != ''){
return true;
}
}
return false;
}
........
}
$parametrosDaBusca = array('empresa', 'departamento', 'inicial');
if ( ! DataInput::testaGet($parametrosDaBusca))
{
echo "Por favor, informe algum parâmetro para a pesquisa!";
}
else
{
//Faz a pesquisa normalmente [...]
}