Não há maneira melhor, mas como é uma operação que você costuma fazer com bastante frequência, é melhor automatizar o processo.
A maioria das estruturas oferece uma maneira de tornar os argumentos de análise uma tarefa fácil. Você pode criar seu próprio objeto para isso. Exemplo rápido e sujo:
class Request
{
// This is the spirit but you may want to make that cleaner :-)
function get($key, $default=null, $from=null)
{
if ($from) :
if (isset(${'_'.$from}[$key]));
return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
else
if isset($_REQUEST[$key])
return sanitize($_REQUEST[$key]);
return $default;
}
// basics. Enforce it with filters according to your needs
function sanitize($data)
{
return addslashes(trim($data));
}
// your rules here
function isEmptyString($data)
{
return (trim($data) === "" or $data === null);
}
function exists($key) {}
function setFlash($name, $value) {}
[...]
}
$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);
Symfony usa esse tipo de açúcar em massa.
Mas você está falando mais do que isso, com o seu "// Manipular erro aqui". Você está misturando 2 trabalhos: obtendo e processando os dados. Isto não é o mesmo.
Existem outros mecanismos que você pode usar para validar dados. Novamente, os frameworks podem mostrar as melhores práticas.
Crie objetos que representam os dados do seu formulário, anexe processos e volte a ele. Parece muito mais trabalho do que invadir um script PHP rápido (e é a primeira vez), mas é reutilizável, flexível e muito menos suscetível a erros, pois a validação de formulários com o PHP comum tende a se tornar rapidamente um código espaguete.