Avatar billede Slettet bruger
11. juni 2009 - 14:03 Der er 8 kommentarer og
1 løsning

Kategorier i nyhedssystem

Hej.

Jeg er igang med at lave et nyhedssystem med kategorier, men kan ikke få det til at virke.

Min kategori-tabel ser således ud:

CREATE TABLE `r_category` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(225) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `r_category` (`id`, `name`) VALUES
(1, 'Spil'),
(2, 'Kasserolle');

I min nyheds-tabel har jeg et felt der hedder category, og der skal det se således ud når den tilføjer kategorier: 1;2;3

Det virker alt det der med at tilføje det hele, men når man så skal søge, så kan jeg ikek få det til at virke. Min kode indtil videre:




if($_GET[cat] != "") {

$get_news2 = mysql_query("SELECT * FROM r_news ORDER BY id DESC") or die(mysql_error());

while($show_news2 = mysql_fetch_array($get_news2)) {

// Find category 1
$getcategory1 = substr($show_news2[category], 0, 1);
// Find category 2
$getcategory2 = substr($show_news2[category], 2, 1);

$getcat = $_GET[cat];

$get_category = mysql_query("SELECT * FROM r_category WHERE name LIKE '$getcat'") or die(mysql_error());

$show_category = mysql_fetch_array($get_category);

$categoryid = $show_category[id];

// Check if the news has that ID in the categories
if($getcategory1 == $categoryid) {
$cat = "WHERE category = '$categoryid'";
echo $cat;
}


}
}




$get_news = mysql_query("SELECT * FROM r_news $cat ORDER BY id DESC limit $s,$pr_side") or die(mysql_error());

