Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вывод в колонки
 
 автор: Лена   (01.12.2008 в 14:57)   письмо автору
 
 

Нужно вывести заголовок + все картинки к этому заголовку, по четыре картинки в ряд.
У меня сейчас выводится заголовок + картинки одна под другой. Не пойму, в чем дело. Помогите, пожалуйста.


<?php
include("configs/dbopen.php");
$sql"SELECT *, m.id_menu AS menu 
FROM img AS i
LEFT JOIN menu AS m ON i.id_menu = m.id_menu
WHERE i.id_menu = m.id_menu
ORDER BY i.id_menu"
;
$res mysql_query($sql); 
if(!
$res) exit("Error in $sql: "mysql_error());
if(
mysql_num_rows($res)>0){
    for(
$p 0$row mysql_fetch_assoc($res); ) { 
        if(
$p != $row['id_menu']) {
        
$p $row['id_menu']; 
        
$title $row['title'];
        print 
"<div class = 'c_head'>" $title "</div>";
        }
        for(
$i=0;$i<count(mysql_num_rows($res));$i++){ 
        
$foto $row['name'];
        
$file "lightbox/images/copy/" $foto
        
$big_file "lightbox/images/" $foto;
        
$galery "<table border = '1px'>"
        if(!(
$i%4)) $galery .= "<tr>"
        
$galery .= "<td><a href='"$big_file ."'><img border='0' src='" $file "'  width='180' height='100' 
alt = '" 
.$file "'></a></td>";
        if(!(
$i+1%4)) $galery .= "</tr>"
        
$galery .= "</table>"
        print 
$galery
        print 
"<hr size = '1px' width=75%>";
        }
    }
}
?>

  Ответить  
 
 автор: sim5   (01.12.2008 в 15:26)   письмо автору
 
   для: Лена   (01.12.2008 в 14:57)
 

$i<count(mysql_num_rows($res)) - а разве так должно быть? Вы должны ориентироваться на число картинок, а не на число строк в ресурсе. Вы используете JS-библиотеку Lightbox для вывода?

  Ответить  
 
 автор: Лена   (01.12.2008 в 15:48)   письмо автору
 
   для: sim5   (01.12.2008 в 15:26)
 

Нет, я не использую JS-библиотеку Lightbox. У меня просто так называется папка.
Число картинок в вытянутом из базы массиве у меня совпадает с числом строк. Вот поэтому я и делаю $i<count(mysql_num_rows($res)).

  Ответить  
 
 автор: sim5   (01.12.2008 в 15:52)   письмо автору
 
   для: Лена   (01.12.2008 в 15:48)
 

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

  Ответить  
 
 автор: Волки   (01.12.2008 в 17:22)   письмо автору
 
   для: Лена   (01.12.2008 в 14:57)
 

чтот вроде этого можно опробовать:
<?...
if(
mysql_num_rows($res)>0)
{
    
$galery '';
    for(
$i=$p=0$row=mysql_fetch_assoc($res); )
    {
        if(
$p != $row['id_menu'])
        {
            
$p $row['id_menu'];
        
$title $row['title'];
            if (!empty(
$galery)) print "</table><hr size='1px' width='75%'>";
        print 
"<div class='c_head'>$title</div>\n";
            
$i 0;
            
$galery "<table border='1px'>";
        }
        
$foto $row['name'];
        
$file "lightbox/images/copy/" $foto;
        
$big_file "lightbox/images/" $foto;
        if(
$i%4==0$galery .= "<tr>";
        
$galery .= "<td><a href='"$big_file ."'><img border='0' src='" $file .
          
"'  width='180' height='100' alt = '" .$file "'></a></td>";
        if(
$i%4==3$galery .= "</tr>";
        
$i++;
    }
}
?>

Да, и Ваша фраза:
if(!($i+1%4)) $galery .= "</tr>"; 
- от невнимательности ;)

  Ответить  
 
 автор: sim5   (01.12.2008 в 17:24)   письмо автору
 
   для: Волки   (01.12.2008 в 17:22)
 

И в чем разница?

>if(!($i+1%4)) $galery .= "</tr>";
> - от невнимательности ;)

