现在,我的网站主页上有一个“图库”系统。看看:
<?php
$objConnect = mysql_connect("mydb.db","hello","mypass") or die(mysql_error());
$objDB = mysql_select_db("mydb");
$pic2 = "SELECT * FROM gallery";
if (!isset($_GET['Page'])) $_GET['Page']='0';
$pic1 = mysql_query($pic2);
$Num_Rows = mysql_num_rows($pic1);
$Per_Page = 16; // Per Page
$Page = $_GET["Page"];
if(!$_GET["Page"])
{$Page=1;}
$Prev_Page = $Page-1;
$Next_Page = $Page+1;
$Page_Start = (($Per_Page*$Page)-$Per_Page);
if($Num_Rows<=$Per_Page)
{$Num_Pages =1;}
else if(($Num_Rows % $Per_Page)==0)
{$Num_Pages =($Num_Rows/$Per_Page) ;}
else
{$Num_Pages =($Num_Rows/$Per_Page)+1;
$Num_Pages = (int)$Num_Pages;}
$pic2 .=" order by GalleryID ASC LIMIT $Page_Start , $Per_Page";
$pic1 = mysql_query($pic2);
$cell = 0;
$link2 = "SELECT * FROM gallery";
$link1 = mysql_query($link2);
$link = mysql_fetch_array($link1);
$alt2 = "SELECT * FROM gallery";
$alt1 = mysql_query($alt2);
$alt = mysql_fetch_array($alt1);
echo '<div id="tablediv"><table border="0" cellpadding="17" cellspacing="0" class="table"><tr>';
while($pic = mysql_fetch_array($pic1))
{if($cell % 4 == 0) {
echo '</tr><tr>';}
if($cell == 2) {
echo '<td>reserved cell, ignore this</td>';
} elseif ($cell == 3) {
echo '<td>reserved cell, ignore this</td>';
} else {
echo '
<td><a href="/' . $link["link"] . '.php"><div class="image"><img src="https://s3.amazonaws.com/images/' . $pic["pic"] . '" alt="' . $alt["alt"] . ' /></div></a></td>'; }
$cell++;
}
echo '</tr></table></div>';
?>
我的表格是这样的:
CREATE TABLE `images` (
`thumbnailID` int(11) NOT NULL auto_increment,
`link` varchar(100) NOT NULL,
`pic` varchar(100) NOT NULL,
`alt` varchar(100) NOT NULL,
PRIMARY KEY (`thumbnailID`)
) ENGINE=MyISAM ;
INSERT INTO `images` VALUES ('', 'stars/beezlebub', 'beezlebub', 'this is beezlebub');
INSERT INTO `images` VALUES ('', 'nature/raretree', 'raretree', 'this is a rare tree');
INSERT INTO `images` VALUES ('', 'nature/lions', 'lions', 'these are lions');
INSERT INTO `images` VALUES ('', 'nature/tigers', 'tigers', 'these are tigers');
etc. (you get the point)
无论如何......正如您所看到的,使用此系统,每当我插入新记录时,它都会自动更新我的图库。现在我的问题是如何在插入新记录时这样做,它不仅影响我的主页库,它也会影响我网站其他小部分的图库。不确定我的意思?这是一个例子:
说我的网站名为site.com。我还有site.com的子文件夹,其中包括site.com/nature和site.com/stars。我希望我的site.com/nature只包含一个只有星级照片的画廊,而我的site.com/stars只能作为明星照片的画廊,而我的主页包含所有图像,包括自然和星星照片。但我不想通过创建额外的表来手动更新/ nature或/ stars。相反,我只想使用一个巨大的表,其中包含我网站上的所有图像,但是这样我就可以指定我是否希望我的记录也显示(/ nature,/ stars等)而不仅仅是home(哪个)包含所有图像)。
我认为我需要另一列(显然)来指定我希望我的记录出现在哪些其他文件夹中,或者可能需要一些条件语句来确定我的记录应该出现在哪个子文件夹中,而不仅仅是我的主页。不幸的是,我是一个nooblet,所以我问是否有人可以伸出援助之手。谢谢!
答案 0 :(得分:2)
是的,你是对的。快速,简便的方法是创建另一列。
但是,你应该做的是创建另一个表,称为sections
或类似的东西。它应该是这样的:
----------------
| id | name |
----------------
| 1 | stars |
| 2 | nature |
...
您放入主表的新列将指向此表的id
列。
------------------------------------------------------------------
| thumbnailID | link | pic | alt | sectionID |
------------------------------------------------------------------
| 1 | ... | raretree | this is ... | 2 |
...
其中的最后一列sectionID
是指表sections
中的第二项。
接下来,创建一个名为/section/
的文件夹,并在其中创建一个名为section.php
的新PHP页面。假设您想要查看这样的部分:
http://example.com/section/section.php?section=nature
你得到$_GET['section']
的部分,并像这样做一个SQL JOIN
:
SELECT * FROM `sections` JOIN `images` ON `images`.`sectionID` = `sections`.`id` WHERE `sections`.`name` = {section}
将$_GET['section']
的值替换为{section}
您甚至可以更改它,以便像这样访问部分:
http://example.com/section/nature
mod_rewrite
。
http://www.snipe.net/2009/02/practical-mod_rewrite/
http://en.wikipedia.org/wiki/Cardinality_(data_modeling)
http://www.webdesign.org/web-programming/php/mysql-join-tutorial.14876.html
答案 1 :(得分:2)
您图库中的图片是否属于两个或更多部分?或者图像是否只属于一个图库?我假设图像可以存在于许多画廊中,因为图像可能是星星和自然。
如果他们可以交叉发布,那么你需要另外两个表。
Images
Folders(id, name)
Images_Folders(image_id, folder_id)
然后您无需更改Images表。只需确保当某些内容被“标记”时,您就可以适当地在Images_Folders中插入一个条目。
要获取星星的所有图像,您需要:
SELECT i.*
FROM images i
JOIN images_folders if ON i.id = if.image_id
JOIN folders f on f.id = if.folder_id
WHERE folder_name = 'stars'
编辑:
标记只意味着图像被认为属于特定的组或文件夹。因此,如果用户上传文件夹(或您这样做),它将存在于图像表中。要“标记”它,您需要插入images_folder
表。
$folder = 'stars';
$image_id = 4;
INSERT INTO images_folder (image_id, folder_id)
SELECT image_id = $image_id,
folder_id = (SELECT folder_id FROM folders WHERE name = $folder)
我在那里混合了SQL和PHP,所以这不是代码,但它应该能满足你的需求。
答案 2 :(得分:2)
在大多数情况下拥有多个表是非常重要的,这样就不会重复数据,这称为规范化,在您想要表格的示例中:
tblGalleries
tblImages
tblGalleries
它们包含彼此的链接,这是密钥(tblGalleries中的主键和tblImages的外键)。
我的偏好是在MySQL中创建一个'存储过程'或简单的'过程',在MySQL中这看起来像这样:
CREATE PROCEDURE spImage_Update @link varchar(50),@ picture varchar(50), @alt varchar(50),@ galleryID int
AS BEGIN
设置NOCOUNT ON;
插入tblImages值(@link, @picture,@ salt,@ galleryID)
END
如果要选择所有图像,请按原样编写查询...
SELECT * FROM tblImages
如果您想要一个特定的图库,只需将您的查询视为......
'SELECT * FROM tblImages WHERE GalleryID = 1'或'SELECT * FROM tblImages WHERE GalleryID = @GalleryID'
你到底在哪里。
答案 3 :(得分:1)
你是在正确的轨道上,这是我将如何构建这个表,以进行此更正:
CREATE TABLE `images` (
`thumbnailID` int(11) NOT NULL auto_increment,
`folderID` varchar(100) NOT NULL,
`link` varchar(100) NOT NULL,
`pic` varchar(100) NOT NULL,
`alt` varchar(100) NOT NULL,
`time` varchar(100) NOT NULL,
PRIMARY KEY (thumbnailID))
ENGINE=MyISAM;
注意外行...
修改 * 抱歉没有包含有关插入的部分。下面是用于插入图片的SQL,例如“nature”:
INSERT INTO `images` (
`thumbnailID`, `folderID`, `link`, `pic`, `alt`, `time`
) VALUES (
NULL, 'nature', 'some link', 'some picture', 'some alt text', 'some timestamp'
)
请注意,“thumbnailID”为空,因为MySQL会自动将其填入,因为它是主键。
结束编辑 *
当您在特定文件夹(例如“nature”文件夹)中运行SQL时,基本上,您将如何提取“自然”下分类的所有数据:
SELECT * FROM `images` WHERE `folderID` = 'nature' ORDER BY `thumbnailID` ASC;
希望有所帮助,
spryno724