Проблем с под категории на каталог

  • Автор Автор zazbg
  • Начална дата Начална дата

zazbg

Registered
Здравейте , имам един каталог за филми , но имам проблем при извличането на информация от базата с данни .
Подкатегорите на филмите се записват в базата със запетайка , ето така изглежда в базата с данни : 8,18,26,
Обаче като се взима информация от базата се взима всяко едно число и за това отчида да речеме във нашият случай вместо 3 категории отчита 6 .
автоматично добавя и категория 1 - 2 - 6 прощо застото цислата са в базата с данни ....
Какво да променя в кода за да се оправи това .
Ето и кода :


<?php
$access = "true";
include_once "header.php";
?>
<div id="content-wrap">
<div id="main">
<h2>Каталог</h2>
<center>
<p>
<?php
$act = $_GET['act'];
switch ($act)
{

default:
$a = mysql_query("SELECT * FROM cats ORDER by id") or die(mysql_error());
$b = mysql_num_rows($a);
if ($b > 0)
{
while ($c = mysql_fetch_array($a))
{
$id = $c['id'];
$name = $c['name'];
echo "<a href='video.php?act=browse&cid=$id'>Каталог $name</a>    ";
}
}
else
{
echo "Няма открити каталози.";
}
break;

case 'browse':
$cid = $_GET['cid'];
if (isset($cid) and !empty($cid) and $cid > 0)
{
$d = mysql_query("SELECT * FROM cats WHERE id='$cid'") or die(mysql_error());
$e = mysql_num_rows($d);
if ($e > 0)
{
$f = mysql_query("SELECT * FROM subcats WHERE cat='$cid' ORDER by id") or die(mysql_error());
$g = mysql_num_rows($f);
if ($g > 0)
{
echo "<form method='POST'>";
echo "<table>";
echo "<tr>";
$aa = 0;
while ($h = mysql_fetch_array($f))
{
$aa++;
$id = $h['id'];
$name = $h['name'];
echo "<td><a href='video.php?act=browse&cid=$cid&subcat=$id'>$name</a> <input type='checkbox' name='subcat[]' value='$id' style='vertical-align: middle;'></td>";
if ($aa > 3)
{
$aa = 0;
echo "</tr><tr>";
}
}
echo "</tr>";
echo "</table>";
echo "<center><input type='submit' name='submit' value='Покажи'></center>";
echo "</form>";
if (isset($_POST['submit']))
{
$subcat = $_POST['subcat'];
$ss = 0;
if (isset($subcat) and !empty($subcat))
{
foreach ($subcat as $subid)
{
$ss++;
if ($ss > 1)
{
$usloviea .= "or subcat LIKE '%$subid,%' ";
$cata .= "-$subid";
}
else
{
$usloviea .= "subcat LIKE '%$subid,%' ";
$cata .= "$subid";
}
}
$uslovie = "WHERE cat='$cid' and ".$usloviea." ORDER by id DESC";
$pagea = "video.php?act=browse&cid=$cid&subcat=$cata";
}
else
{
$uslovie = "WHERE cat='$cid' ORDER by id DESC";
$pagea = "video.php?act=browse&cid=$cid";
}
}
else
{
$sid = $_GET['subcat'];
if (isset($sid) and !empty($sid) and $sid > 0)
{
$pagea = "video.php?act=browse&cid=$cid&subcat=$sid";
$tire = explode("-",$sid);
if (count($tire) > 1)
{
$sss = 0;
foreach ($tire as $subcatid)
{
$sss++;
if ($sss > 1)
{
$uslovieb .= "or subcat LIKE '%$subcatid,%' ";
}
else
{
$uslovieb .= "subcat LIKE '%$subcatid%' ";
}
}
$uslovie = "WHERE cat='$cid' and $uslovieb ORDER by id DESC";
}
else
{
$uslovie = "WHERE cat='$cid' and subcat LIKE '%$sid,%' ORDER by id DESC";
}
}
else
{
$uslovie = "WHERE cat='$cid' ORDER by id DESC";
$pagea = "video.php?act=browse&cid=$cid";
}
}
$j = mysql_query("SELECT * FROM movies $uslovie") or die(mysql_error());
$k = mysql_num_rows($j);
if ($k > 0)
{
if(!isset($_GET['page']))
{
$page = 1;
}
else
{
if (is_numeric($_GET['page']) and $_GET['page'] > 0)
{
$page = $_GET['page'];
}
else
{
$page = 1;
}
}
echo "<table>";
echo "<tr><td class='result'>";
$max_results = $movies_per_page;
$from = (($page * $max_results) - $max_results);
$mysql = mysql_query("SELECT * FROM movies $uslovie LIMIT $from, $max_results");
$obshto = ceil(mysql_num_rows(mysql_query("SELECT * FROM movies $uslovie")) / $max_results);
if ($page > $obshto)
{
echo "Страницата не е намерена.";
}
else
{
echo "<table border='0' cellspacing='2' align='center'>";
while($r = mysql_fetch_array($mysql))
{
$vid = htmlspecialchars($r['id']);
$story = htmlspecialchars($r['story']);
$title = htmlspecialchars($r['name']);
$pic = htmlspecialchars($r['pic']);
$info = htmlspecialchars($r['info']);
if($pic != null)
{
$img = $pic;
}
else
{
$img = $noimg;
}
echo "<tr>";
echo "<td valign='top' class='resulttd'><a href='view.php?id=$vid' title='$title'><img src='$img' border='0' width='150' ></a></td>";
echo "<td class='infototd' valign='top'><a href='view.php?id=$vid' title='$title'><b>$title</b></a><br>$story</br></td>";
echo "</tr>";
}
echo"</table>";
echo "<br>";
echo "<center>Страници:  ";
$total_results = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM movies $uslovie"),0);
$total_pages = ceil($total_results / $max_results);
for($i = 1; $i <= $total_pages; $i++)
{
if(($page) == $i)
{
echo "$i ";
}
else
{
echo "<a href='$pagea&page=$i'>$i</a> ";
}
}
}
echo "</td></tr>";
echo "</table>";
}
else
{
echo "Няма намерени филми.";
}
}
else
{
echo "Няма намерени жанрове.";
}
}
else
{
echo "Каталога не е намерен.";
}
}
else
{
echo "Каталога не е намерен.";
}
break;

}
?>
</p>
</center>
<?php include_once "adsense.php"; ?>
<br />
</div>
<div id="sidebar">
<?php include_once "stats.php"; ?>
<?php include_once "friends.php"; ?>
</div>
</div>
<?php include_once "footer.php"; ?>
 
Намерих един код който работи , но не знам как да го вградя в горният код .
Моля ако някой може да вземе част от този код и да преправи горният така че да работи .... Давам точка .


<?php
$access = "true";
include_once "header.php";
?>
<div id="content-wrap">
<div id="main"> <a name="TemplateInfo"></a>
<h2>Филми</h2>
<center>
<p>
<?php
$gid = $_GET['id'];
$result = mysql_query("SELECT * FROM movies where id='$gid'");
$count = mysql_num_rows($result);
if ($count > 0)
{
while($r = mysql_fetch_array($result))
{
$url = htmlspecialchars($r['url']);
$name = htmlspecialchars($r['name']);
$director = htmlspecialchars($r['director']);
$story = $r['story'];
$cast = htmlspecialchars($r['cast']);
$year = htmlspecialchars($r['year']);
$duration = htmlspecialchars($r['duration']);
$country = htmlspecialchars($r['country']);
$subcata = $r['subcat'];
$subcatb = explode(",",$subcata);
$cats = count($subcatb) - 1;
for ($i=0; $i <= $cats-1; $i++)
{
$subcatc = $subcatb[''.$i.''];
$suba = mysql_query("SELECT * FROM subcats WHERE id='$subcat'") or die(mysql_error());
$subb = mysql_fetch_array($suba) or die(mysql_error());
$subid = $subb['id'];
$subname = $subb['name'];
$category = $subb['cat'];
if ($i < $cats-1)
{
$subcatresult .= "<a href='video.php?act=browse&cid=$category&subcat=$subid'>$subname</a> , ";
}
else
{
$subcatresult .= "<a href='video.php?act=browse&cid=$category&subcat=$subid'>$subname</a>";
}
}
echo "<center>";
echo "<table><tr><td class='view'><b>Вие гледате</b> <font color='red'><b>$name</b></font></td></tr></table>";
echo "<object>";
echo "<script type='text/javascript' src='player/jwplayer.js'></script>";
echo "<div id='fp1'></div><embed name='mmfp_475' id='mmfp_475' type='application/x-shockwave-flash'
pluginspage='http://www.macromedia.com/go/getflashplayer' width='470' height='320' bgcolor='000000' src='player/player.swf' allowfullscreen='true' allowscriptaccess='always' flashvars='
&file=$url&volume=100&autostart=true&stretching=fill&controlbar=bottom'></embed>";
echo "</embed></object>";
echo "<table><tr><td class='view'><b>Режисьор:</b> $director</td></tr></table>";
echo "<table><tr><td class='view'><b>Сюжет:</b> $story</td></tr></table>";
echo "<table><tr><td class='view'><b>Участват:</b> $cast</td></tr></table>";
echo "<table><tr><td class='view'><b>Жанр:</b> $subcatresult</td></tr></table>";
echo "<table><tr><td class='view'><b>Времетраене:</b> $duration</td></tr></table>";
echo "<table><tr><td class='view'><b>Държава:</b> $country</td></tr></table>";
echo "<table><tr><td class='view'><b>Година:</b> $year</td></tr></table>";
echo "</center>";
}
}
else
 
Ще ти обясня как да го оправиш, но първо ще ти обясня и причината за тази грешка.

Структурата на базата данни е неправилна. Когато за един запис (един филм) трябва да запазиш множество от други, свръзани, ресурси (категориите на филма), трябва да направиш отделна таблица само за тях, с връзка към таблицата с филмите. MySQL е релационна база данни, което означава, че основното и "предназначение" е да има някаква релация, някаква врзъка между таблиците, а не всичко да се пази в една таблица. Правилната структура в твоя случай би трябвало да е нещо като това:

[sql]create table category (
id int(10) unsigned not null primary key auto_increment,
name varchar(255) not null unique
);

create table movie (
id int(10) unsigned not null primary key auto_increment,
title varchar(255) not null,
);

create table movie_category (
id c primary key auto_increment,
movie_id int(10) unsigned not null,
category_id int(10) unsigned not null,
);[/sql]

В прървата таблица записваш категориите. Във втората таблица записваш информацията за филма, но без категориите. Тази таблица ти генерира ID номера на филма. Във третата таблица имаш само числа - ID на филма и ID на категорията. Така за един филм можеш да имаш неограничен брой категории и търсенето става с една обикновенна заявка.

Защо се получава грешка в твоя случай? В кода който си дал се използва LIKE за да се търси по категория:
[sql]LIKE '%$subid,%'[/sql]

[sql]LIKE '%$subid,%'[/sql]

Преведено на нормален език, това условие означава - покажи ми всички филми, за които, в колоната за категория има избрания номер, следван от запетайка, а пред него има всякакви други символи. Или този пример:

[sql]$subid = 6;
LIKE '%6,%'[/sql]

Съвсем правилно ще ти покаже филми, които са в категориите 6, 16, 26, 946 и т.н.

Твоя код е за търсене в базата данни със филми, докато втория код който си намерил, не е за търсене, а за показване на информация. Виж, че там извеждаш информацията (select * from movies....) и след като вече разполагаш с категориите (explode...), изпълняваш отделни заявки за да вземеш имената им (което също не е правилно, защото може и с една заявка).

Най-бързото и елементарно решение е да промениш тези редове по-долу в твоя код, но това не е добро решение, защото тръсенето ще е бавно. Едва ли базата ти данни със филми е голяма, и най-вероятно забавянето няма да е видимо, но все пак, това не е правилния начин. По-добре оправи структурата на таблиците.

Навсякъде където имаш търсене с LIKE, замени го с този ред. Така обхващаш доста повече варианти
Код:
$usloviea .= "or ( subcat LIKE '$subid,%' ) or (subcat LIKE '%,$subid,%' )  or (subcat LIKE '%,$subid' )  or ( subcat = '$subid'  )   ";

Преведено на нормален език, това означава - намери ми всички филми, за които съдържат избраната категория или в началото, или по средата, или в края или пък само тази конкретна категория. Или:

Код:
$subid = 6;
$usloviea .= "or ( subcat LIKE '6,%' ) or (subcat LIKE '%,6,%' )  or (subcat LIKE '%,6' )  or ( subcat = '6'  )   ";

Което вече ще изведе правилните резултати:
6,23,45
23,6,45
23,45,6
6

но не и 16, 26,965
 
Ако някой би могъл да преправи системата , така че да работи правилно , бих могъл да си платя .
 

Back
Горе