Ir ao conteúdo
  • Cadastre-se

PHP Impedir que a página atualize o form


Ir à solução Resolvido por David Martinho,

Posts recomendados

Bom Dia

Tenho o seguinte problema, eu tenho um formulário que ao dar Submit passa para outra página e eu queria que ao retornar para o formulário, os dados continuassem escritos nos inputs, para o utilizador não ter de escrever tudo de novo caso deia algum erro.

Será que existe alguma maneira de a página ficar com os dados nos inputs mesmo indo para outra página.

 

Exemplo de inserção de dados no form:

imagem.thumb.png.fd8503967957309a83613ad99118a960.png

Exemplo de erro ao dar Submit:

 

imagem.png.639d66981170b1f17756c61b791a86c6.png 

E ao dar esse erro e ao clicar no link eu queria que aparecesse os dados que tem na 1º imagem, coisa que não acontece porque o formulário fica vazio.

 

Link para o comentário
Compartilhar em outros sites

Geralmente quando você envia via POST ou seja 

<form method='POST' action='index.php'>

Esses dados vão continuar na url, ai você só precisa pegar eles novamente, "luiz, como farei isso?". Relaxa, existe uma coisa chamada operador ternário / null coalesce . Ele verifica de uma variável existe e se sim ele imprime. Vamos lá:

//Se houver submitado ele printa no html e se não ele só printa o html vazio
//Esse é um exemplo com o null coalesce

<form action="index.php" method="post">
 <p>Your name: <input type="text" name="name" value='<?= ($_POST['name'] ?? null); ?>' /></p>
 <p>Your age: <input type="text" name="age" value='<?=($_POST['age'] ?? null); ?>' /></p>
 <p><input type="submit" /></p>
</form>

//Esse é um exemplo com o ternário

<form action="index.php" method="post">
 <p>Your name: <input type="text" name="name" value='<?= (!empty($_POST['name']) ? $_POST['name'] : null); ?>' /></p>
 <p>Your age: <input type="text" name="age" value='<?= (!empty($_POST['age']) ? $_POST['age'] : null); ?>' /></p>
 <p><input type="submit" /></p>
</form>

// ternário simplificado

<form action="index.php" method="post">
 <p>Your name: <input type="text" name="name" value='<?= ($_POST['name'] ?: null); ?>' /></p>
 <p>Your age: <input type="text" name="age" value='<?= ($_POST['age'] ?: null); ?>' /></p>
 <p><input type="submit" /></p>
</form>

 

@David Martinho

Null coalesce PHP 7.1 +

Ternário PHP 5.6+

 

Se ajudei marque como resolvido

Link para o comentário
Compartilhar em outros sites

@Luiz Paulo Escobar

 

Oi, antes de mais obrigado pela ajuda.

 

Eu coloquei isso nos meus inputs, mas agora aparece um erro:

imagem.thumb.png.f113340a479ff5f8f88a47721f7600cb.png

 

O erro é o seguinte:

 

<br /><b>Notice</b>:  Undefined index: T_Referência in <b>C:\xampp\htdocs\Moviblock\FormAS11.php</b> on line <b>54</b><br />

 

Eu vou enviar o código para você, será que eu preciso colocar alguma coisa no php do submit. (Eu tenho um para o form e outro para realizar a ação de inserir após clicar no submit)

 

CÓDIGO DO FORM:

<?php
session_start();
if(!$_SESSION['utilizador']) {
	header('Location: index.php');
	exit();
}
?>
<!DOCTYPE html>
<html>
<title>Inserir Material - AS11</title>
<head>
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="styleFormASXX.css">
	<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <h1><p>Inserir Material - AS11</h1>
    <body>	
    <form method="POST"
action="InsereAS11.php">
<table>
<tr>
<td align="center"><b>Localização:</td>
<td><select class="combo" size=1 name="T_Localização">
                    <option value=""></option>
                    <option value="AS11-01-01">AS11-01-01</option>
                    <option value="AS11-01-02">AS11-01-02</option>
                    <option value="AS11-01-03">AS11-01-03</option>
                    <option value="AS11-01-04">AS11-01-04</option>
                    <option value="AS11-01-05">AS11-01-05</option>
                    <option value="AS11-02-01">AS11-02-01</option>
                    <option value="AS11-02-02">AS11-02-02</option>
                    <option value="AS11-02-03">AS11-02-03</option>
                    <option value="AS11-02-04">AS11-02-04</option>
                    <option value="AS11-02-05">AS11-02-05</option>
                    <option value="AS11-03-01">AS11-03-01</option>
                    <option value="AS11-03-02">AS11-03-02</option>
                    <option value="AS11-03-03">AS11-03-03</option>
                    <option value="AS11-03-04">AS11-03-04</option>
                    <option value="AS11-03-05">AS11-03-05</option>
                    <option value="AS11-04-01">AS11-04-01</option>
                    <option value="AS11-04-02">AS11-04-02</option>
                    <option value="AS11-04-03">AS11-04-03</option>
                    <option value="AS11-04-04">AS11-04-04</option>
                    <option value="AS11-04-05">AS11-04-05</option>
                    <option value="AS11-05-01">AS11-05-01</option>
                    <option value="AS11-05-02">AS11-05-02</option>
                    <option value="AS11-05-03">AS11-05-03</option>
                    <option value="AS11-05-04">AS11-05-04</option>    
                    <option value="AS11-05-05">AS11-05-05</option>                  
                </select><br></td>
 </tr>
 <tr>

<td><b>Referência:</td>
<td><input class="input" type="text" name="T_Referência" value='<?= ($_POST['T_Referência'] ?: null); ?>' /></td>
 </tr>
 <td><b>Categoria:</td>
<td><input class="input" type="text" name="T_Categoria" value='<?= ($_POST['T_Categoria'] ?: null); ?>' /></td>
 </tr>
 <td><b>Dimensão:</td>
<td><input class="input" type="text" name="T_Dimensão" value='<?= ($_POST['T_Dimensão'] ?: null); ?>' /></td>
 </tr>
 <td><b>Designação:</td>
<td><input class="input" type="text" name="T_Designação" value='<?= ($_POST['T_Designação'] ?: null); ?>' /></td>
 </tr>
 <td><b>Fornecedor:</td>
<td><input class="input" type="text" name="T_Fornecedor" value='<?= ($_POST['T_Fornecedor'] ?: null); ?>' /></td>
 </tr>
 <td><b>Quantidade:</td>
<td><input class="input" type="text" name="T_Quantidade" value='<?= ($_POST['T_Quantidade'] ?: null); ?>' /></td>
 </tr> 
 <td><b>Inventário:</td>
<td><input class="input" type="text" name="T_Inventário" value='<?= ($_POST['T_Inventário'] ?: null); ?>' /></td>
 </tr>
 <td><b>MTN_ID:</td>
<td><input class="input" type="text" name="T_MTN_ID" value='<?= ($_POST['T_MTN_ID'] ?: null); ?>' /></td>
 </tr>
</table>
<br>
            <input type="submit" value="Inserir Material">
			<a href="paginainicial.php">
        <input type="button" value="Voltar atrás">
    </a>

        </form><br>
        <a class="ooo">Para saber a localização correta:</a><a href="esquema armário.png" class="img"> Esquema Excel</a><a class="ooo"> ||</a><a href="armário.jpg" class="img"> Armário Moviblock</a>
    </body>
</html>

 

 

Código do SUBMIT:

<html>
    <title>
        Inserir Material - AS11
    </title>
    <head>
    <link rel="shortcut icon" href="favicon.ico"> 
    </head>
    <body>
<?php

/* Verificar se o formulário foi submetido */
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $Localização = filter_input(INPUT_POST, 'T_Localização');
    $Referência = filter_input(INPUT_POST, 'T_Referência');
	$Categoria = filter_input(INPUT_POST, 'T_Categoria');
    $Dimensão = filter_input(INPUT_POST, 'T_Dimensão');		
	$Designação = filter_input(INPUT_POST, 'T_Designação');	
    $Fornecedor = filter_input(INPUT_POST, 'T_Fornecedor');
    $Quantidade = filter_input(INPUT_POST, 'T_Quantidade');
    $Inventário = filter_input(INPUT_POST, 'T_Inventário');
    $MTN_ID = filter_input(INPUT_POST, 'T_MTN_ID');
    /* validar os dados recebidos do formulario */
    if (empty($Localização) || empty($Referência) || empty($Categoria)|| empty($Dimensão)|| empty($Designação) || empty($Fornecedor) || empty($Quantidade)){		
        echo "Campos do formulário em falta";
        echo '<br> <a href="FormAS11.php"> Voltar ao formulário </a>' ;
        exit();
    }    
}
else{
   echo " Erro, formulário não submetido ";
   exit();
}


/* estabelece a ligação à base de dados */
$ligacao = new mysqli("localhost", "root", "", "moviblock");

