• 0
Sign in to follow this  
jefponte

[Resolvido]Dúvida Sobre: Criação de Categoria em Banco MYSQL

Question

Criei um site. Nele eu uso MYSQL para mostrar artigos, notícias ou eventos nas três categorias distintas. Veja no site: http://augustojr10.com.br/noticias.php

O meu problema é que quando eu adiciono um artigo com mais de uma categoria, ele abre uma nova categoria. Por exemplo: Uma nova categoria "evento,notícia". Eu queria saber como é que esses blogs fazem pra criar várias categorias distintas em uma mesma postagem. No meu caso eu só posso adicionar uma categoria, no campo da tabela referente a tabela "novapostagem".

Quem precisar ver, está ai as partes importantes do codigo:

Noticias.php

<?php

$categ = $_GET['categoria'];

if (!isset($categ) || $categ==" )

{

$string ="";

$msg="";

}

else

{

$string="AND categoria= '". $categ. "'";

$msg= $categ;

}

?>

<?php

$titulo = $_GET['titulo];

if (!isset($titulo) || $titulo=="" )

{

$filtrotitulo ="";

$msg2="";

}

else

{

$filtrotitulo="AND titulo= '". $titulo. "'";

$msg2= $categ;

}

?>

<div class="geral" >

<div class="corpo" id='centru' >

<?php

$conexao = mysql_connect("localhost","oreidosl_root","[email protected]");

$banco = mysql_select_db("oreidosl_augustojr10", $conexao);

$query = mysql_query("SELECT * FROM novapostagem WHERE usuario_id='1' $string $filtrotitulo ORDER BY id desc");

while($mostrar = mysql_fetch_array($query))

{

echo "<div class='post'>";

echo "<h3>" .'<a href="http://www.augustojr10.com.br/noticias.php?titulo='.$mostrar['titulo'].'"> '.$mostrar['titulo'].'</a>' ."<br>". "</h3>";

echo "<small>". $mostrar['data'] . '<br>' . "Postado por: " . $mostrar['autordotexto']. ' em'. '<a href=http://www.augustojr10.com.br/noticias.php?categoria='.$mostrar['categoria].'"> '.$mostrar['categoria'].'</a>' . '</small>'.'<br>' ;

echo $mostrar['corpodamensagem'] . "<br>";

echo "</div>";

}

mysql_close($conexao);

?>

Estrutura da tabela "novapostagem"

1 id int(200) Não None AUTO_INCREMENT Alterar Eliminar Mais

2 data timestamp Não CURRENT_TIMESTAMP Alterar Eliminar Mais

3 autordotexto text latin1_swedish_ci Não None Alterar Eliminar Mais

4 titulo text latin1_swedish_ci Não None Alterar Eliminar Mais

5 corpodamensagem text latin1_swedish_ci Não None Alterar Eliminar Mais

6 categoria text latin1_swedish_ci Não None Alterar Eliminar Mais

7 usuario_id int(200) Não 1 Alterar Eliminar Mais

Essa categoria aí recebe os valores que usa como categoria. Cada postagem só ta aceitando uma categoria. Eu queria saber como faço pra ter mais de uma categoria. Será que eu preciso criar outro campo "categoriaII"? Complica, porque se eu precisasse de uma postagem com 5 categorias ao mesmo tempo, seriam 6 campos a mais...

Eu quero saber como esses blogs fazem.

Um exemplo é esse blog aqui

http://blog.thiagobelem.net/criando-um-tem...dpress-parte-4/

Veja que o artigo desse link tem seis categorias distintas. Me ajudem com isso, por favor.

Agradeço a atenção de quem leu.

Edited by jefponte

Share this post


Link to post
Share on other sites

13 answers to this question

Recommended Posts

  • 0
Ninguém sabe?

Boa tarde,

Nesse seu caso, eu usaria uma tabela extra para guardar as categorias de cada artigo.

ex:

'tb_relacionamento'

id - chave primaria

id_cod_postagem - é o id do seu artigo/evento/noticia

nome_categoria - guardaria o nome da categoria (artigo/evento/noticia)

Nessa forma, cada nova postagem poderia ser relacionada a infinitas categorias (no seu caso: artigo/evento/noticia)

Ao mostrar a postagem, bastaria fazer a consulta relacionando os id's da tabela

tipo:

Mostrar todas as noticias:

select distinct t.titulo_postagem, t.data_postagem, (os campos aqui) from tb_postagens t, tb_relacionamento r where t.id_postagem=r.id_cod_postagem and r.nome_categoria='noticias' order by t.data_postagem desc

É claro que nesse exemplo está simplificado para 3 categorias apenas. Dependendo da aplicação, se tivesse tb infinitas categorias, criar uma tabela de categorias e relacionar tambem o id dessas categorias na 'tb_relacionamento'

Dê seu feedback!

Share this post


Link to post
Share on other sites
  • 0

Valeu pela ajuda, to ainda tentando entender e tentando ver como posso colocar em prática. Se puder explicar melhor, eu agradeceria.

Share this post


Link to post
Share on other sites
  • 0
Ninguém sabe?

Boa tarde,

Nesse seu caso, eu usaria uma tabela extra para guardar as categorias de cada artigo.

ex:

'tb_relacionamento'

id - chave primaria

id_cod_postagem - é o id do seu artigo/evento/noticia

nome_categoria - guardaria o nome da categoria (artigo/evento/noticia)

Nessa forma, cada nova postagem poderia ser relacionada a infinitas categorias (no seu caso: artigo/evento/noticia)

Ao mostrar a postagem, bastaria fazer a consulta relacionando os id's da tabela

tipo:

Mostrar todas as noticias:

select distinct t.titulo_postagem, t.data_postagem, (os campos aqui) from tb_postagens t, tb_relacionamento r where t.id_postagem=r.id_cod_postagem and r.nome_categoria='noticias' order by t.data_postagem desc

É claro que nesse exemplo está simplificado para 3 categorias apenas. Dependendo da aplicação, se tivesse tb infinitas categorias, criar uma tabela de categorias e relacionar tambem o id dessas categorias na 'tb_relacionamento'

Dê seu feedback!

Eu tentei pegar o que você me disse e fazer o relacionamento de algum jeito. Mas ainda estou entrando em um beco sem saída. Vou dizer aonde cheguei.

Agora são três tabelas, listando-as:

tb postagem

campos:

id, titulo, corpo, autor_id

tb categorias

campos:

id, categoria

tb relacionamento

id, Postagem_id, categoria_id

Então, dessa forma posso relacionar as tabelas e fazer de um jeito que eu relaciono uma postagem com várias categorias, através do Id da postagem sendo relacionada várias vezes com o id da categoria.

Parece que vai dar certo fazer isso. Através de um select para a postagem, depois um selecte para as categorias com filtro para categoria onde o seu id tem correspondente ao id da postagem na tabela relacionamento. Acho que posso fazer isso, ainda estou pensando nisso.

Mas um problema se faz presente. Como vai ser na hora de inserir as postagens? Como inserir junto com as postagens as sus categorias na tabela relacionamento? Vai ser mais complicado do que o que parece. Preciso de ajuda, alguém aqui já conseguiu fazer isso?

Share this post


Link to post
Share on other sites
  • 0

O que complica é o seguinte. Na hora de adicionar os dados eu precisarei do id da postagem para que a categoria seja adicionada com o id da postagem na tabela relacionamento. Mas eu não tenho como saber o id da postagem durante a inserção desta. Ele é uma chave primária adicionada na hora e automaticamente. Tem que ter um jeito eficiente de fazer isso, por favor, Sandro, me ajude.

Share this post


Link to post
Share on other sites
  • 0
O que complica é o seguinte. Na hora de adicionar os dados eu precisarei do id da postagem para que a categoria seja adicionada com o id da postagem na tabela relacionamento. Mas eu não tenho como saber o id da postagem durante a inserção desta. Ele é uma chave primária adicionada na hora e automaticamente. Tem que ter um jeito eficiente de fazer isso, por favor, Sandro, me ajude.

Use LAST_INSRERT_ID.

exemplo:

START TRANSACTION;

INSERT INTO tb_postagem(titulo, corpo, autor_id)
VALUES('afafafafa', 'gagagagag', 1);

SET @idpostagem = (select LAST_INSERT_ID());

INSERT INTO categorias(categoria)
VALUES('xxxx');

INSERT INTO tb_relacionamento(Postagem_id, categoria_id)
VALUES(@idpostagem, LAST_INSERT_ID());

Share this post


Link to post
Share on other sites
  • 0

Pode me explicar o que é que significa essa linha do SET? O que é esse SET?

SET @idpostagem = (select LAST_INSERT_ID());

Share this post


Link to post
Share on other sites
  • 0
Pode me explicar o que é que significa essa linha do SET? O que é esse SET?

SET @idpostagem = (select LAST_INSERT_ID());

Se você ler o manual verá que o comando SET é usado para atribuir um valor a uma variável ou a um campo.

Ainda lendo o manual, a instrução (select LAST_INSERT_ID()) retorna o ultimo elemento (autoincrementado) inserido pela instrução imediatamente anterior dentro da mesma transação.

Share this post


Link to post
Share on other sites
  • 0

Agora que eu estou me tocando. Esse @idpostagem é uma variável? Porque não escreveu $idpostagem? Também pode fazer usando "@" no lugar de "$"?

Share this post


Link to post
Share on other sites
  • 0
Agora que eu estou me tocando. Esse @idpostagem é uma variável? Porque não escreveu $idpostagem? Também pode fazer usando "@" no lugar de "$"?

Escrevi assim porque esta é a área de Banco de Dados de MySQL e não a área de PHP ou qualquer outra linguagem.

Share this post


Link to post
Share on other sites
  • 0

Oi, hoje coloquei em prática o que tentei resolver aqui. Agradeço muito a sua ajuda Denis, entretanto não consegui fazer do seu jeito.

O primeiro código,

insert.php

$sql="INSERT INTO parede (usuariologin, titulo, data, hora, corpo, usuario_id)
VALUES
('$_SESSION[Usuariologin]','$_POST[titulo]', '$datadehoje', '$hora' ,'$_POST[corpo]', '$_SESSION[UsuarioID]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }


SET @idpostagem = (select LAST_INSERT_ID());
    
  
  $sql2="INSERT INTO relacparedecat(categoria_id, parede_id)
  VALUES
  ('$_POST['categoriaid']', @idpostagem)";
  
  if (!mysql_query($sql2,$con))
  {
      die('Error: ' . mysql_error());
  }
---- exibiu o erro Parse error: syntax error, unexpected '@' in D:\web\gcsufc\bd\insertnaparede.php on line 53 Tentei mexer, coloquei aspas em algum ou outro lugar, mas não resolveu. Eu resolvi fazendo um select pegando o ultimo id. Dessa forma:
$sql="INSERT INTO parede (usuariologin, titulo, data, hora, corpo, usuario_id)
VALUES
('$_SESSION[Usuariologin]','$_POST[titulo]', '$datadehoje', '$hora' ,'$_POST[corpo]', '$_SESSION[UsuarioID]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }

  
  $selectultimoid= "SELECT id FROM parede ORDER BY id DESC LIMIT 1";
  $res = mysql_query($selectultimoid);
  while($fila = mysql_fetch_array($res))
  
  {
  
      $idpostagem=$fila['id'];
  
  }
  
  
  $sql2="INSERT INTO relacparedecat(categoria_id, parede_id)
  VALUES
  ('$_POST[categoriaid]', '$idpostagem')";
  
  if (!mysql_query($sql2,$con))
  {
      die('Error: ' . mysql_error());
  }

Acho que não consegui do seu jeito porque eu uso um arquivo .php, acho que desse jeito aí é usando um arquivo .sql, sei lá se é isso.

Bem, o problema foi resolvido. No meu site funciona um sistema de postagens com possibilidade de criação de várias categorias.

Estará online desse jeito aí na próxima semana em gcsufc.com.br

Denis, se você quiser me dizer porque não funcionou do seu jeito eu agradeceria. Desde já agradeço pela paciência e atenção.

Share this post


Link to post
Share on other sites
  • 0
Oi, hoje coloquei em prática o que tentei resolver aqui. Agradeço muito a sua ajuda Denis, entretanto não consegui fazer do seu jeito.

...

Denis, se você quiser me dizer porque não funcionou do seu jeito eu agradeceria. Desde já agradeço pela paciência e atenção.

Oi jefponte,

A sintaxe que escrevi é a usada dentro do Mysql para escrever códigos (triggers, storage procedures, functions).

Cada linguagem usa uma sintaxe diferente.

Você usa PHP e é comum, mas não é correto (pois existe uma área própria para PHP), voces postarem nesta área codigos em PHP.

Parabéns por ter conseguido corrigir seu código.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this