это от вашего незнания ;-)

  Ответить  
 
 автор: Волки   (01.12.2008 в 17:33)   письмо автору
 
   для: sim5   (01.12.2008 в 17:24)
 

Всего один цикл, таблица должна формироваться правильно (хотя все равно надо по месту подгонять).

  Ответить  
 
 автор: sim5   (01.12.2008 в 17:39)   письмо автору
 
   для: Волки   (01.12.2008 в 17:33)
 

Таблица изображений формируется не правильно, потому, что не получается в данном случае массива изображений, который и нужно раскладывать, а не потому, что надо выполнять:
if ($n % 4 == 3).
Чтобы разложить правильно - некий элемент, например, полученный элемент $row['tema'], должен содержать в себе массив: имена изображений, подписи к ним, размеры и т.д.. Вот этот массив и нужно раскладывать. Либо, если эти изобаржения содержатся как строки в исходном ресурсе, то нужно делать цикл, проверяя некий общий ключ для этих элементов (изображений).

  Ответить  
 
 автор: Trianon   (01.12.2008 в 17:38)   письмо автору
 
   для: sim5   (01.12.2008 в 17:24)
 

>это от вашего незнания ;-)

А по-моему - от Вашего.

  Ответить  
 
 автор: sim5   (01.12.2008 в 17:41)   письмо автору
 
   для: Trianon   (01.12.2008 в 17:38)
 

Trianon, только не надо. Проверяйте:
<?
$arr 
= array('set1','set2','set3','set4','set5','set6','set7','set8');
$col 5;
$n = ($col>count($arr) || !(count($arr)%$col)) ? count($arr) : count($arr)+($col-count($arr)%$col);
print 
'<TABLE cellpadding="4" cellspacing="1" bgcolor="#000000">';
for (
$i=0$i<$n$i++) {
  if (!(
$i $col)) print '<TR bgcolor="#ffffff">';
  
$arr[$i] ? print "<TD>$arr[$i]</TD>" : print "<TD>&nbsp;</TD>";
  if (!(
$i+$col)) print "</TR>";
}
print 
"</TABLE>";

Хрен (первый случай) от редьки (второй) не слаще. Проблема совсем не в этом.

  Ответить  
 
 автор: Trianon   (01.12.2008 в 17:46)   письмо автору
 
   для: sim5   (01.12.2008 в 17:41)
 

И что? В иcходнике html видны закрывающие теги </TR> ?
Кому не надо?

  Ответить  
 
 автор: sim5   (01.12.2008 в 17:49)   письмо автору
 
   для: Trianon   (01.12.2008 в 17:46)
 

А, понял я про что, про забытые скобки. Блин, пардон: if (!(($i+1) % $col)). Будет не закрыт тег, но вывод будет-то по требуемому числу. Я просто не пойму от куда берутся эти изображения. Тут как-то сам ресурс тогда по модулю 4 разбивать нужно, иначе "какая-то не то" получается.

  Ответить  
 
 автор: Trianon   (01.12.2008 в 18:08)   письмо автору
 
   для: sim5   (01.12.2008 в 17:49)
 

картинок же может быть и меньше, и больше четырех на строку - в результате запроса...

  Ответить  
 
 автор: sim5   (01.12.2008 в 18:12)   письмо автору
 
   для: Trianon   (01.12.2008 в 18:08)
 

Ну это уже другой вопрос. В данном случае, у автора выводится по одному. А как их может быть несколько, если просто происходит цикл прохода ресурса: первая итерация - первое изображение из n изображений, вторая - второе, и т.д.. Откуда могут появиться другие?

  Ответить  
 
 автор: Trianon   (01.12.2008 в 18:22)   письмо автору
 
   для: sim5   (01.12.2008 в 18:12)
 

из базы :)
Из схемы же не следует, что у любого элемента меню РОВНО четыре картинки? :)
Собственно, таких количественных ограничений в любом случае следовать не будет.

  Ответить  
 
 автор: sim5   (01.12.2008 в 19:01)   письмо автору
 
   для: Trianon   (01.12.2008 в 18:22)
 

Да разве в этом дело, бог с ним, пусть их будет по три, или 4, потом 3, потом 5... Вот вы, как MySQL-док (:)) скажите, как можно при раскладе ресурса, если его некий элемент, это не массив этих изображений, при таком подходе разложения, получить необходимую таблицу?

