Como fazer para não perder os dados nos campos do formulário quando ocorrer um erro ?

            <?php
            if (isset($msg)) {
                if ($msg) {
                    echo Util::msgSucessoOperacao();
                } else {
                    echo Util::msgErroOperacao();
                    echo "<script>history.php.back(); alert('Preencha seu nome.');</script>";
                }
            }
            ?>

Descobri que utilizando session você consegue guardar os dados anteriores. O que vocês acham da solução ? Pode ser uma solução ruim em questão de desempenho já que se trata de um sistema ERP ? É uma má ideia criar todos os campos de todos os formulários com session ? ou vocês acham melhor o sistema deixar perder os dados se houver um erro (o usuário digita tudo novamente) ?

Na minha opinião, guardar dados de formulário na sessão é uma péssima idéia…

Uma dica, é deixar variáveis que serão encarregadas de representar os campos do form:

$temErro = false;
$nome = '';
$endereco = '';
$telefone = '';
// ...

E já no form deixar os valores definidos com essas variáveis…

<input type="text" name="nome" value="<?=$nome?>">
<input type="text" name="endereco" value="<?=$endereco?>">
<input type="text" name="telefone" value="<?=$telefone?>">

Dessa forma funciona bem se você mandar o submit para a mesma página, assim logo abaixo da declaração das variáveis lá em cima, pode fazer um teste de post por exemplo:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $nome = filter_input(INPUT_POST, 'nome');
    $endereco = filter_input(INPUT_POST, 'endereco');
    $telefone = filter_input(INPUT_POST, 'telefone');

    // ... validações, inserts, updates, etc...
}

Perceba a variável $temErro pode te ajudar a exibir a mensagem de erro caso dê algum problema, etc e com vantagem de você não ter perdido os dados do form, pois estarão armazenados nas outras variáveis e já descarregados no form novamente… bom é por ai o caminho, espero ter ajudado.

Normalmente, eu trabalho de uma forma similar a seguinte

No meu form, os names dos campos são índices de um array:

<input type="text" name="form[nome]" value=<?=$form['nome'];?>
<input type="text" name="form[endereco]" value=<?=$form['endereco'];?>
<input type="text" name="form[telefone]" value=<?=$form['telefone'];?>

No arquivo PHP eu recupero os dados do form assim:

<?php
    $form = $_POST['form']; // é o array formado pelos names no HTML

   // ... validações
    if ($tudo_ok) {
          include_once 'pagina_ok.php';
    } else {
          include_once 'pagina_form.php';
   }

Lembrando que quando carregar a página do formulário da primeira vez, a variável $form deverá ser criada vazia, apenas com as chaves necessárias ou com valor padrão. Se não dá errro.

<?php $form = array( 'nome' => '', 'endereco' => '', 'telefone' => '');?>

Quando você faz um include, require e etc, as variáveis daquele escopo ficam disponíveis para esta página adicionada, assim quando a variável $form preenchida com o POST conterá os dados do usuário quando ele fez o submit, e você não perde os dados.

Além disso você pode criar uma variável $erros encontrados e passar para a página (view) apresentar da melhor forma e evitar os echo no meio da validação

Gostei dessa alternativa, vou tentar aqui depois posto.