Ir para conteúdo
Fórum Script Brasil
  • 0

Inserts Segundo Foreign Keys


Rastazituh

Pergunta

Boas !

O que hoje me traz aqui é o assunto das Foreign Keys. Isto é difícil de explicar a ainda mais difícil de fazer. Digamos que tenho as seguintes tabelas MySQL:

temas

id(PrimaryKey)  nome_tema

1                      Livros

2                      Filmes

categoriasLivros

id_tema (Foreign Key, id da tabela temas)  id_categoria (Primary Key)  nome_categoria

1                                                                      1                                Sinopses

1                                                                      2                                Críticas

1                                                                      3                                Prémios

titulosSinopses

id_categoria(Foreign Key, id_categoria da tabela categoriasLivros) id_titulos (PK) nome_titulo

2                                                                            1                          Livro 1

2                                                                            2                          Livro 2

2                                                                            3                          Livro3

Ou seja, uma hierarquia de tabelas. A tabela TEMAS tem vários temas, cada um deles com uma tabela categorias[Tema], e cada categoria com uma tabela titulos[Categoria].

Tenho agora alguns PHPs. Um deles lista, numa tabela, todos os temas da tabela TEMAS, e cada linha da tabela, correspondente a cada tema, tem uma célula com o link Adicionar Categoria. Este faz um reload para addcategoria.php?id=$id, em que $id é o id da tabela escolhida.

Nesta página tenho um campo de texto em que se digita o nome da categoria, e o botão Submit. Agora vem o grande problema:

Consoante o tema escolhido, o nome dessa categoria será adicionado na tabela categorias[Tema] lhe correspondente, ou seja, em que a Foreign Key (id_tema) de categorias[Tema] seja a Primary Key (id) de TEMAS. Depois disto, terá de ser criada uma nova tabela titulos[Categoria], em que a Foreign Key (id_categoria) será a Primary Key (id_categoria) da categoria da tabela categorias[Tema]. Compreenderam mais ou menos ? A categoria adicionada será colocada na tabela cuja Foreign Key seja igual a $id, e também a nova tabela será criada de forma a que, quando for adicionados dados, a Foreign Key seja sempre a Primary Key de categorias[Tema].

Seguem-se os PHPs:

addcategoria.php

<?php
  echo "<table width=\"400\" align=\"center\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\">";
  echo "<tr>";
  echo "<th widht=\"15\"><strong><font size=\"1\" face=\"Verdana\"><center>ID</center></font></strong></th>";
  echo "<th widht=\"50\"><strong><font size=\"1\" face=\"Verdana\"><center>Tema</center></font></strong></th>";
  echo "<th widht=\"30\"><strong><font size=\"1\" face=\"Verdana\"><center>Escolher</center></font></strong></th>";
  
  while ($linha=mysql_fetch_array($resultado)) {
  $id = $linha["id"];
  $nome_tema = $linha["nome_tema"];
  
  echo "<tr></tr>";
  echo "<tr>";
  echo "<td widht=\"15\" height=\"20\"><font size=\"1\" face=\"Verdana\" style=\"text-decoration: none\"><center>$id</center></font></td>";
  echo "<td widht=\"50\" height=\"20\"><font size=\"1\" face=\"Verdana\" style=\"text-decoration: none\"><center>$nome_tema</center></font></td>";
  echo "<th widht=\"30\" height=\"20\"><a href='addcategoria_bd.php?id=$id'><img src=\"http://www.nimbus.com.pt/conteudos/images/chosenyes.gif\" border=\"0\"></a></th>";
  echo "</tr>";
  }
  echo "</table>";
  ?>
addcategoria_bd.php
<?php

$tema_escolhido = mysql_query("SELECT * FROM temas WHERE id = '$id'");
$linha=mysql_fetch_array($tema_escolhido);

$tema = $linha['nome_tema'];

