За последние 24 часа нас посетили 22533 программиста и 1277 роботов. Сейчас ищут 842 программиста ...

Вывод из БД галереи-дерева

Тема в разделе "PHP и базы данных", создана пользователем newstarter, 3 сен 2012.

  1. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Уважаемые знатоки и умельцы форума!

    Прошу не пугаться объема этого сообщения. Очень нужна ваша помощь в организации, составлении запроса и извлечении из БД данных! Большая просьба также не отвечать ссылками на тонны познавательной информации, требующей большого времени на изучение. Если вы можете помочь, пожалуйста внесите исправления в прилагаемый код или структуру таблиц. Заранее СПАСИБО за внимание, терпение и участие‼!

    Имеется код поальбомной галереи реализуемой в виде «дерева» - при клике на имя альбома нужен вывод из базы мини-картинок к этому альбому.

    Код (Text):
    1. <?
    2.  
    3. include ("blocks/bd.php");
    4.  
    5. if (isset($_GET['alb'])) {$alb = $_GET['alb']; }
    6. if (!isset ($alb)) {$alb = 1;}
    7.  
    8. $result = mysql_query("SELECT * FROM albums_gal",$db);
    9.  
    10. $myrow = mysql_fetch_array($result);
    11.  
    12. ?>
    13.  
    14. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    15. <html>
    16. <head>
    17. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    18. <title>Tree_Adapted</title>
    19. <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" />
    20. <script src="js/tree.js" type="text/javascript"></script>
    21. </head>
    22. <body>
    23. <div class="mb_content">                   
    24.                         <h2>АЛЬБОМЫ</h2>
    25.                         <div class="mb_content_inner">
    26.                             <p>Здесь вы можете смотреть работы в тематических альбомах.</p>
    27. <div class="step2" onclick="tree_toggle(arguments[0])">
    28. <ul class="Container">
    29.   <li class="Node IsRoot ExpandClosed">
    30.     <div class="Expand"></div>
    31.     <div class="Content">
    32.         <?php echo $myrow["alb"]; ?>
    33.     </div>
    34.     <ul class="Container">
    35.       <li class="Node ExpandLeaf IsLast">
    36.         <div class="Expand"></div>
    37.         <div class="Content">
    38.         <ul id="mb_imagelist" class="mb_imagelist">
    39. <?
    40.  
    41. $result2 = mysql_query ("SELECT * FROM pictures WHERE alb='$alb'",$db);
    42. $myrow2 = mysql_fetch_array($result2);
    43.  
    44. if (mysql_num_rows($result2) > 0)
    45. {
    46. do
    47.  
    48. {
    49. printf ("<li><img src='%s' alt='%s' data-bgimg='%s'/></li>",$myrow2["mini_img"], $myrow2["title"], $myrow2["img"]);
    50. }
    51.  
    52. while ($myrow2 = mysql_fetch_array($result2));
    53.  
    54. }
    55. ?>
    56.         </ul>
    57.         </div>
    58.       </li>
    59.     </ul>
    60.   </li>
    61. </ul>
    62. </div>
    63.  
    64.  
    65.                         </div>
    66. </div>
    67. </body>
    68. </html>
    Я так понимаю, и альбомы, и мини-картинки должны выводится из БД в циклах.

    Создал 2 таблицы – albums (для альбомов) и pictures (для мини-картинок).

    Код (Text):
    1. --
    2. -- Table structure for table `albums`
    3. --
    4.  
    5. CREATE TABLE IF NOT EXISTS `albums` (
    6.   `id` int(9) NOT NULL AUTO_INCREMENT,
    7.   `alb` varchar(255) NOT NULL,
    8.   PRIMARY KEY (`id`)
    9. ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;
    10.  
    11. --
    12. -- Dumping data for table `albums`
    13. --
    14.  
    15. INSERT INTO `albums` (`id`, `alb`) VALUES
    16. (1, 'Album 1'),
    17. (2, 'Album 2'),
    18. (3, 'Album 3');
    19.  
    20. -- --------------------------------------------------------
    21.  
    22. --
    23. -- Table structure for table `pictures`
    24. --
    25.  
    26. CREATE TABLE IF NOT EXISTS `pictures` (
    27.   `id` int(9) NOT NULL AUTO_INCREMENT,
    28.   `alb` int(9) NOT NULL,
    29.   `title` varchar(255) NOT NULL,
    30.   `mini_img` varchar(255) NOT NULL,
    31.   `img` varchar(255) NOT NULL,
    32.   PRIMARY KEY (`id`)
    33. ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;
    34.  
    35. --
    36. -- Dumping data for table `pictures`
    37. --
    38.  
    39. INSERT INTO `pictures` (`id`, `alb`, `title`, `mini_img`, `img`) VALUES
    40. (1, 1, 'image1', 'img/small/1.jpg', 'img/image1.jpg'),
    41. (2, 1, 'image2', 'img/small/2.jpg', 'img/image2.jpg'),
    42. (3, 1, 'image3', 'img/small/3.jpg', 'img/image3.jpg'),
    43. (4, 2, 'image4', 'img/small/4.jpg', 'img/image4.jpg'),
    44. (5, 2, 'image5', 'img/small/5.jpg', 'img/image5.jpg'),
    45. (6, 2, 'image6', 'img/small/6.jpg', 'img/image6.jpg'),
    46. (7, 3, 'image7', 'img/small/7.jpg', 'img/image7.jpg'),
    47. (8, 3, 'image8', 'img/small/8.jpg', 'img/image8.jpg'),
    48. (9, 3, 'image9', 'img/small/9.jpg', 'img/image9.jpg');
    Удалось с помощью нескольких запросов к БД вывести 1 альбом (под именем «Album 1») и относящиеся к нему мини-картинки, но как теперь сделать так, чтобы все это дело «зациклить»? Т.е. чтобы структура была такая:

    alb1 +/-
    |_______mini_img1
    mini_img2
    mini_img3
    alb2 +/-
    |_______mini_img4
    mini_img5
    mini_img6
    alb3 +/-
    |_______mini_img7
    mini_img8
    mini_img9


    Ведь это php, нужно в любой момент добавлять, редактировать или удалять альбомы и/или их содержимое через админку.

    Что можно здесь сделать для динамического вывода из БД альбомов и их мини-имиджей?

    В коде id и классы элементов ИМЕЮТ ЗНАЧЕНИЕ, поэтому их менять нельзя.

    Заранее СПАСИБО за вашу помощь‼!
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    У тебя внутри альбомов - могут быть только картинки? Или внутри одного альбома - может быть также и другой альбом?
     
  3. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Добавлено спустя 4 минуты:
    Только картинки
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Тогда мне не понятно, в чём тут проблема... Нужно вывести всё - берёшь, получаешь от б.д. всё что в ней есть - и выводишь в цикле. Нужно вывести один альбом - получаешь его картинки и их выводишь...
     
  5. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Покажите, пожалуйста практически, на моем коде. Я пробовал сделать, но обломался. Нужно все в цикле. Проблема во вложенности картинок в альбом - как выводить? Два запроса получаются к 2м таблицам. Printf разбивать нельзя
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну вот, например, выведет все альбомы и их картинки:
    Код (PHP):
    1. <?php
    2. $dbhost = 'localhost';
    3. $dbuser = 'root';
    4. $dbpass = '123';
    5. $dbname = 'test';
    6. $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
    7. if($db->connect_errno) {
    8.     echo('Connect error: ' . $db->connect_error);
    9.     exit;
    10. }
    11. $db->set_charset('utf8');
    12. $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.*
    13. FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`)
    14. ORDER BY `albums`.`id`, `pictures`.`title` ASC";
    15. $res = $db->query($sql) or exit($db->error);
    16. $html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
    17. $html .= '<title>Gallery</title></head><body>';
    18. if($res->num_rows > 0) {
    19.     $prev = 0;
    20.     while($row = $res->fetch_assoc()) {
    21.         if($prev !== $row['alb']) {
    22.             $html .= '<h2>' . htmlspecialchars($row['album_name']) . '</h2>';
    23.             $prev = $row['alb'];
    24.         }
    25.         $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8');
    26.         $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8');
    27.         $html .= "<img src=\"{$src}\" alt=\"{$title}\" title=\"{$title}\" /><br />";
    28.     }
    29. } else {
    30.     $html .= 'Нет картинок';
    31. }
    32. $html .= '</body></html>';
    33. header('Content-Type: text/html; charset=utf-8');
    34. echo($html);
    35. ?>
     
  7. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Sobachnik, вы мой спаситель!
    Вывелись альбомы и их картинки в цикле, правда над ними возникла надпись Warning: Cannot modify header information - headers already sent by (output started at N:\home\localhost\www\gallery_tree\soba4nik_code.php:2) in N:\home\localhost\www\gallery_tree\soba4nik_code.php on line 34, поэтому строку
    Код (Text):
    1. header('Content-Type: text/html; charset=utf-8');
    убрал и надпись пропала тоже.
    Пожалуйста не сочтите за наглость, как теперь все это великолепие организовать с такими же классами и id как в оригинальном коде? Там структура была такая:

    Код (Text):
    1. <div class="step2" onclick="tree_toggle(arguments[0])">
    2. <ul class="Container">
    3.   <li class="Node IsRoot ExpandClosed">
    4.     <div class="Expand"></div>
    5.     <div class="Content">
    6.       <?php echo $myrow["alb"]; ?>
    7.    </div>
    8.     <ul class="Container">
    9.       <li class="Node ExpandLeaf IsLast">
    10.         <div class="Expand"></div>
    11.         <div class="Content">
    12.       <ul id="mb_imagelist" class="mb_imagelist">
    13. <!-- Здесь картинки -->
    14.       </ul>
    15.     </div>
    16.        </li>
    17.     </ul>
    18.   </li>
    19. </ul>
    20. </div>
    СПАСИБО вам за помощь, понимание и оперативность!
     
  8. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Уважаемый Sobachnik,

    Я внес кое-какие исправления в ваш код, под свои нужды. Плюсы:
    1. Альбомы приняли положенный им вид папок с +/- для открытия-закрытия
    2. При открытии альбомов показываются каждые первые картинки (т.е. Album 1 - image1, Album 2 - image4, Album 3 - image7).

    Однако каждые вторые и третьи картинки живут своей жизнью: находятся как бы вне альбома. При загрузке страницы они видны под блоками с именами альбомов. Вот как это выглядит при загрузке страницы - [​IMG], а вот как при нажатии на имена альбомов - [​IMG].

    Моих мозгов хватает только на следующий вывод: что-то не так со структурной организацией. А что исправить - это я после многочасовых исправлений и попыток уже отчаился понять. Пожалуйста, помогите!

    Адаптированный код:

    Код (Text):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <html>
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    5. <title>Tree_Adapted</title>
    6. <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" />
    7. <script src="js/tree.js" type="text/javascript"></script>
    8. </head>
    9. <body>
    10. <div class="mb_content">                   
    11.                         <h2>АЛЬБОМЫ</h2>
    12.                         <div class="mb_content_inner">
    13.                             <p>Здесь вы можете смотреть работы в тематических альбомах.</p>
    14. <div class="step2" onclick="tree_toggle(arguments[0])">
    15.  
    16.        
    17. <?php
    18. $dbhost = 'localhost';
    19. $dbuser = 'admin';
    20. $dbpass = '12345';
    21. $dbname = 'gallery_tree';
    22. $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
    23. if($db->connect_errno) {
    24.     echo('Connect error: ' . $db->connect_error);
    25.     exit;
    26. }
    27. $db->set_charset('utf8');
    28. $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.*
    29. FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`)
    30. ORDER BY `albums`.`id`, `pictures`.`title` ASC";
    31. $res = $db->query($sql) or exit($db->error);
    32.  
    33. if($res->num_rows > 0) {
    34.     $prev = 0;
    35.     while($row = $res->fetch_assoc()) {
    36.         if($prev !== $row['alb']) {
    37.             $html .= "<ul class='Container'>
    38.   <li class='Node IsRoot ExpandClosed'><div class='Expand'></div><div class='Content'>" . htmlspecialchars($row['album_name']) . "</div>";
    39.             $prev = $row['alb'];
    40.         }
    41.         $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8');
    42.         $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8');
    43.         $html .= "<ul class='Container'>
    44.       <li class='Node ExpandLeaf IsLast'>
    45.         <div class='Expand'></div>
    46.         <div class='Content'><ul id='mb_imagelist' class='mb_imagelist'><li><img src=\"{$src}\" alt=\"{$title}\" title=\"{$title}\" /></li></ul></div></li></ul></li></ul>";
    47.     }
    48. } else {
    49.     $html .= 'Нет картинок';
    50. }
    51.  
    52. echo($html);
    53.  
    54. ?>
    55. </div>
    56.  
    57.  
    58.                         </div>
    59. </div>
    60. </body>
    61. </html>
    СПАСИБО вам огромное!!!
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я не знаю, что там за скрипты ещё к странице прикручены у тебя и потому не могу сказать точно, что и куда нужно вставлять, чтобы они могли работать. Но предполагаю, что это должно быть так:
    Код (PHP):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <html>
    3.     <head>
    4.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5.         <title>Tree_Adapted</title>
    6.         <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" />
    7.         <script src="js/tree.js" type="text/javascript"></script>
    8.     </head>
    9.     <body>
    10.         <div class="mb_content">
    11.             <h2>АЛЬБОМЫ</h2>
    12.             <div class="mb_content_inner">
    13.                 <p>Здесь вы можете смотреть работы в тематических альбомах.</p>
    14.                 <div class="step2" onclick="tree_toggle(arguments[0])">
    15.                     <ul class="Container">
    16. <?php
    17. $dbhost = 'localhost';
    18. $dbuser = 'root';
    19. $dbpass = '123';
    20. $dbname = 'test';
    21. $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
    22. if($db->connect_errno) {
    23.     echo('Connect error: ' . $db->connect_error);
    24.     exit;
    25. }
    26. $db->set_charset('utf8');
    27. $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.*
    28. FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`)
    29. ORDER BY `albums`.`id`, `pictures`.`title` ASC";
    30. $res = $db->query($sql) or exit($db->error);
    31. $html = '';
    32. if($res->num_rows > 0) {
    33.     $prev = 0;
    34.     while($row = $res->fetch_assoc()) {
    35.         if($prev !== $row['alb']) {
    36.             if($prev !== 0) {
    37.                 $html .= '
    38.                                         </ul>
    39.                                     </div>
    40.                                 </li>
    41.                             </ul>
    42.                         </li>';
    43.             }
    44.             $html .= '
    45.                         <li class="Node IsRoot ExpandClosed">
    46.                             <div class="Expand"></div>
    47.                             <div class="Content">' . htmlspecialchars($row['album_name']) . '</div>
    48.                             <ul class="Container">
    49.                                 <li class="Node ExpandLeaf IsLast">
    50.                                     <div class="Expand"></div>
    51.                                     <div class="Content">
    52.                                         <ul id="mb_imagelist" class="mb_imagelist">';
    53.             $prev = $row['alb'];
    54.         }
    55.         $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8');
    56.         $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8');
    57.         $html .= "<li><img src=\"{$src}\" alt=\"{$title}\" title=\"{$title}\" /></li>";
    58.     }
    59.     $html .= '
    60.                                         </ul>
    61.                                     </div>
    62.                                 </li>
    63.                             </ul>
    64.                         </li>';
    65. } else {
    66.     $html .= 'Нет картинок';
    67. }
    68. echo($html);
    69. ?>
    70.  
    71.                     </ul>
    72.                 </div>
    73.             </div>
    74.         </div>
    75.     </body>
    76. </html>
     
  10. newstarter

    newstarter Активный пользователь

    С нами с:
    3 сен 2012
    Сообщения:
    51
    Симпатии:
    0
    Уважаемый Sobachnik!!!

    ИМЕННО то, что было нужно! Ура!

    Альбомы в закрытом виде:

    [​IMG]

    Первый альбом открыт:

    [​IMG]

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

    И вот вы, просто по-человечески, не строя из себя примадонну, ПОМОГЛИ новичку.

    Нет слов))) С.П.А.С.И.Б.О.!!!