/* verifica se ocorreu algum erro na ligação */
if ($ligacao->connect_errno) {
    echo "Falha na ligação: " . $ligacao->connect_error; 
    exit();
}
    
/* texto sql da consulta*/
$consulta = "INSERT INTO AS11 (Localização, Referência, Categoria, Dimensão, Designação, Fornecedor, Quantidade, Inventário, MTN_ID) VALUES ('$Localização', '$Referência', '$Categoria', '$Dimensão', '$Designação', '$Fornecedor', '$Quantidade', '$Inventário', '$MTN_ID')";

/* executar a consulta e testar se ocorreu erro */
if (!$ligacao->query($consulta)) {
    echo " Falha ao executar a consulta: \"$consulta\" <br>" . $ligacao->error;
    $ligacao->close();  /* fechar a ligação */
}
else{
    /* percorrer os registos (linhas) da tabela e mostrar na página */
    echo " Novo registo inserido com sucesso" ;   
    }
$ligacao->close();       /* fechar a ligação */
echo '<br> <a href="FormAS11.php"> Voltar ao formulário </a>' ;
?>
</body>
</html>

 

@Luiz Paulo Escobar O erro dá-se porque o php não tem informações dos dados no input, ou seja, se eu colocar a tabela no php da inserção, ele mostra a tabela com as informações que eu escrevi, agora no php do formulário ele ainda não recebeu nada...

 

Deve haver uma forma de dizer ao programa para passar os dados do submit de volta para o form de maneira que quando o user voltar ao formulário ter lá as informações escritas

Ex: coloquei o código que você me disse no php de inserir

imagem.png.3accd09234acf52d986ac7984832d815.png

Link para o comentário
Compartilhar em outros sites

Olá!
Segue sugestão com separação da lógica e da apresentação, pro sr. entender melhor.
o formulário é submetido via JS sem a necessidade de trocar de página.

Para testar: submeta o formulário sem alterar campo algum.
Depois vá alterando e submetendo de um em um.

Como eu não sei se o sr. está usando jquery, escrevi em vanilla.
Mas o sr. pode conseguir um resultado melhor usando jquery-validation

formAjaxSubmit.zip

Link para o comentário
Compartilhar em outros sites

@David Martinho Assim, o PHP não aceita variáveis com acento.

 

 

Mude o nome da variaveis de T_Inventário para tInventario ou t_inventario por exemplo. Nada de acentos e caracteres especiais.

 

4 horas atrás, Luiz Paulo Escobar disse:
value='<?= (!empty($_POST['name']) ? $_POST['name'] : null); ?>'

Use esse modo aqui que resolve seu caso ok?

 

Verifica se existe, se sim ele imprime o valor 

 

Link para o comentário
Compartilhar em outros sites

  • Solução
Em 12/01/2022 às 20:32, Luiz Paulo Escobar disse:

@David Martinho Assim, o PHP não aceita variáveis com acento.

 

 

Mude o nome da variaveis de T_Inventário para tInventario ou t_inventario por exemplo. Nada de acentos e caracteres especiais.

 

Use esse modo aqui que resolve seu caso ok?

 

Verifica se existe, se sim ele imprime o valor 

 

Obrigado pela ajuda mas acho que não está entendendo, você tá tentando dar um value nos inputs do form, mas no php do form ele ainda não tem valores, os valores são atribuídos pelo utilizador, ou seja...

 

É necessário dar o submit para os valores ficarem guardados, depois no php inserir, se eu quisesse eu conseguiria colocar os valores lá em alguma tabela, porque tenho os valores guardados mas o que eu queria era ao retroceder, no php do form os valores estivessem lá.

 

porque fazendo da forma que você me tá dizendo, eu estou tentando atribuir um valor sem ter escrito nada nos inputs, tentando colocar coisas antes do tempo.

 

O seu código funcionava se o php form viesse depois do de inserir

 

Acho que consegui explicar mais ao menos e obrigado mais uma vez pela sua ajuda

Em 12/01/2022 às 20:32, Luiz Paulo Escobar disse:

@David Martinho Assim, o PHP não aceita variáveis com acento.

 

 

Mude o nome da variaveis de T_Inventário para tInventario ou t_inventario por exemplo. Nada de acentos e caracteres especiais.

 

Use esse modo aqui que resolve seu caso ok?

 

Verifica se existe, se sim ele imprime o valor 

 

 

EDIT: Já consegui resolver;

 

Coloquei isso nos inputs:

value="<?php echo $_SESSION['T_Referência']; ?>"

 

Depois coloquei isso no form inserir:

<?php
session_start();
$_SESSION['T_Localização'] = $_POST['T_Localização'];
$_SESSION['T_Referência'] = $_POST['T_Referência'];
$_SESSION['T_Categoria'] = $_POST['T_Categoria'];
$_SESSION['T_Categoria'] = $_POST['T_Categoria'];
$_SESSION['T_Dimensão'] = $_POST['T_Dimensão'];
$_SESSION['T_Designação'] = $_POST['T_Designação'];
$_SESSION['T_Fornecedor'] = $_POST['T_Fornecedor'];
$_SESSION['T_Quantidade'] = $_POST['T_Quantidade'];
$_SESSION['T_Inventário'] = $_POST['T_Inventário'];
$_SESSION['T_MTN_ID'] = $_POST['T_MTN_ID'];
?>

 

E por fim coloquei isso no php para caso insira o material, limpe o form (só queria manter os dados caso desse erro):

  echo " Novo registo inserido com sucesso" ; 
    $var = '';
    $_SESSION['T_Localização'] = $var;
    $_SESSION['T_Referência'] = $var;
    $_SESSION['T_Categoria'] = $var;
    $_SESSION['T_Dimensão'] = $var;
    $_SESSION['T_Designação'] = $var;
    $_SESSION['T_Fornecedor'] = $var;
    $_SESSION['T_Quantidade'] = $var;
    $_SESSION['T_Inventário'] = $var;
    $_SESSION['T_MTN_ID'] = $var;
    }

 

Obrigado pela sua ajuda e tmj :)

Em 12/01/2022 às 19:07, washalbano disse:

Olá!
Segue sugestão com separação da lógica e da apresentação, pro sr. entender melhor.
o formulário é submetido via JS sem a necessidade de trocar de página.

Para testar: submeta o formulário sem alterar campo algum.
Depois vá alterando e submetendo de um em um.

Como eu não sei se o sr. está usando jquery, escrevi em vanilla.
Mas o sr. pode conseguir um resultado melhor usando jquery-validation

formAjaxSubmit.zip 2 kB · 4 downloads

Obrigado pela sua ajuda

Link para o comentário
Compartilhar em outros sites

@David Martinho Cara, o operador verifica se tem e se não tiver ele n da echo na variavel, da echo em null. Era só você utilizar o operador certo...

15 horas atrás, David Martinho disse:

você tá tentando dar um value nos inputs do form, mas no php do form ele ainda não tem valores

(!empty($_POST['alguma_coisa']) ? $_POST['alguma_coisa'] : null)

Você quem entendeu errado. Isso é operador moderno e muito utilizado nas indústrias . 

15 horas atrás, David Martinho disse:
 echo " Novo registo inserido com sucesso" ; 
    $var = '';
    $_SESSION['T_Localização'] = $var;
    $_SESSION['T_Referência'] = $var;
    $_SESSION['T_Categoria'] = $var;
    $_SESSION['T_Dimensão'] = $var;
    $_SESSION['T_Designação'] = $var;
    $_SESSION['T_Fornecedor'] = $var;
    $_SESSION['T_Quantidade'] = $var;
    $_SESSION['T_Inventário'] = $var;
    $_SESSION['T_MTN_ID'] = $var;
    }

Nunca grave informações que você não vai usar no site todo e gravar durante bastante tempo em sessão, coisas como dados de formulários que são gravados em Banco de Dados são gravados somente na auto-global $_POST ou $_GET e nunca na $_SESSION. Isso é uma super má prática, se você pega um sistema grande e faz isso ai, tu deixa ele lendo pra *****. Então estuda o operador ternário. Você nem testou os 3 q mostrei. Cada um é usado de uma forma diferente. Pega e estuda cada um.  

Link para o comentário
Compartilhar em outros sites

  • Moderador

@David Martinho Sei que já resolveu.. mas isso não seria melhor fazer utilizando o ajax? 

Você preenche os dados,  dá um submit.  Esse submit, faz uma requisição assíncrona, sem sair da página... sendo assim preservando os dados escritos.  Claro, se a pessoa der um F5, vai apagar, porque atualizou a página.. 

Utilizo esse método desde muito tempo.  No caso, se quiser apagar os dados depois e enviar, seria só definir uma função de limpar os campos via jquery mesmo...  

Para eu, esta é a melhor prática...  como disse o colega acima, colocar dados de formulário em session é uma péssima prática.   Use a session somente quando realmente precisa.. como no caso de dar um " bom dia fulano", guardar algo que precise ser persistente. .. enfim...  acredito que devam ter outras N maneiras de resolver sem usar a session.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...