Ir para conteúdo

POWERED BY:

Arquivado

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

thiagomngomes

Relacionar a chave estrangeira no INSERT

Recommended Posts

Vamos lá, criei um tabela (tb_comentario) com uma chave estrangeira 'num_post' referente a tabela (tb_blog) até então ok. porem minha dificuldade é na hora de gravar o comentario no banco alem de inserir os campos em que criei na 'tb_comentario' inserir junto a chave primaria "num_post"

 

abaixo as duas paginas que uso para salvar o comentario no banco:

 

 

<!--mensagem_form.php--> 

<body background="./imgs/fundo.png">
<div id="titulo">
<div id="corpo">
<form action="gravar_mensagem.php" method="POST">
<div>
<div style="float: right; position: absolute; right: 820px; top: 20px; width: 30px;">
Nome: <br><input type="text" name = 'nome' size = "20"><br>
</div>
<div style="float: right; position: relative; right: 820px; top: 70px; width: 30px;">
Mensagem:<br>
<textarea name='msg' cols=100 rows=19></textarea><br>
</div>
<div style="float: right; position: relative; right: 820px; top: 400px; width: 0px;">
<input type="submit" value="Gravar">
</div>
<div style="float: right; position: relative; right: -50px; top: 20px; width: 90px;">
<a href="blog.php">Desistir</a>
</div>
</div>
</form>


<div id="rodape">Sistemas de Informação - FATEB © 2013 </div>
</div>
</div>
</div>
</body>
</html>
<?php
$link = mysql_connect("127.0.0.1","root","");
mysql_select_db("db_aula");
$sql = "SELECT nome, mensagem FROM tb_comentario";
mysql_close($link);
?>

 

e esse onde gravo no banco

 

<!--gravar_mensagem.php-->
<?php
$link = mysql_connect("127.0.0.1","root","");
mysql_select_db("db_aula");
$nome = $_POST['nome'];
$mensagem = $_POST['msg'];
$sql = "INSERT INTO tb_comentario(nome, mensagem)VALUES('$nome', '$mensagem')";
$status = mysql_query($sql);
mysql_close($link);
if($status==0)
$msg = "Erro ao gravar mensagem!";
else
$msg = "Sucesso ao gravar mensagem!";
?>
<script>
alert('<?php echo $msg; ?>');
location='blog.php';
</script>

 

A msg esta retornando "Erro ao gravar mensagem" pq esta retornando 0 registro inserido pensei em colocar um GET_($num_post) mas não deu certo, estou pensando em criar uma especie de SESSION mas não creio que seja a solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro capture o erro do Mysql e poste aqui. Ficaria +- assim, comentei minhas modificações.

<!--gravar_mensagem.php-->

<?php

$link = mysql_connect("127.0.0.1","root","");

$error = mysql_error() . "\n"; // <- Adicionei esta linha

mysql_select_db("db_aula");

$error .= mysql_error() . "\n"; // <- Adicionei esta linha

$nome = $_POST['nome'];

$mensagem = $_POST['msg'];

$sql = "INSERT INTO tb_comentario(nome, mensagem)VALUES('$nome', '$mensagem')";

$status = mysql_query($sql);

$error .= mysql_error() . "\n"; // <- Adicionei esta linha

mysql_close($link);

if($status==0)

$msg = $error; // <- Modifiquei esta linha

else

$msg = "Sucesso ao gravar mensagem!";

?>

<script>

alert('<?php echo $msg; ?>');

location='blog.php';

</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Primeiro capture o erro do Mysql e poste aqui. Ficaria +- assim, comentei minhas modificações.

<!--gravar_mensagem.php-->
<?php
$link = mysql_connect("127.0.0.1","root","");
$error = mysql_error() . "\n"; // <- Adicionei esta linha
mysql_select_db("db_aula");
$error .= mysql_error() . "\n"; // <- Adicionei esta linha
$nome = $_POST['nome'];
$mensagem = $_POST['msg'];
$sql = "INSERT INTO tb_comentario(nome, mensagem)VALUES('$nome', '$mensagem')";
$status = mysql_query($sql); 
$error .= mysql_error() . "\n"; // <- Adicionei esta linha
mysql_close($link);
if($status==0)
$msg = $error; // <- Modifiquei esta linha
else
$msg = "Sucesso ao gravar mensagem!";
?>
<script>
alert('<?php echo $msg; ?>');
location='blog.php';
</script>

fiz este teste ele não reportou nenhum erro e nenhuma msg simplesmente chamou a pagina <!--gravar_mesagem.php--> em branco.