while($show_news = mysql_fetch_array($get_news)) {



Jeg håber der er nogle der kan hjælpe.
Avatar billede repox Seniormester
11. juni 2009 - 14:14 #1
Det havde faktisk været smartere med en tabel mere:
| newsId | categoryId |

Så hvis en nyhed er en del af tre kategorier ville du have tre entries for den nyhed, og hvis en anden kun er med i to kategorier vil du selvfølgelig have to entries:

| 12 | 1 |
| 12 | 2 |
| 12 | 3 |
| 13 | 1 |
| 13 | 3 |

Så ville du skulle lave noget ala:

<?php
if(isset($_GET["cat"]))
    $sql = "SELECT a.* FROM r_news a, linkedCategories b WHERE a.newsId = b.newsId and b.categoryId = ".$_GET["cat"]." ORDER BY id DESC limit ".$s.", ".$pr_side;
else
    $sql = "SELECT * FROM r_news ORDER BY id DESC limit ".$s.", ".$pr_side;

$get_news = mysql_query($sql) or die(mysql_error());

?>
Avatar billede Slettet bruger
11. juni 2009 - 14:42 #2
Okay. Jeg har brug for lidt mere hjælp end blot det.

Se, problemet er at det ikke kun er tre kategorier hver nyhed kan få, de kan få så "uendeligt".

Så jeg har brug for en anden løsning end en der kun bygger på tre kategorier.
Jeg har fusket mig frem til det her nu:

CREATE TABLE `r_ncategory` (
  `newsid` varchar(225) NOT NULL,
  `categoryid` varchar(225) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `r_ncategory` (`newsid`, `categoryid`) VALUES
('1', '2'),
('1', '2'),
('2', '2');

Og koden ser nu således ud:

$getcat = $_GET[cat];

$get_category = mysql_query("SELECT * FROM r_category WHERE name LIKE '$getcat'") or die(mysql_error());

$show_category = mysql_fetch_array($get_category);

$get_ncategory = mysql_query("SELECT * FROM r_ncategory WHERE categoryid LIKE '$show_category[id]'") or die(mysql_error());
while($show_ncategory = mysql_fetch_array($get_ncategory)) {

$cat = "WHERE id = '$show_ncategory[newsid]'";

}
}

$get_news = mysql_query("SELECT * FROM r_news $cat ORDER BY id DESC limit $s,$pr_side") or die(mysql_error());

while($show_news = mysql_fetch_array($get_news)) {



Men problemet er at den kun henter en nyhed, hvis der er den finder en kategori, og hvis den ikke finder nogen så lister den alle. Har du andre forslag end lige det ovenfor, fordi jeg forstod sådan set ikke så forfærdeligt meget af det.
Avatar billede repox Seniormester
11. juni 2009 - 14:53 #3
Din tabel r_ncategory er i princippet det, men den ekstra tabel, som jeg foreslog.

Men jeg forstår ikke hvad der var i vejen med den kode jeg foreslog?
Hvis det er fordi ikke forstår hvordan koden skal implementeres, så skal jeg se mere kode end det du viser der, som tabelstrukturen over dine nyheder og den kildekode der viser dine nyheder.

Den kode du selv er kommet frem til er vildt uforståelig.
Avatar billede Slettet bruger
11. juni 2009 - 15:04 #4
Okay, jeg har smidt din kode ind.

if(isset($_GET["cat"])) {
$sql = "SELECT a.* FROM r_news a, r_ncategory b WHERE a.newsid = b.newsid and b.categoryid = ".$_GET["cat"]." ORDER BY id DESC limit ".$s.", ".$pr_side;
}else{
$sql = "SELECT * FROM r_news ORDER BY id DESC limit ".$s.", ".$pr_side;
}

$get_news = mysql_query($sql) or die(mysql_error());
while($show_news = mysql_fetch_array($get_news)) {


Men når jeg søger efter kategori, så får jeg en fejl: Unknown column 'a.newsid' in 'where clause'

Okay, her kommer så mine tabeller:



CREATE TABLE `r_category` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(225) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `r_category` (`id`, `name`) VALUES
(1, 'Spil'),
(2, 'Kasserolle');




CREATE TABLE `r_news` (
  `id` int(10) NOT NULL auto_increment,
  `text` longtext NOT NULL,
  `title` varchar(225) NOT NULL,
  `author` varchar(225) NOT NULL,
  `created` varchar(225) NOT NULL,
  `page` varchar(225) NOT NULL,
  `category` varchar(225) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;


INSERT INTO `r_news` (`id`, `text`, `title`, `author`, `created`, `page`, `category`) VALUES
(5, 'gewgwe', 'Mike', 'B74bzFKWNPuSh6fJ398DEpcAqXUwLM', '11.06.2009 13:49:07', '', '1');
(6, 'gewgwe', 'Mike', 'B74bzFKWNPuSh6fJ398DEpcAqXUwLM', '11.06.2009 13:49:07', '', '1;2');
(7, 'gewgwe', 'Mike', 'B74bzFKWNPuSh6fJ398DEpcAqXUwLM', '11.06.2009 13:49:07', '', '3');



CREATE TABLE `r_ncategory` (
  `newsid` varchar(225) NOT NULL,
  `categoryid` varchar(225) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `r_ncategory` (`newsid`, `categoryid`) VALUES
('5', '1'),
('6', '1'),
('6', '2'),
('7', '3');
Avatar billede repox Seniormester
11. juni 2009 - 15:08 #5
Så prøv det her istedet:

if(isset($_GET["cat"]))
    $sql = "SELECT a.* FROM r_news a, r_ncategory b WHERE a.id = b.newsid and b.categoryid = ".$_GET["cat"]." ORDER BY id DESC limit ".$s.", ".$pr_side;
else
    $sql = "SELECT * FROM r_news ORDER BY id DESC limit ".$s.", ".$pr_side;
Avatar billede Slettet bruger
11. juni 2009 - 15:18 #6
Okay.

Det virker næsten nu. Det eneste problem er at det kun virker med ID.

?cat=2 virker - men ?cat=spil virker ikke.

Hvorfor virker ikke det her:

$sql = "SELECT a.* FROM r_news a, r_ncategory b, r_category c WHERE a.id = b.newsid and b.categoryid = c.id and c.name = ".$_GET["cat"]." ORDER BY id DESC limit ".$s.", ".$pr_side;
Avatar billede repox Seniormester
11. juni 2009 - 15:25 #7
...

Hvis du gerne vil have den til at virke med kategori navnet istedet, skal du gøre således:
if(isset($_GET["cat"]))
    $sql = "SELECT a.* FROM r_news a, r_ncategory b, r_category c WHERE a.id = b.newsid AND b.categoryid = c.id AND c.name='".$_GET["cat"]."' ORDER BY id DESC limit ".$s.", ".$pr_side;
else
    $sql = "SELECT * FROM r_news ORDER BY id DESC limit ".$s.", ".$pr_side;

Jeg ved ikke hvorfor din sql sætning ikke virker, det må dit script jo kunne fortælle dig?
Avatar billede Slettet bruger
11. juni 2009 - 16:01 #8
Mange tak. Smid et svar. :)
Avatar billede repox Seniormester
11. juni 2009 - 16:08 #9
Det kom her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester