Действительно большой noobie здесь, как использовать MySQL, чтобы я мог легко редактировать несколько страниц? - PullRequest
1 голос
/ 26 марта 2011

Итак, сейчас у меня есть система "галерей" на моей домашней странице моего сайта. Взгляните:

<?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 и т. Д.), А не только домашнюю (которая содержит все изображения).

Полагаю, мне понадобится еще один столбец (очевидно), чтобы указать, в каких других папках я хочу, чтобы моя запись отображалась, или, возможно, некоторые условные операторы, чтобы определить, в какой подпапке должна также отображаться моя запись, а не только на моей домашней странице. К сожалению, я негодяй, поэтому я спрашиваю, может ли кто-нибудь помочь. Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 марта 2011

Важно иметь больше одной таблицы большую часть времени, чтобы данные не повторялись, это называется нормализацией, в вашем примере вы хотите таблицы:

  1. tblImages
  2. tblGalleries

  3. tblImages

    • thumbnailID, ссылка, изображение, альтернативное время, galleryID
  4. tblGalleries

    • galleryID, galleryName

Они содержат ссылку друг на друга, это ключ (первичный ключ в tblGalleriesи внешний ключ tblImages).

Я бы предпочел создать «хранимую процедуру» или просто «процедуру» в MySQL, в MySQL это будет выглядеть так:

ПРОЦЕДУРА СОЗДАНИЯ spImage_Update @link varchar (50), @picture varchar (50), @alt varchar (50), @galleryID int

КАК НАЧАТЬ

УСТАНОВИТЬ НОКУНТ НА;

ВСТАВЬТЕ В ЗНАЧЕНИЯ tblImages (@link, @picture, @alt, @galleryID)

END

  • УстановивAllery ID вы можете указать, в какой галерее вы хотите, чтобы он был.

Если вы хотите выбрать все изображения, напишите свой запрос следующим образом ...

SELECT *ИЗ tblImages

Когда вы хотите конкретную галерею, просто запросите как ...

'ВЫБРАТЬ * ИЗ ТАБЛИЦ ГДЕ GalleryID = 1' или 'ВЫБРАТЬ * ИЗ ОБЗОРОВ ГДЕGalleryID = @ GalleryID '

  • в SP.

Где именно вы застряли.

2 голосов
/ 26 марта 2011

Да, вы правы.Быстрый и простой способ - создать еще один столбец.

Но на самом деле вам нужно создать еще одну таблицу , которая называется sections или что-то в этом роде.Это должно выглядеть так:

----------------
| id | name    |
----------------
| 1  | stars   |
| 2  | nature  |
...

И новый столбец, который вы поместите в основную таблицу, будет указывать на столбец id этой таблицы.

------------------------------------------------------------------
| thumbnailID | link       | pic       | alt         | sectionID |
------------------------------------------------------------------
| 1           | ...        | raretree  | this is ... | 2         |
...

Последний столбец, sectionID, относится ко второму элементу в таблице sections.

Затем создайте папку с именем /section/ и создайте в ней новую страницу PHP с именем section.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

2 голосов
/ 26 марта 2011

Будет ли изображение в вашей галерее принадлежать двум или более разделам?Или изображение будет принадлежать только одной галерее?Я предполагаю, что изображения могут существовать во многих галереях, так как изображение может быть со звездами и природой.

Если они могут быть перекрестно опубликованы, то вам нужны еще две таблицы.

Images 
Folders(id, name)
Images_Folders(image_id, folder_id)

Тогда вам не нужно менять таблицу изображений.Просто убедитесь, что когда что-то «помечено», что вы вставляете запись в 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, так что это не рабочий код, но он должен дать вам то, что вынеобходимо.

1 голос
/ 26 марта 2011

Вы на правильном пути, вот как я бы структурировал эту таблицу, чтобы внести эту поправку:

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 автоматически заполнит его, поскольку это первичный ключ.

Конец редактирования *

Когда вы запускаете свой SQL в определенной папке, например в папке "nature", вот как вы, в основном, извлекаете все данные, относящиеся к категории "nature":

SELECT * FROM `images` WHERE `folderID` = 'nature' ORDER BY `thumbnailID` ASC;

Надеюсь, это поможет,
spryno724

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...