2015-01-14 4 views
-1

У меня возникли проблемы с отображением данных в таблице. код принимает несколько идентификаторов, запускает их из базы данных и отображает результат в таблице.Заполнение таблицы PHP

$counter = 0; 
    foreach ($_POST['multi'] as $artid) { 
      $quee = 'select w.title, m.mediatype,w.year,w.len,w.heigh,w.size from works w left join `media` m on w.media_id = m.media_id where w.work_id = "' . $artid.'"'; 
      $rs=$DBH->query($quee); 
      $rows_returned = $rs->num_rows; 
     while($row = $rs->fetch_assoc()) 
      { 
       $str1 = $row['title'] ."</br>".$row['mediatype']."</br>".$row['len'] ."x".$row['heigh'] . " ".$row['size']."</br>".$row['year']; 

     echo '<tr>'; 
     if($counter == 0) { 
     echo '<td width="45%">'. $str1 .'</td>'; 
     $counter = 1; 
     break; 
     } 
     echo '<td width="10%">&nbsp;</td>'; 
     if($counter == 1) { 
     echo '<td width="45%">'. $str1 .'</td>'; 
     $counter = 0; 
     break; 
     } 
     echo '</tr>'; 

} 

     } 

Выход я получаю enter image description here

Ожидаемый выход

enter image description here

любые предположения, что я делаю неправильно?

ответ

2
$counter = 0; 
foreach ($_POST['multi'] as $artid) { 
$quee = 'select w.title, m.mediatype,w.year,w.len,w.heigh,w.size from works w left join `media` m on w.media_id = m.media_id where w.work_id = "' . $artid.'"'; 
$rs=$DBH->query($quee); 
$rows_returned = $rs->num_rows; 

while($row = $rs->fetch_assoc()) 
{ 
    $str1 = $row['title'] ."</br>".$row['mediatype']."</br>".$row['len'] ."x".$row['heigh'] . " ".$row['size']."</br>".$row['year']; 

    if($counter == 0) { 
    echo '<tr>'; 
    echo '<td width="45%">'. $str1 .'</td>'; 
    $counter = 1; 
    break; 
    } 
    echo '<td width="10%">&nbsp;</td>'; 
    if($counter == 1) { 
    echo '<td width="45%">'. $str1 .'</td>'; 
    $counter = 0; 
    echo '</tr>'; 
    break; 
    } 
} 

} 

держите эхо под если ($ встречного == 0), так что она будет создавать новую строку, когда счетчик 0 и держать под если ($ прилавка == 1)

, как он будет решать проблему.

+0

AHa! что отлично работало – Bender

0

В соответствии с результатом, который вы опубликовали (и что вы ожидали), возможно, вы могли бы попытаться переместить линию echo '</tr>' во второй if?

I.e. Изменить это:

if($counter == 1) { 
    echo '<td width="45%">'. $str1 .'</td>'; 
    $counter = 0; 
    break; 
} 
echo '</tr>'; 

к этому:

if($counter == 1) { 
    echo '<td width="45%">'. $str1 .'</td>'; 
    echo '</tr>'; 
    $counter = 0; 
    break; 
} 
0

Проблема заключается в вашем использовании «излома» заявление: перерыв остановит выполнение ближе во время или для заявления (в вашем примере это while ($ row = $ rs-> fetch_assoc()) выполнение, которое будет сломано).

Что здесь происходит следующее:

первыми в то время как цикл печать «тр», то сделать

echo ''. $str1 .'';
, как у вас есть $ встречного == 0, вы устанавливаете $ счетчика = 1, то разрыв будет выполнен.

второй цикл, вы печатаете другой «TR», не закрывая первый (так это приведет к странному поведению), то теперь $ счетчик == 1 верно, и вы будете печатать два «ТД»

Remmoving перерыва, и все должно работать нормально

$counter = 0; 
    foreach ($_POST['multi'] as $artid) { 
      $quee = 'select w.title, m.mediatype,w.year,w.len,w.heigh,w.size from works w left join `media` m on w.media_id = m.media_id where w.work_id = "' . $artid.'"'; 
      $rs=$DBH->query($quee); 
      $rows_returned = $rs->num_rows; 
     while($row = $rs->fetch_assoc()) 
      { 
       $str1 = $row['title'] ."</br>".$row['mediatype']."</br>".$row['len'] ."x".$row['heigh'] . " ".$row['size']."</br>".$row['year']; 

     echo '<tr>'; 
     if($counter == 0) { 
     echo '<td width="45%">'. $str1 .'</td>'; 
     $counter = 1; 
     } 
     echo '<td width="10%">&nbsp;</td>'; 
     if($counter == 1) { 
     echo '<td width="45%">'. $str1 .'</td>'; 
     $counter = 0; 
     } 
     echo '</tr>'; 

} 

     } 
+0

Пробный код без использования перерыва, получение дубликатов http://i.imgur.com/TeAHXTj.png – Bender

+0

Вы считали, что можете получать дубликаты, потому что вы печатаете одну и ту же строку дважды? Посмотрите на свой код: вы печатаете $ str1 в обоих столбцах. – vanamerongen

+0

Вы правы, не видели точно, что вы пытались сделать – Jaay

2

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

echo '<tr> 
     <td>'.$str1.'</td><td>&nbsp;</td><td>'.$str1.'</td> 
     </tr>'; 

И добавить некоторые CSS, например так:

tr:first-child td { 
    width:10%; 
} 

tr:first-child td:first-child, tr:first-child td:last-child { 
    width:45%; 
} 

установить соответствующие ширины для первой строки.

1

Похоже, вы вырваетесь из своего раннего времени для обоих значений счетчика $. Таким образом, вывод html скорее всего недействителен, чем ожидаемый.

Когда $ counter равен 0, вы выходите перед выдачей ячейки дополнения или закрытия. Вы можете удалить перерывы и использовать еще, чтобы вы всегда доходили до закрытия. Но вы все равно будете выводить только одну заполненную ячейку за строку, потому что вы выводите полный ... для каждого цикла.

Чтобы получить две записи на строку вам нужно закрыть строку только после того, как outputing второй рекорд - возможно, как это:

while($row = $rs->fetch_assoc()) { 
     $str1 = $row['title'] ."</br>".$row['mediatype']."</br>".$row['len'] ."x".$row['heigh'] . " ".$row['size']."</br>".$row['year']; 

     if($counter == 0) { 
      echo '<tr>'; 
      echo '<td width="45%">'. $str1 .'</td>'; 
      $counter = 1; 
     } else { 
      echo '<td width="10%">&nbsp;</td>'; 
      echo '<td width="45%">'. $str1 .'</td>'; 
      $counter = 0; 
      echo '</tr>'; 
     } 

    } 

EDIT: Кроме того, вы должны проверить, если все это закончилось на 1 отсчет, и закройте строку в этом случае.

Смежные вопросы