2011-03-25 2 views
1

Donc maintenant, j'ai un système "galerie" sur ma page d'accueil de mon site. Jetez un oeil:Réel grand noobie ici, comment utiliser mysql afin que je puisse éditer plusieurs pages facilement?

<?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>'; 
    ?> 

Ma table serait quelque chose comme ceci:

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) 

... Quoiqu'il en soit, comme vous pouvez le voir, avec ce système, chaque fois que j'insérer un nouvel enregistrement, il met à jour automatiquement mon Galerie. Maintenant, ma question est comment puis-je le faire quand j'insère un nouvel enregistrement, cela n'affecte pas seulement ma galerie de page d'accueil, il affecte également les galeries sur les autres sous-sections de mon site Web. Vous ne savez pas ce que je veux dire? Voici un exemple:

Dites que mon site s'appelle site.com. J'ai aussi des sous-dossiers pour site.com, qui incluent site.com/nature et site.com/stars. Je veux que mon site.com/nature contienne une galerie pour les seules photos d'étoiles et que mon site.com/stars soit une galerie pour les seules photos d'étoiles, alors que ma page d'accueil contient toutes les images, y compris les photos de la nature et des étoiles. mais je ne veux pas mettre à jour manuellement/nature ou/stars en créant des tables supplémentaires. Au lieu de cela, je veux juste utiliser une énorme table, qui contient toutes les images sur mon site, mais je peux spécifier si je veux que mon enregistrement s'affiche aussi (/ nature,/stars, etc) et pas seulement à la maison (qui contient toutes les images). Je suppose que j'aurais besoin d'une autre colonne (évidemment) pour spécifier les autres dossiers dans lesquels mon enregistrement doit apparaître, ou peut-être quelques instructions conditionnelles pour déterminer dans quel sous-dossier mon enregistrement devrait apparaître et pas seulement ma page d'accueil. Malheureusement, je suis un Noblet, donc je demande si quelqu'un peut donner un coup de main. Merci!

Répondre

1

Vous êtes sur la bonne voie, voici comment je structurer ce tableau, pour faire cette correction:

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; 

Notez la ligne de hors-bosselée ...

Modifier * Désolé n'a pas inclus la partie sur l'insertion. Voici le SQL que vous courriez pour insérer une image dans, par exemple, la « nature »:

INSERT INTO `images` (
`thumbnailID`, `folderID`, `link`, `pic`, `alt`, `time` 
) VALUES (
NULL, 'nature', 'some link', 'some picture', 'some alt text', 'some timestamp' 
) 

Notez que « thumbnailID » est vide, car MySQL remplira automatiquement en, car il est la clé primaire.

Fin Modifier *

Lorsque vous exécutez votre SQL dans un dossier spécifique, tel que le dossier « nature », voici comment vous, au fond, tirer toutes les données classées sous la rubrique « nature « :

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

espoir qui aide,
spryno724

+0

Veryyyyy sympa ^^, merci beaucoup!Je vais attendre ici un peu plus pour voir si quelqu'un a une meilleure idée heh. – user657847

+0

Pas un problème, mec! J'espère que cela aide. –

2

Ye s, vous avez raison. Le moyen rapide et facile est de créer une autre colonne. Mais, ce que vous devez faire est de créer un autre tableau, appelé sections ou quelque chose comme ça.Il devrait ressembler à ceci:

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

Et la nouvelle colonne que vous mettez dans votre table principale tient à la colonne id de ce tableau.

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

La dernière colonne là, sectionID, se réfère au second élément dans le tableau sections.

Ensuite, créez un dossier appelé /section/ et créez une nouvelle page PHP appelée section.php. Disons que vous voulez voir une section comme ceci:

http://example.com/section/section.php?section=nature

Vous obtenez la section avec $_GET['section'], et faire une comme SQL JOIN ceci:

SELECT * FROM `sections` JOIN `images` ON `images`.`sectionID` = `sections`.`id` WHERE `sections`.`name` = {section} 

Mettez la valeur de $_GET['section'] en place de {section}

Vous pouvez même changer de sorte que les articles sont accessibles comme ceci:

http://example.com/section/nature

Avec 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

+0

Bien que cela semble vraiment intuitive, je dois demander pourquoi faire tout cela? La méthode de Spryno semble plus facile, plus conviviale pour les moteurs de recherche avec une URL propre (je suis vraiment curieux, et j'y penserais certainement s'il y a un bon gain) – user657847

+0

@ user657847: Numéro 1, données en double. Numéro 2, il vous permet d'avoir un ensemble de sections fixes (mais dynamiques). Cela signifie que vous pouvez facilement ajouter une nouvelle section à la base de données, et c'est tout. Pas de création de nouveaux dossiers, rien. Il y a probablement plus de raisons, mais je ne peux pas y penser maintenant. Et ce n'est pas "moins convivial" SEO: voir la partie sur 'mod_rewrite'. – Jonah

2

Est-ce une image dans votre galerie jamais appartenir à deux ou plusieurs sections? Ou l'image appartiendra-t-elle seulement dans une galerie? Je suppose que les images peuvent exister dans de nombreuses galeries, car une image peut être d'étoiles et de la nature.

Si elles peuvent être postées, alors vous avez besoin de deux autres tables.

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

Ensuite, vous n'avez pas besoin de modifier votre tableau Images. Assurez-vous simplement que lorsque quelque chose est étiqueté, vous insérez une entrée dans Images_Folders de manière appropriée.

Pour obtenir toutes les images pour les étoiles, vous feriez:

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' 

Edit: Tagging signifie simplement qu'une image est dit appartenir à un groupe ou un dossier. Donc, si un utilisateur télécharge un dossier (ou vous le faites), il existera dans la table des images. Pour l'étiqueter, vous devez insérer une insertion dans la table images_folder. J'ai mélangé SQL et PHP là-bas, donc ça ne marche pas, mais ça devrait te donner ce dont tu as besoin.

+0

Ceci est très intuitif, nécessitera plus de travail qu'une table, mais je suppose que ce n'est pas si mal. Comment puis-je 'taguer' en passant? Je suis sûr que je sais ce que vous voulez dire, mais juste au cas où ... – user657847

+0

@ user657, je recommande fortement de refactoriser votre code. Pensez à examiner les frameworks PHP, ou même un ORM (object-relationnel-mappeur). Il vous permettra d'écrire du code d'accès aux données sans trop vous soucier de SQL. –

+0

Je ne suis pas sûr de ce que cela signifie ... Dès le début, je me suis dit d'apprendre php seulement pour créer ce site que j'avais en tête. Je suis très proche de la fin maintenant. Serait-il encore utile d'apprendre pour certaines raisons que je ne connais pas? Cela rendra-t-il mon flux de travail plus rapide, même si la seule chose que je vais probablement faire après avoir compris cela, serait de télécharger des images via MySQL et des trucs de blogs typables, et pas trop de code? – user657847

2

Il est important d'avoir plus d'une table la plupart du temps, de sorte que les données ne se répète pas, ce qu'on appelle la normalisation, dans votre exemple, vous voulez tables:

  1. tblImages
  2. tblGalleries

  3. tblImages

    • thumbnailID, lien, image, alt, temps, galleryID
  4. tblGalleries

    • galleryID, GalleryName

Ils contiennent un lien vers l'autre, c'est la clé (clé primaire dans tblGalleries et la clé étrangère de tblImages) .

Ma préférence serait de créer une 'procédure' 'procédure stockée' ou simplement dans MySQL, MySQL cela ressemblerait à ceci:

CREATE PROCEDURE spImage_Update @link varchar (50), @picture varchar (50), @alt varchar (50), @galleryID int

AS BEGIN

SET NOCOUNT ON;

INSERT INTO tblImages VALEURS (@link, @picture, @alt, @galleryID)

FIN

  • En définissant l'ID de la galerie, vous pouvez dire que la galerie que vous voulez qu'il soit dans.

Lorsque vous voulez sélectionner toutes les images, écrivez votre requête en tant que telle ...

SELECT * FROM tblImages

Lorsque vous voulez une galerie spécifique juste votre requête comme ...

'SELECT * FROM tblImages OÙ GalleryID = 1' ou « SELECT * FROM tblImages OÙ GalleryID = @GalleryID »

  • dans un SP.

Où exactement vous êtes bloqué.

Questions connexes