Уважаемые знатоки и умельцы форума! Прошу не пугаться объема этого сообщения. Очень нужна ваша помощь в организации, составлении запроса и извлечении из БД данных! Большая просьба также не отвечать ссылками на тонны познавательной информации, требующей большого времени на изучение. Если вы можете помочь, пожалуйста внесите исправления в прилагаемый код или структуру таблиц. Заранее СПАСИБО за внимание, терпение и участие‼! Имеется код поальбомной галереи реализуемой в виде «дерева» - при клике на имя альбома нужен вывод из базы мини-картинок к этому альбому. Код (Text): <? include ("blocks/bd.php"); if (isset($_GET['alb'])) {$alb = $_GET['alb']; } if (!isset ($alb)) {$alb = 1;} $result = mysql_query("SELECT * FROM albums_gal",$db); $myrow = mysql_fetch_array($result); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Tree_Adapted</title> <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" /> <script src="js/tree.js" type="text/javascript"></script> </head> <body> <div class="mb_content"> <h2>АЛЬБОМЫ</h2> <div class="mb_content_inner"> <p>Здесь вы можете смотреть работы в тематических альбомах.</p> <div class="step2" onclick="tree_toggle(arguments[0])"> <ul class="Container"> <li class="Node IsRoot ExpandClosed"> <div class="Expand"></div> <div class="Content"> <?php echo $myrow["alb"]; ?> </div> <ul class="Container"> <li class="Node ExpandLeaf IsLast"> <div class="Expand"></div> <div class="Content"> <ul id="mb_imagelist" class="mb_imagelist"> <? $result2 = mysql_query ("SELECT * FROM pictures WHERE alb='$alb'",$db); $myrow2 = mysql_fetch_array($result2); if (mysql_num_rows($result2) > 0) { do { printf ("<li><img src='%s' alt='%s' data-bgimg='%s'/></li>",$myrow2["mini_img"], $myrow2["title"], $myrow2["img"]); } while ($myrow2 = mysql_fetch_array($result2)); } ?> </ul> </div> </li> </ul> </li> </ul> </div> </div> </div> </body> </html> Я так понимаю, и альбомы, и мини-картинки должны выводится из БД в циклах. Создал 2 таблицы – albums (для альбомов) и pictures (для мини-картинок). Код (Text): -- -- Table structure for table `albums` -- CREATE TABLE IF NOT EXISTS `albums` ( `id` int(9) NOT NULL AUTO_INCREMENT, `alb` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ; -- -- Dumping data for table `albums` -- INSERT INTO `albums` (`id`, `alb`) VALUES (1, 'Album 1'), (2, 'Album 2'), (3, 'Album 3'); -- -------------------------------------------------------- -- -- Table structure for table `pictures` -- CREATE TABLE IF NOT EXISTS `pictures` ( `id` int(9) NOT NULL AUTO_INCREMENT, `alb` int(9) NOT NULL, `title` varchar(255) NOT NULL, `mini_img` varchar(255) NOT NULL, `img` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ; -- -- Dumping data for table `pictures` -- INSERT INTO `pictures` (`id`, `alb`, `title`, `mini_img`, `img`) VALUES (1, 1, 'image1', 'img/small/1.jpg', 'img/image1.jpg'), (2, 1, 'image2', 'img/small/2.jpg', 'img/image2.jpg'), (3, 1, 'image3', 'img/small/3.jpg', 'img/image3.jpg'), (4, 2, 'image4', 'img/small/4.jpg', 'img/image4.jpg'), (5, 2, 'image5', 'img/small/5.jpg', 'img/image5.jpg'), (6, 2, 'image6', 'img/small/6.jpg', 'img/image6.jpg'), (7, 3, 'image7', 'img/small/7.jpg', 'img/image7.jpg'), (8, 3, 'image8', 'img/small/8.jpg', 'img/image8.jpg'), (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м таблицам. Printf разбивать нельзя
Ну вот, например, выведет все альбомы и их картинки: Код (PHP): <?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = '123'; $dbname = 'test'; $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if($db->connect_errno) { echo('Connect error: ' . $db->connect_error); exit; } $db->set_charset('utf8'); $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.* FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`) ORDER BY `albums`.`id`, `pictures`.`title` ASC"; $res = $db->query($sql) or exit($db->error); $html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; $html .= '<title>Gallery</title></head><body>'; if($res->num_rows > 0) { $prev = 0; while($row = $res->fetch_assoc()) { if($prev !== $row['alb']) { $html .= '<h2>' . htmlspecialchars($row['album_name']) . '</h2>'; $prev = $row['alb']; } $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8'); $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8'); $html .= "<img src=\"{$src}\" alt=\"{$title}\" title=\"{$title}\" /><br />"; } } else { $html .= 'Нет картинок'; } $html .= '</body></html>'; header('Content-Type: text/html; charset=utf-8'); echo($html); ?>
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): header('Content-Type: text/html; charset=utf-8'); убрал и надпись пропала тоже. Пожалуйста не сочтите за наглость, как теперь все это великолепие организовать с такими же классами и id как в оригинальном коде? Там структура была такая: Код (Text): <div class="step2" onclick="tree_toggle(arguments[0])"> <ul class="Container"> <li class="Node IsRoot ExpandClosed"> <div class="Expand"></div> <div class="Content"> <?php echo $myrow["alb"]; ?> </div> <ul class="Container"> <li class="Node ExpandLeaf IsLast"> <div class="Expand"></div> <div class="Content"> <ul id="mb_imagelist" class="mb_imagelist"> <!-- Здесь картинки --> </ul> </div> </li> </ul> </li> </ul> </div> СПАСИБО вам за помощь, понимание и оперативность!
Уважаемый Sobachnik, Я внес кое-какие исправления в ваш код, под свои нужды. Плюсы: 1. Альбомы приняли положенный им вид папок с +/- для открытия-закрытия 2. При открытии альбомов показываются каждые первые картинки (т.е. Album 1 - image1, Album 2 - image4, Album 3 - image7). Однако каждые вторые и третьи картинки живут своей жизнью: находятся как бы вне альбома. При загрузке страницы они видны под блоками с именами альбомов. Вот как это выглядит при загрузке страницы - , а вот как при нажатии на имена альбомов - . Моих мозгов хватает только на следующий вывод: что-то не так со структурной организацией. А что исправить - это я после многочасовых исправлений и попыток уже отчаился понять. Пожалуйста, помогите! Адаптированный код: Код (Text): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Tree_Adapted</title> <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" /> <script src="js/tree.js" type="text/javascript"></script> </head> <body> <div class="mb_content"> <h2>АЛЬБОМЫ</h2> <div class="mb_content_inner"> <p>Здесь вы можете смотреть работы в тематических альбомах.</p> <div class="step2" onclick="tree_toggle(arguments[0])"> <?php $dbhost = 'localhost'; $dbuser = 'admin'; $dbpass = '12345'; $dbname = 'gallery_tree'; $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if($db->connect_errno) { echo('Connect error: ' . $db->connect_error); exit; } $db->set_charset('utf8'); $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.* FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`) ORDER BY `albums`.`id`, `pictures`.`title` ASC"; $res = $db->query($sql) or exit($db->error); if($res->num_rows > 0) { $prev = 0; while($row = $res->fetch_assoc()) { if($prev !== $row['alb']) { $html .= "<ul class='Container'> <li class='Node IsRoot ExpandClosed'><div class='Expand'></div><div class='Content'>" . htmlspecialchars($row['album_name']) . "</div>"; $prev = $row['alb']; } $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8'); $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8'); $html .= "<ul class='Container'> <li class='Node ExpandLeaf IsLast'> <div class='Expand'></div> <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>"; } } else { $html .= 'Нет картинок'; } echo($html); ?> </div> </div> </div> </body> </html> СПАСИБО вам огромное!!!
Я не знаю, что там за скрипты ещё к странице прикручены у тебя и потому не могу сказать точно, что и куда нужно вставлять, чтобы они могли работать. Но предполагаю, что это должно быть так: Код (PHP): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Tree_Adapted</title> <link href="css/gallery_tree.css" rel="stylesheet" type="text/css" /> <script src="js/tree.js" type="text/javascript"></script> </head> <body> <div class="mb_content"> <h2>АЛЬБОМЫ</h2> <div class="mb_content_inner"> <p>Здесь вы можете смотреть работы в тематических альбомах.</p> <div class="step2" onclick="tree_toggle(arguments[0])"> <ul class="Container"> <?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = '123'; $dbname = 'test'; $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if($db->connect_errno) { echo('Connect error: ' . $db->connect_error); exit; } $db->set_charset('utf8'); $sql = "SELECT `albums`.`alb` AS `album_name`, `pictures`.* FROM `albums` LEFT JOIN `pictures` ON (`albums`.`id` = `pictures`.`alb`) ORDER BY `albums`.`id`, `pictures`.`title` ASC"; $res = $db->query($sql) or exit($db->error); $html = ''; if($res->num_rows > 0) { $prev = 0; while($row = $res->fetch_assoc()) { if($prev !== $row['alb']) { if($prev !== 0) { $html .= ' </ul> </div> </li> </ul> </li>'; } $html .= ' <li class="Node IsRoot ExpandClosed"> <div class="Expand"></div> <div class="Content">' . htmlspecialchars($row['album_name']) . '</div> <ul class="Container"> <li class="Node ExpandLeaf IsLast"> <div class="Expand"></div> <div class="Content"> <ul id="mb_imagelist" class="mb_imagelist">'; $prev = $row['alb']; } $src = htmlspecialchars($row['mini_img'], ENT_QUOTES, 'utf-8'); $title = htmlspecialchars($row['title'], ENT_QUOTES, 'utf-8'); $html .= "<li><img src=\"{$src}\" alt=\"{$title}\" title=\"{$title}\" /></li>"; } $html .= ' </ul> </div> </li> </ul> </li>'; } else { $html .= 'Нет картинок'; } echo($html); ?> </ul> </div> </div> </div> </body> </html>
Уважаемый Sobachnik!!! ИМЕННО то, что было нужно! Ура! Альбомы в закрытом виде: Первый альбом открыт: Я так вам благодарен! Чего только не пришлось выслушать от программистов за эти дни поисков решения - и что я дебил, и что задача невыполнимая, что копание в коде отнимает время, что я должен заняться самообразованием с помощью вот этих (далее - батарея ссылок) источников, что так это дело не делается... И вот вы, просто по-человечески, не строя из себя примадонну, ПОМОГЛИ новичку. Нет слов))) С.П.А.С.И.Б.О.!!!