Ir ao conteúdo

Criar formulário para inserção de dados em PHP


Rafael Biagione

Posts recomendados

Postado

Preciso criar um formulário para inserção de dados em uma tabela no SQL. Criei três arquivos: formulario.php, que contém todo o código HTML da tabela, o gravar.php que contém o código em PHP e o sucesso.php que é exibida quando os dados são inseridos. O problema que ocorre é que os dados não estão sendo inseridor no banco de dados embora nenhuma mensagem de erro esteja sendo exibida. Vou postar arqui o código dos três arquivos para análise e para que vocês consigam me ajudar a resolver este problema.

formulario.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="gravar.php">
<p>
<label>
Nome:
<input type="text" name="Nome" />
</label>
</p>
<p>
<label>E-mail:
<input type="text" name="Email" />
</label>
</p>
<p>
<label>
Usuário:
<input type="text" name="usuario" />
</label>
</p>
<p>
<label>
Senha:
<input type="password" name="senha" />
</label>
</p>
<p>
<input type="submit" name="Enviar" value="Enviar" />
</p>
</form>
</body>
</html>

gravar.php onde acredito que o erro esteja


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?
include ("conj/loj.php");

$Nome = $_POST ['Nome'];
$Email = $_POST ['Email'];
$usuario = $_POST ['usuario'];
$senha = $_POST ['senha'];

mysql_query ("INSERT INTO clientes (Nome, Email, usuario, senha) VALUES ('$Nome', '$Email', '$usuario', '$senha',)");

echo "<script>document.location.href='sucesso.php';</script>"

?>

</body>
</html>

E sucesso.php, sem nenhum código em PHP, apenas uma página em HTML puro para exibir uma mensagem ao usuário.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
Dados inseridos com sucesso.
</body>
</html>

Aguardo pela ajuda!

Obrigado.

  • Moderador
Postado

Olá amigo, vejo alguns pequenos erros no seu gravar.php.. também , não há necessidade de você incluir as tags html no gravar.. pois ele simplesmente só recebe dados do formulario.. Também você colocou espaço entre o POST e [], colocou espaço entre mysql_query e () como ele é uma função.. não pode ter espaços.

tente desta maneira:


<?php
include ("conj/loj.php");

$Nome = $_POST['Nome'];
$Email = $_POST['Email'];
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

$insere = mysql_query("INSERT INTO clientes (Nome, Email, usuario, senha) VALUES ('$Nome', '$Email', '$usuario', '$senha')");