verifiquei no banco se gerou os registros e tbm n

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, tente mudar o 127.0.0.1 para localhost na conexão, se não funcionar vamos adicionar mais algum tratamento de erros...

 

<!--gravar_mensagem.php-->
<?php
/* Adicionei este trecho - Mostra todos os erros */

     error_reporting(0);
     ini_set("display_errors", 0);
     
/***/ 
     
/* Adicionei este trecho - Verifica se os valores do post estão sendo passados */

if( empty($_POST['nome']) || !isset($_POST['nome'])){
    echo 'O nome está em branco ou não foi definido. <br />';
}

if( empty($_POST['msg']) || !isset($_POST['msg'])){
    echo 'A mensagem está branco ou não foi definida. <br />';
} 

/***/
     
$link = mysql_connect("127.0.0.1","root","")  or die (mysql_error()); // <-Mudei o mysql_error para esta linha
mysql_select_db("db_aula")  or die (mysql_error()); // <-Mudei o mysql_error para esta linha
$nome = $_POST['nome'];
$mensagem = $_POST['msg'];
$sql = "INSERT INTO tb_comentario(nome, mensagem)VALUES('$nome', '$mensagem')";
$status = mysql_query($sql) or die (mysql_error()); // <-Mudei o mysql_error para esta linha
mysql_close($link) or die (mysql_error()); // <-Mudei o mysql_error para esta linha
if($status==0)
$msg = "Erro ao gravar mensagem!";
else
$msg = "Sucesso ao gravar mensagem!";
?>
<script>
alert('<?php echo $msg; ?>');
location='blog.php';
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Ok, tente mudar o 127.0.0.1 para localhost na conexão, se não funcionar vamos adicionar mais algum tratamento de erros...

 

<!--gravar_mensagem.php-->
<?php
/* Adicionei este trecho - Mostra todos os erros */

     error_reporting(0);
     ini_set("display_errors", 0);
     
/***/ 
     
/* Adicionei este trecho - Verifica se os valores do post estão sendo passados */

if( empty($_POST['nome']) || !isset($_POST['nome'])){
    echo 'O nome está em branco ou não foi definido. <br />';
}

if( empty($_POST['msg']) || !isset($_POST['msg'])){
    echo 'A mensagem está branco ou não foi definida. <br />';
} 

/***/
     
$link = mysql_connect("127.0.0.1","root","")  or die (mysql_error()); // <-Mudei o mysql_error para esta linha
mysql_select_db("db_aula")  or die (mysql_error()); // <-Mudei o mysql_error para esta linha
$nome = $_POST['nome'];
$mensagem = $_POST['msg'];
$sql = "INSERT INTO tb_comentario(nome, mensagem)VALUES('$nome', '$mensagem')";
$status = mysql_query($sql) or die (mysql_error()); // <-Mudei o mysql_error para esta linha
mysql_close($link) or die (mysql_error()); // <-Mudei o mysql_error para esta linha
if($status==0)
$msg = "Erro ao gravar mensagem!";
else
$msg = "Sucesso ao gravar mensagem!";
?>
<script>
alert('<?php echo $msg; ?>');
location='blog.php';
</script>

com este novo esquema o erro apresentado foi o seguinte:

Cannot add or update a child row: a foreign key constraint fails (`db_aula`.`tb_comentario`, CONSTRAINT `tb_comentario_ibfk_1` FOREIGN KEY (`num_post`) REFERENCES `tb_blog` (`num_post`))

 

 

será que esse erro ocorreu pq no <!--messagem_form--> falto adicionar

 

 

 


 

<?php $link = mysql_connect("127.0.0.1","root",""); mysql_select_db("db_aula"); $sql = "SELECT codcomentario, nome, mensagem FROM tb_comentario"; mysql_close($link); ?>

(codcomentario) e relacionar ao num_post da tb_blog?

obs: o num_post esta inserido na tb_comentario como chave estrangeira

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um adendo:

     error_reporting(0);
     ini_set("display_errors", 0);


troque para:

     error_reporting(E_ALL);
     ini_set("display_errors", 1);


Do jeito que coloquei antes em vez de mostrar todos os erros vai ocultar todos os erros... Justamente o contrario do queremos.

-------------------------------------------

Sobre o erro: Você está tentando inserir na tabela "tb_comentario" os valores "nome" e "mensagem" porém juntamente com esses valores você deve inserir a chave estrangeira "num_post" ou vai obter o erro. Não ha muito mistério sobre sintase SQL:

$sql = "INSERT INTO tb_comentario(nome,mensagem,num_post)VALUES('$nome','$mensagem','$chaveEstrangeira')";