// Apresenta a frase com o tema escolhido
echo "<p><font size=\"1\" face=\"Verdana\">Adicione uma nova categoria ao tema '$tema' através do seguinte formulário</font></p>";
?>
<form action="addcategoria_bd2.php" method="post" name="adduser" id="adduser">
  <font size="2" face="Tahoma"> </font> 
  <center>
    <p align="left"></p>
  </center>
  <table width="260" border="0" cellpadding="0" cellspacing="2">
    <tr> 
      <td width="55"><div align="left"><font size="1" face="Verdana">Categoria:</font></div></td>
      <td colspan="2"><div align="justify"><font size="1" face="Verdana"> 
          <input name="categoria" type="text" class="post" id="username" size="20">
          </font></div></td>
    </tr>
    <tr> 
      <td><div align="left"><font size="2" face="Tahoma"><font face="Verdana"></font> 
          </font></div></td>
      <td width="53"><font size="2" face="Verdana">&nbsp; </font></td>
      <td width="144"><font size="2" face="Verdana"> 
        <input name="submit" type="submit" class="button" value="Adicionar">
        </font></td>
    </tr>
  </table>
  </form>

Agora preciso do script de addcategoria_bd2.php. Como fazer, alguém tem ideia ? Obrigado desde já pela atenção.

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

Olá, não te posso ajudar porque eu mesma nunca uso foreign keys nas tabelas, controlo tudo por php, é mais simples, habituei-me, e já fiz programas muito complicados e cheios de relações entre tabelas sem foreign keys. Pode ser que alguém te dê uma ajuda.

Link para o comentário
Compartilhar em outros sites

  • 0
Olá, não te posso ajudar porque eu mesma nunca uso foreign keys nas tabelas, controlo tudo por php, é mais simples, habituei-me, e já fiz programas muito complicados e cheios de relações entre tabelas sem foreign keys. Pode ser que alguém te dê uma ajuda.

Amigo não tem nada haver o que você falou pra que um banco relacional funcione precisa ter relacionamentos isso é simples cada tabela tem que ter alguma ligação com outra

o jeito mais inteligente de se fazer um relacionamento é pelos ids de cada tabela

o fk ou Foreign Keys( chaves estrangeiras) nada mais é que uma indicação que aquele id esta apontando para o id de outra tabela e o que você disse que controla tudo por php é outra coisa nada haver pois se trata aqui da sintaxe sql para gerenciar o banco

exemplo:

tabela Autor

idAutor

nomeAutor

tabela Livros

idLivro

nomeLivro

fkAutor

quando for cadastrar um livro novo basta apontar o id do autor e não ficar digitando sempre o nome do autor um banco bem modelado não pode ter dados repetidos

Link para o comentário
Compartilhar em outros sites

  • 0

Mas voltando à minha dúvida: Digamos que tenho a página addcategoria_bd.php?id=1, em que 1 é o ID de um campo da tabela. Nessa página tenho um formulário. Preciso de fazer algo como:

 INSERT INTO tabela (nome_categoria) VALUES ($nome_categoria)

O meu problema é saber como é que ele vai identificar o nome da tabela em que tem de inserir. Essa tabela é que é definida por ForeignKey, porque o id_tema da tabela que foi escolhida para inserir nova categoria (neste caso id=1) é o id da tabela em que os temas estão listados. Apenas sabendo o ID do tema escolhido ele vai ter de fazer uma pesquisa em todas as restantes tabelas para identificar em qual id_tema=1. Assim que souberem como devo fazer a identificação dessa tabela, por favor, respondam. Eu só encotnro de SELECTs e mesmo assim não compreendo =\. Obrigado ! biggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Explica melhor o que você quer fazer, pois do jeito que você ta falando não faz muito sentido

para inserir algo dado novo não vai precisar de id nenhum

addcategoria_bd.php?id=1,, se usa o id para editar nesse mesmo campo

mas posta ai o que você pretende fazer dai eu posso te ajudar melhor

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, está francamente bem explicado, consegui entender pelo menos essa parte dos SELECTs. Mas o que me vem atormentando: e os INSERTs, como fazer ? Qual a estrutura ? Já procurei pela net e não encontrei nada sad.gif

Terá de ser algo como isto ??:


$sql = "INSERT INTO categorias$tema (nome_categoria) VALUES ($nome_categoria)";
$resultado = mysql_query($sql);

$pesquisa = "SELECT nome_tema FROM temas WHERE id = '$id'";
$tema = mysql_query($pesquisa);

$sql2 = " CREATE TABLE titulos$nome_categoria (
            id_categoria INT NOT NULL,
            id_titulo INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
            nome_titulo VARCHAR (250) NOT NULL,
            FOREIGN KEY (id_categoria) REFERENCES categorias$tema (id_categoria)
            );

Em que:

$tema = nome do tema, que para além de estar listado na tabela TEMAS estará também no nome da tabela em que a categoria será inserida;

$nome_categoria = dados inseridos no campo de texto do formulário da página.

Poderá funcionar ?

Link para o comentário
Compartilhar em outros sites

  • 0

Mas o script acima foi feito por mim mesmo.. O que eu queria saber era se as variáveis enquanto nomes de tabelas funcionam. Devo ter complicado demais a minha explicação, pelos vistos. Então, acha que o sript que apresentei pode resultar ? Só não sei se as variáveis enquanto nomes de tabelas e de campos de tabelas funcionarão..

Link para o comentário
Compartilhar em outros sites

  • 0

Resolvi fazer algumas mudanças no código anteriormente postado. Tenho dúvidas quanto a certas coisas, mas.. Cá vai ele (foi feito por mim, portanto é certo que tem erros, pois não funciona):

addcategoria_bd.php (formulário)

<?php

$tema_escolhido = mysql_query("SELECT * FROM temas WHERE id = '$id'");
$linha=mysql_fetch_array($tema_escolhido);

$tema = $linha['nome_tema'];

// Apresenta a frase com o tema escolhido
echo "<p><font size=\"1\" face=\"Verdana\">Adicione uma nova categoria ao tema '$tema' através do seguinte formulário</font></p>";
?>
<form action="addcategoria_bd2.php" method="post" name="adduser" id="adduser">
  <font size="2" face="Tahoma"> </font> 
  <center>
    <p align="left"></p>
  </center>
  <table width="333" border="0" cellpadding="0" cellspacing="2">
    <tr> 
      <td width="165"><div align="left"><font size="1" face="Verdana">Categoria:</font></div></td>
      <td colspan="2"><div align="justify"><font size="1" face="Verdana"> 
          <input name="nome_categoria" type="text" class="post" size="20">
          </font></div></td>
    </tr>
    <tr> 
      <td width="165"><font size="1" face="Verdana">Categoria (Nome para a tabela):</font></td>
      <td colspan="2"><font size="1" face="Verdana">
        <input name="nome_categoria_tabela" type="text" class="post" size="20">
        </font></td>
    </tr>
    <tr> 
      <td colspan="3"><div align="center"><font size="2" face="Tahoma"><font face="Verdana"></font> 
          </font><font size="2" face="Verdana">&nbsp; </font><font size="2" face="Verdana"> 
          <input name="submit" type="submit" class="button" value="Adicionar">
          </font></div></td>
    </tr>
  </table>
  </form>
adduser_bd2.php (agora, o meu código)
<?php
// Conexão com a Base de Dados
require "comum.php";

// Pesquisa o nome do tema no qual a categoria será inserida
$pesquisa = "SELECT nome_tema_tabela FROM temas WHERE id = '$id'";
$tema = mysql_query($pesquisa);

// Insere a categoria na tabela correcta
$sql = "INSERT INTO categorias'$tema' (id, nome_categoria, nome_categoria_tabela) VALUES ('$id', '$nome_categoria', '$nome_categoria_tabela')";
$resultado = mysql_query($sql);

// Pesquisa o ID da nova categoria
$pesquisa2 = "SELECT id_categoria FROM categorias'$tema' WHERE nome_categoria_tabela = '$nome_categoria_tabela'";
$id2 = mysql_query($pesquisa2);

// Adiciona nova tabela para a categoria
$sql2 = "CREATE TABLE titulos'$nome_categoria_tabela' (
         id_categoria INT NOT NULL DEFAULT '$id2',
         id_titulo INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
         nome_titulo VARCHAR (250) NOT NULL,
         FOREIGN KEY (id_categoria) REFERENCES categorias'$tema' (id_categoria) ON UPDATE CASCADE,
         )"
or die ("<font size=\"1\" face=\"Verdana\" color=\"#000033\">Erro na gravação dos dados! Por favor, volte e verifique novamente os campos.</font>");