if($insere)){

echo "<script>document.location.href='sucesso.php';</script>";

}else{

echo "<script>document.location.href='erro.php';</script>";

?>

Uma dica que dou para você.. é usar o ajax para enviar os dados.. assim você pode eliminar o uso desse rediredionamento de sucesso.. pesquise sobre a funçao $.ajax() do jquery.. e o uso da função serialize() para nao precisar declarar uma variavel por cada campo do formulário.. alem do mais podes usar funçao sucess para sucesso, error para erros... podes definir ate um beforeSend e colocar aqueles gifs que ficam girando enquanto envia os dados..

  • Moderador
Postado

Realmente, postei o codigo com erros que não tinha visto.. enfim veja se resolve como o amigo ali alertou.. tirar um dos parenteses do IF e acrescente uma chave finalizando o else( esqueci de por isso)

abraço

Postado

Deu certo, obrigado.

Agora, preciso criar um recurso que altera os registros. Seguindo os passos de uma videoaula no YouTube, criei duas páginas: editar.php e update.php.

A editar.php exibe os dados a serem alterados enquanto a update.php recebe as alterações.

Ambas não apresentam erros de sintaxe e são compiláveis.

O problema é que a editar.php não exibe os dados das tabelas em seus campos.

Vou postar o código das duas páginas.

editar.php


<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

if(!isset($_SESSION["usuario"]))
header("location: erro.php");
else
$login = $_SESSION["usuario"];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?
include ("conj/loj.php");
$id = $_GET["ID"];
$sql = mysql_query("SELECT * FROM clientes where ID='&ID'");
$exibe = mysql_fetch_assoc($sql);
?>
<form id="form1" name="form1" method="post" action="update.php">
<input name="id" type="hidden" value="<? echo $exibe["ID"];?>" />
<p>
<label>
Nome:
<input type="text" name="Nome" value="<? echo $exibe["nome"];?>"/>
</label>
</p>
<p>
<label>E-mail:
<input type="text" name="Email" value="<? echo $exibe["Email"];?>" />
</label>
</p>
<p>
<label>
Usuário:
<input type="text" name="usuario" value="<? echo $exibe["usuario"];?>"/>
</label>
</p>
<p>
<label>
Senha:
<input type="password" name="senha" value="<? echo $exibe["senha"];?>"/>
</label>
</p>
<p>
<input type="submit" name="Editar" value="Editar" />
</p>
</form>
</body>
</html>

update.php


<?
include ("conj/loj.php");
$ID = $_POST['ID'];
$Nome = $_POST['Nome'];
$Email = $_POST['Email'];
$usuario = $_POST['uauario'];
$senha = $_POST['senha'];

if(mysql_query("update clientes set Nome='$Nome', Email='$Email', usuario='$usuario', senha='$senha' where id='$ID' ")){
echo "Alteração feita com sucesso. <br> <a href='javascript:history.back(-1);>Voltar</a>";
exit;

}else
{
echo mysql_error();
exit;
}

?>

Se puderem ajudar, agradeço.

Postado

Eu encontrei alguns erros em ambos arquivos: a maioria relacionado com variaveis com nomes diferentes, lembre-se php é case-sensitive, então $id é diferente de $ID.


<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

if(!isset($_SESSION["usuario"]))
header("location: erro.php");
else
$login = $_SESSION["usuario"];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?
include ("conj/loj.php");

//Verifique se na url a variavel $_GET é realmente ID ou é id.
$id = $_GET["ID"];

/*voce colocou o id na variavel $id e depois usou outra variavel
(bom nao era bem uma variavel, estava &ID), $ID.*/
$sql = mysql_query("SELECT * FROM clientes where ID='$id'");
$exibe = mysql_fetch_assoc($sql);

/*Verifique no banco de dados se as colunas tem o mesmo nome das
chaves dos arrays, lembrando $exibe['nome'] é diferente de $exibe['Nome'].*/
?>
<form id="form1" name="form1" method="post" action="update.php">
<input name="id" type="hidden" value="<? echo $exibe["ID"];?>" />
<p>
<label>
Nome:
<input type="text" name="nome" value="<? echo $exibe["nome"];?>"/>
</label>
</p>
<p>
<label>E-mail:
<input type="text" name="email" value="<? echo $exibe["email"];?>" />
</label>
</p>
<p>
<label>
Usuário:
<input type="text" name="usuario" value="<? echo $exibe["usuario"];?>"/>
</label>
</p>
<p>
<label>
Senha:
<input type="password" name="senha" value="<? echo $exibe["senha"];?>"/>
</label>
</p>
<p>
<input type="submit" name="Editar" value="Editar" />
</p>
</form>
</body>
</html>

Perceba que fiz apenas alterações nos nomes das variaveis, com exceção da clausula sql que buscava um campo com id = &ID.


<?
include ("conj/loj.php");

/*As chaves da variavel $_POST devem ser iguais ao NAME do input
e sempre tente manter as chaves em minusculo*/
$id = $_POST['id'];
$nome = $_POST['nome'];
$email = $_POST['email'];
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

/*Novamente, verifique se as colunas no banco de dados possuem o mesmo nome que voce colocou na clausula*/
if(mysql_query("update clientes set Nome='$nome', Email='$email', usuario='$usuario', senha='$senha' where id='$id' ")){
echo "Alteração feita com sucesso. <br> <a href='javascript:history.back(-1);>Voltar</a>";
exit;

}else
{
echo mysql_error();
exit;
}

?>

Agora so uma dica que eu lhe dou: tente manter um padrão em nomes de variaveis, tente sempre colocar variaveis com letras MINUSCULAS ($nome, $email), evite sair misturando ($nome, $Email) isso lhe induz ao erro, ja que voce pode não lembrar como declarou a variavel. Caso haja variaveis com nome compostos (nome aluno), use camel-case ($nomeAluno), ou separado por underline ($nome_aluno), isso facilita a compreensão do código.

Outra coisa, não simplesmente copie e cole o codigo dos outros, use apenas como referencia, já que voce esta aprendendo tente fazer o seu proprio codigo, isso lhe ajudara a entender o que esta fazendo e consequentemente aprenderá muito mais.

Abraços.

Postado

Fiz todas as alterações, mesmo assim não funcionou. O editar.php não exibe os dados nos campos.

Bom, acho que já fiz tudo o que poderia. Ou esse código não funciona ou algo está errado. Talvez eu devesse tentar outro código.

Vou ver o que faço.

Mesmo assim, obrigado pela ajuda.

  • Moderador
Postado

Olá amigo, tente fazer desta forma:

editar.php



<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

if(!isset($_SESSION["usuario"]))
header("location: erro.php");
else
$login = $_SESSION["usuario"];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?
include ("conj/loj.php");

//Verifique se na url a variavel $_GET é realmente ID ou é id.
$id = $_GET["ID"];

$sql = mysql_query("SELECT * FROM clientes where ID='$id'");
$exibe = mysql_fetch_object($sql);

?>
<form id="form1" name="form1" method="post" action="update.php?cliente=$id">
<p>
<label>
Nome:
<input type="text" name="nome" value="<? echo $exibe->nome;?>"/>
</label>
</p>
<p>
<label>E-mail:
<input type="text" name="email" value="<? echo $exibe->email;?>" />
</label>
</p>
<p>
<label>
Usuário:
<input type="text" name="usuario" value="<? echo $exibe->usuario?>"/>
</label>
</p>
<p>
<label>
Senha:
<input type="password" name="senha" value="<? echo $exibe->senha?>"/>
</label>
</p>
<p>
<input type="submit" name="Editar" value="Editar" />
</p>
</form>
</body>
</html>

update.php


<?php
recebe o id do cliente como parametro
$id = $_GET['cliente'];

include ("conj/loj.php");

/*As chaves da variavel $_POST devem ser iguais ao NAME do input
e sempre tente manter as chaves em minusculo*/
$nome = $_POST['nome'];
$email = $_POST['email'];
$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

/*Novamente, verifique se as colunas no banco de dados possuem o mesmo nome que voce colocou na clausula*/

if(mysql_query("update clientes set Nome='$nome', Email='$email', usuario='$usuario', senha='$senha' where id='$id' ")){
echo "Alteração feita com sucesso. <br> <a href='javascript:history.go(-1);>Voltar</a>";
exit;

}else
{
echo mysql_error();
exit;
}

?>

Veja no editar.php, no seu formulário eu retirei esta linha:

<input name="id" type="hidden" value="<? echo $exibe->id?>" />

Você não precisa mandar a id do registro por um campo hidden, o melhor meio nesse caso é usar um parametro no seu action. veja que coloquei:

action="update.php?cliente=$id", note que no seu update.php você recebe a ID via GET com o índice "cliente".

Postado

Oi, Dif. O código ainda não exibe os dados... Está difícil... Será que esse código que eu copiei funciona mesmo? Copiei já pronto de um site.

Veja como aparece:

semttuloug.png

Uploaded with ImageShack.us

Dentro dos campos deveriam aparecer os dados que serão alterados.

  • Moderador
Postado

POis é, uma coisa que sempre recomendo.. Nunca, jamais, copie alguma coisa pronta.. pois há muita chance de dar erros.

reveja se o parametro está sendo passado corretamente ao arquivo..

na sua pagina de editar, de um echo na variavel que recebe a ID veja se realmente ela esta recemendo a id para poderes editar os arquivos..

veja se a consulta está correta, veja se os campos estão com os nomes corretos... como o amigio ali em cima ja comentou.. o php é case sentitive.. então se você colocar por exemplo: lá na sua tabela do banco o campo ID , e no php resgatar como $variavel["id"] ou $varivavel[id].. ou $variavel->id , $variavel->Id ele não vai mostrar mesmo.. pois veja que nome do campo é em maiusculo.

sugiro que reveja tudo desde o ininio linha por linha para ver onde você errou. pois mostrar dados assim não tem mistério.

abraço

Postado

Olá,

Meu chefe conseguiu corrigir as duas páginas e elas agora estão funcionando.

Mas, ainda tenho muito o que fazer nesse painel administrativo. Desta vez, vou precisar reforçar a segurança do acesso pelo login acrescentando proteção contra sql injection e xss. E depois, outros acréscimos virão até que todo o painel seja concluído. Até lá, vou precisar de, além de muitos tutoriais, apostilas e videoaulas, também de muita ajuda e gostaria de poder contar com a ajuda de vocês, mas acho que eu lotaria muito o fórum, poderia ser por e-mail?

Obrigado!

Postado

Estou fazendo proteção contra XSS e SQL Injection mas ela está incompleta. Faltam algumas coisas... Poderiam me ajudar?


<?php
session_start();
include ("conj/loj.php");

/**
* Protege o banco de dados contra ataques de SQL Injection
*
* Remove palavras que podem ser ofensivas à integridade do banco
* Adiciona barras invertidas a uma string
*
* @uses $_REQUEST= _antiSqlInjection($_REQUEST);
* @uses $_POST = _antiSqlInjection($_POST);
* @uses $_GET = _antiSqlInjection($_GET);
*
*
*/

function _antiSqlInjection($Target){
$sanitizeRules = array('OR','FROM','SELECT','INSERT','DELETE','WHERE','DROP TABLE','SHOW TABLES','*','--','=');
foreach($Target as $key => $value):
if(is_array($value)): $arraSanitized[$key] = _antiSqlInjection($value);
else:
$arraSanitized[$key] = (!get_magic_quotes_gpc()) ? addslashes(str_ireplace($sanitizeRules,"",$value)) : str_ireplace($sanitizeRules,"",$value);
endif;
endforeach;
return $arraSanitized;
}
// Protege contra XSS


$nome=$_GET['usuario'];//Captura dados via GET
$vetor=str_split($nome);//Converte a String em Vetor
$i=0;//Inicializa o contador em 0
$ativo=true;//Ativo Ligado
while($i<strlen($nome)){//Equanto i for o tamanho de caracteres da string nome
if (($vetor[$i]=='<')||($vetor[$i]=='>')||($vetor[$i]=='/')||($vetor[$i]==';')){//Verifica caracteres inválidos
$vetor[$i]=' ';//Subistitui por espaço em branco
if ($ativo==true){//Ativo verdadeiro
echo "<script>alert ('XSS?? Não!!!');</script>";//Exibe Alerta Avisando que XSS Não
$ativo=false;//Ativo recebe falso
}//fim do if ativo
}//fim do if de verificar caracteres
$i++;//Incrementa 1 em u
}//fim do while
$i=0;//i recebe 0
while($i<strlen($nome)){//Equanto i for o tamanho de caracteres da string nome
echo ("$vetor[$i]");//Escreve a string
$i++;//incrementa 1 em i
}// fim do while


//recebe os dados do formulario
$usuario = $_POST["usuario"];
$senha = $_POST["senha"];

//faz a proteção contra sql injection
$usuarioSeguro = addslashes($usuario);
$senhaSegura = addslashes($senha);

if(empty($usuario) OR empty($senha))
{
echo
"<script>
alert('Preencha todos os campos.');
history.go(-1);
</script>";
exit;

}

$sql = mysql_query ("SELECT * FROM clientes WHERE usuario = '$usuario' AND senha = '$senha'");

$num = mysql_num_rows($sql);

if($num == 0)
{
echo
"<script>
alert('Usuario/Senha incorretos');
history.go(-1);
</script>";
exit;
}


else
{

$registro = mysql_fetch_object($sql);

//pega o ID do registro
$id = $registro->id;

//atribui a variavel de sessão
$_SESSION["id"] = $id;
$_SESSION["usuario"] = $usuario;

header("Location: admin.php");

}

mysql_close($conn);

?>

Obrigado mais uma vez!

Postado
Estou fazendo proteção contra XSS e SQL Injection mas ela está incompleta. Faltam algumas coisas... Poderiam me ajudar?

voce poderia ser mais especifico?

Postado

Dif, fiz as proteções desta forma: criei uma página chamada sanitize.php e coloquei outras rotinas nos arquivos onde há o $_GET e $_POST.

Como não sei testar, não posso saber se funciona. Mas, acessando uma das páginas, surge esta mensagem:

Warning: Invalid argument supplied for foreach() in /home/free/public_html/Rafael/sanitize.php on line 40

Vou postar os códigos:

Nas páginas onde não há $_GET, por exemplo, eu tirei as linhas que contém a proteção para $_GET.


//INÍCIO DA ROTINA DE PROTEÇÃO CONTRA SQL INJECTION E XSS
// Importa a classe necessária
require_once('sanitize.php');

// Filtra HTML e SQL Injection em todos os campos
$_GET = Sanitize::filter($_GET);
$_POST = Sanitize::filter($_POST);

// Somente HTML Injection
$_POST = Sanitize::filter($_POST, array('html'));

// Somente SQL Injection
$_POST = Sanitize::filter($_POST, array('sql'));

// Campos
$_GET['usuario'] = Sanitize::filter($_GET['usuario']);
$_POST['nome'] = Sanitize::filter($_POST['nome']);
$_POST['email'] = Sanitize::filter($_POST['email']);
$_POST['usuario'] = Sanitize::filter($_POST['usuario']);
$_POST['senha'] = Sanitize::filter($_POST['senha']);
//FIM DA ROTINA DE PROTEÇÃO CONTRA SQL INJECTION E XSS
?>

E a sanitize.php, onde não alterei nada.


<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

if(!isset($_SESSION["usuario"]))
header("location: erro.php");
else
$login = $_SESSION["usuario"];
?>
<?php
/**
* Classe que contem os métodos que irão
* filtrar as entradas enviadas via GET e POST
*
*/
abstract class Sanitize {

/**
* Filter
*
* @param mixed $value
* @param array $modes
* @return mixed
* @static
* @since 1.0
*/
static public function filter($value, $modes = array('sql', 'html')) {

if (!is_array($modes)) {
$modes = array($modes);
}

if (is_string($value)) {
foreach ($modes as $type) {
$value = self::_doFilter($value, $type);
}
return $value;
}

foreach ($value as $key => $toSanatize) {
if (is_array($toSanatize)) {
$value[$key]= self::filter($toSanatize, $modes);
} else {
foreach ($modes as $type) {
$value[$key] = self::_doFilter($toSanatize, $type);
}
}
}

return $value;
}

/**
* DoFilter
*
* @param mixed $value
* @param array $modes
* @return mixed
* @static
* @since 1.0
*/
static protected function _doFilter($value, $mode) {

switch ($mode) {
case 'html':
$value = strip_tags($value);
$value = addslashes($value);
$value = htmlspecialchars($value);
break;

case 'sql':
$value = preg_replace(sql_regcase('/(from|select|insert|delete|where|drop table|show tables|#|\*| |\\\\)/'),'',$value);
$value = trim($value);
break;
}

return $value;
}

}
?>

  • Moderador
Postado

Bem, nunca usei esta classe para saber se realmente ela funciona.. mas nao deixo de notar que você colocou o session_start() no arquivo da classe.. isso é errado. coloque todo aquele bloco no seu arquivo onde você recebe os dados do formulário

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...