Porém obviamente você antes deve obter o valor $chaveEstrangeira. Você pode passa-lo junto com o form se for apropriado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um adendo:

     error_reporting(0);
     ini_set("display_errors", 0);

 

troque para:

 

     error_reporting(E_ALL);
     ini_set("display_errors", 1);

 

Do jeito que coloquei antes em vez de mostrar todos os erros vai ocultar todos os erros... Justamente o contrario do queremos.

 

-------------------------------------------

 

Sobre o erro: Você está tentando inserir na tabela "tb_comentario" os valores "nome" e "mensagem" porém juntamente com esses valores você deve inserir a chave estrangeira "num_post" ou vai obter o erro. Não ha muito mistério sobre sintase SQL:

$sql = "INSERT INTO tb_comentario(nome,mensagem,num_post)VALUES('$nome','$mensagem','$chaveEstrangeira')";

Porém obviamente você antes deve obter o valor $chaveEstrangeira. Você pode passa-lo junto com o form se for apropriado.

 

Segui suas dicas:

 

$chaveEstrangeira = $_GET['num_post'];
$sql = "INSERT INTO tb_comentario (nome, mensagem, num_post) VALUES ('$nome', '$msg', $chaveEstrangeira)"; 

 

 

porem agora esta dando este erro:

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

so coloque as aspas na variável $chaveEstrangeira no insert depois do $_GET['num_post'] fica:

 

 

"INSERT INTO tb_comentario (nome, mensagem, num_post) VALUES ('$nome', '$msg', '$chaveEstrangeira')"

Compartilhar este post


Link para o post
Compartilhar em outros sites

so coloque as aspas na variável $chaveEstrangeira no insert depois do $_GET['num_post'] fica:

 

 

"INSERT INTO tb_comentario (nome, mensagem, num_post) VALUES ('$nome', '$msg', '$chaveEstrangeira')"

 

mas ela é INT

 

ocorreu este erro:

Parse error: syntax error, unexpected '$chaveEstrangeira' (T_VARIABLE) in E:\trabalho\mensagempostgravar.php on line 6

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifica se não esqueceu nunhum ";" no final das linhas.

 

Vamos também debugar este $_GET['num_post']

 

coloque assim depois de recebe-lo e antes do Insert.

if(empty($chaveEstrangeira)){
echo "Chave estrangeira não definda <br />";
}
if(!is_int($chaveEstrangeira)){
die("A chave estrangeira não é um inteiro válido");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

É Raoni ele apresentou as duas msg que vc inseriu não definida e não é inteiro valido pensando nisso voltei atrás na pagina inicial onde

gero as novas paginas atraves:

 

<a href="mensagempost.php?num_post='.$r[0].'">Comentar</a>

já na pagina seguinte "mensagempost...." onde esta o formulario pegando o nome e comentário eu não tinha nenhuma conexão com o banco para armazenar a chave do num_post e então criei a parte da conexao dentro do formulario abaixo onde pega os demais campo nome e senha:

 

....
<form action="mensagempostgravar.php" method="POST">
        <?php
    include "conexao.php";
    $chave = $_GET['num_post'];
    mysql_close();
?>
        <div>
            <div style="float: right; position: absolute; right: 820px; top: 20px; width: 30px;">
                Nome ...continua...

e então na pagina final recebi como no exemplo:

 

$chaveEstrangeira = ['$chave'];

com o "empty" abaixo que vc sugeriu e retornou apenas uma msg agora:

A chave estrangeira não é um inteiro válido

 

já adianto que no banco o num_post esta definido como tipo int(11)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade não entendi o que você fez.... rsrsss

 

mas o que importa é o valor chegando correto, de um echo em $chaveEstrangeira e veja se é o valor esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é me parece que de alguma forma ao fim esta mudando o array

 

tentei

 

$chaveEstrangeira = ['$chave'];
print_r(implode($chaveEstrangeira))

 

 

só que ai

 

Parse error: syntax error, unexpected '$sql' (T_VARIABLE) in E:\trabalho\mensagempostgravar.php on line 15

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse erro de "T_VARIABLE" geralmente ocorre quando esquecemos de colocar o ponto e virgula ";" no final da linha ou algum outro erro bobo do tipo.

 

Veja que ele ocorreu na linha 15, então você deve ter esquecido o ponto e virgula na linha 14, se não foi o ; foi algum detalhe do tipo.

 

Não sei qual editor você esta usando, mas use algum editor robusto que lhe avisa destes errinhos. O Netbeans marca a linha com um ! quando existe um erro nela ou na linha anterior isso que facilita bastante na codificação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.