echo "<font size=\"2\" face=\"Verdana\" color=\"#000033\"><strong>Sucesso!</strong></font>";
echo "<BR>";
echo "<font size=\"1\" face=\"Verdana\" color=\"#000033\">Nova categoria adicionada à Base de Dados.</font>";
echo "<BR>";
echo "<a href=\"index2.php\"><font size=\"1\" face=\"Verdana\" color=\"#000033\">>> Regressar ao Sistema de Conteúdos Nimbus</font></a>";

?>

Não sei se o erro é nos mysql_query's, se nas últimas linhas.. O facto é que aparece a mensagem de sucesso mas os dados não são inseridos na Base de Dados. Obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

O sistema funciona assim:

1 Tabela 'temas' com todos os temas criados

X Tabelas 'categorias$nome_tema_tabela' Para listar as categorias de cada tema

X Tabelas 'titulos$nome_categoria_tabela' com os títulos e conteúdos de cada categoria

X Tabelas 'subtitulos$nome_titulo_tabela' com eventuais subtitulos para alguns títulos

Pronto. Ao inserir uma nova categoria, ele terá de fazer:

- Identificar o $tema = 'nome_tema_tabela' correspondente ao '$id' da do tema

- Adicionar uma nova categoria na tabela 'categorias$tema'

- Identificar o $id2 = 'id_categoria', que será uma posterior Foreign Key para a tabela a criar no passo seguinte (essa Foreign Key é a Primary Key da categoria = '$nome_categoria_tabela'

- Criar uma nova tabela 'titulos$nome_categoria_tabela', para listar os títulos da nova categoria criada, onde FK = 'id_categoria' da nova categoria adicionada na tabela 'categorias$nome_tema_tabela'

Espero ter-me explicado melhor. Aguardo ajuda. Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

O código está quase pronto ! Neste momento já adiciona a nova categoria na tabela, mas ainda não cria a nova tabela.. Existe alguma função específica para criar a nova tabela ?

<?php
// Conexão com a Base de Dados
require "comum.php";

// Pesquisa o nome do tema no qual a categoria será inserida
$pesquisa = "SELECT * FROM temas WHERE id = '$id'";
$query = mysql_query($pesquisa);
$linha = mysql_fetch_array($query);

// Especificar os campos
$tema = $linha['nome_tema_tabela'];

// Insere a categoria na tabela correcta
$sql = "INSERT INTO categorias$tema (id, nome_categoria, nome_categoria_tabela) VALUES ('$id', '$nome_categoria', '$nome_categoria_tabela')";
$resultado = mysql_query($sql);

// Pesquisa o ID da nova categoria
$pesquisa2 = "SELECT * FROM categorias$tema WHERE nome_categoria_tabela = '$nome_categoria_tabela'";
$query2 = mysql_query($pesquisa2);
$linha2 = mysql_fetch_array($query2);

// Especificar os campos
$id2 = $linha['id_categoria'];

// Adiciona nova tabela para a categoria
$sql2 = "CREATE TABLE titulos'$nome_categoria_tabela' (
         id_categoria INT NOT NULL DEFAULT '$id2',
         id_titulo INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
         nome_titulo VARCHAR (250) NOT NULL,
         FOREIGN KEY (id_categoria) REFERENCES categorias$tema (id_categoria) ON UPDATE CASCADE,
         )" or die ("<font size=\"1\" face=\"Verdana\" color=\"#000033\">Erro na gravação dos dados! Por favor, volte e verifique novamente os campos.</font>");
echo "<font size=\"2\" face=\"Verdana\" color=\"#000033\"><strong>Sucesso!</strong></font>";
echo "<BR>";
echo "<font size=\"1\" face=\"Verdana\" color=\"#000033\">Nova categoria adicionada à Base de Dados.</font>";
echo "<BR>";
echo "<a href=\"index2.php\"><font size=\"1\" face=\"Verdana\" color=\"#000033\">>> Regressar ao Sistema de Conteúdos Nimbus</font></a>";

?>

A partir de // Adiciona nova tabela para a categoria deixa de funcionar. Obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,6k
×
×
  • Criar Novo...