Строка ресурса должна выглядеть либо так: а = (пусть строка), b = array(а это уже массив изображений, вот его во вложенном цикле можно и разложить), с = (чего-то);
любо так:
0 стр. а = (пусть строка), b = (первое изображение), с = (чего-то)
1 стр. а = (пусть строка), b = (второе изображение), с = (чего-то)
и т.д...
Во втором случае надо тогда ориентироваться, например, проверяя по а, которая должна быть уникальной для каждых N изображений.
Вот тогда я понимаю, иначе как? Сколько бы не влаживали функций, в итоге вывод будет только одного из N изображений, при подходе как выше.

  Ответить  
 
 автор: Trianon   (01.12.2008 в 19:28)   письмо автору
 
   для: sim5   (01.12.2008 в 19:01)
 

>Строка ресурса должна выглядеть либо так: а = (пусть строка), b = array(а это уже массив изображений, вот его во вложенном цикле можно и разложить), с = (чего-то);

такое можно достичь через group_concat , но на мой взгляд, овчинка выделки не стоит.


>любо так:
>0 стр. а = (пусть строка), b = (первое изображение), с = (чего-то)
>1 стр. а = (пусть строка), b = (второе изображение), с = (чего-то)
>и т.д...

А такое - вполне рядовой случай

<?
$sql 
"SELECT objects.name, images.path 
FROM objects LEFT JOIN images ON images.object_id = objects.id
GROUP BY objects.name"
;
$res mysql_query($sql);
for(
$rows = array(); $row mysql_fetch_assoc($res);)
    
$rows[$row['name']][] = $row['path'];

$maxcount 0;
foreach(
$rows as $row)
  
$maxcount max($maxcountcount($row));

foreach(
$rows as $name => $row)
{
  echo 
"<tr><td>$name</td>";
  for(
$i 0$i $maxcount$i++)
  {
    
$val $i $maxcount "<img src=\"".$row[$i]."\" />" " ";
    echo 
"<td>$val</td>\r\n";
  }  
  echo 
"</tr>\r\n";
}


  Ответить  
 
 автор: sim5   (01.12.2008 в 19:35)   письмо автору
 
   для: Trianon   (01.12.2008 в 19:28)
 

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

  Ответить  
 
 автор: Лена   (01.12.2008 в 23:59)   письмо автору
 
   для: sim5   (01.12.2008 в 19:35)
 

В принципе я тоже разобралась. Больше в этой теме пока ничего писать не нужно. День тяжелый был, уже спать иду. Завтра свой код исправленный здесь покажу. Спасибо.

  Ответить  
 
 автор: Лена   (02.12.2008 в 12:44)   письмо автору
 
   для: Лена   (01.12.2008 в 23:59)
 

Вот что получилось.

<?php
include("configs/dbopen.php");
$sql"SELECT *, m.id_menu AS menu 
FROM img AS i
LEFT JOIN menu AS m ON i.id_menu = m.id_menu
WHERE i.id_menu = m.id_menu
ORDER BY i.id_menu"
;
$res mysql_query($sql); 
if(!
$res) exit("Error in $sql: "mysql_error());
if(
mysql_num_rows($res)>0){

$rows = array();
    while(
$row mysql_fetch_assoc($res))
        
$rows[$row['title']][] = $row['name'];

        
$maxcount 0;
        foreach(
$rows as $row)
        
$maxcount max($maxcountcount($row));

foreach(
$rows as $name => $row){

echo 
$name;
echo 
"<table>"
$j 0;
    for(
$i 0$i $maxcount$i++){
    if(!(
$j%4))    echo "<tr>";
    
$file "lightbox/images/copy/" $row[$i]; 
    
$big_file "lightbox/images/" $row[$i];
    if(
$row[$i])
    echo 
"<td><a href='"$big_file ."'><img src='" $file "' width='180' height='100' 
alt = '" 
.$file "'/></a></td>";
    if(!((
$j+1)%4))    echo "</tr>";
    
$j++;
    }

echo 
"</table>"
print 
"<hr size = '1px' width='75%'>"
}
}
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования