我在表格中显示数据时遇到问题。 代码采用多个id,对数据库运行它们并在表中显示结果。
$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%"> </td>';
if($counter == 1) {
echo '<td width="45%">'. $str1 .'</td>';
$counter = 0;
break;
}
echo '</tr>';
}
}
输出我
预期输出
任何猜测我做错了什么?
答案 0 :(得分: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%"> </td>';
if($counter == 1) {
echo '<td width="45%">'. $str1 .'</td>';
$counter = 0;
echo '</tr>';
break;
}
}
}
在if($ counter == 0)下保持echo,以便在counter为0时创建新行并保持在if($ counter == 1)
之下它将如何解决问题。
答案 1 :(得分:2)
我假设您正在使用计数器将宽度标记仅添加到第一行。这不是必需的。这足以实现您的目标:
echo '<tr>
<td>'.$str1.'</td><td> </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%;
}
设置第一行的正确宽度。
答案 2 :(得分:1)
对于$ counter的两个值,看起来你很早就突破了。所以html输出可能是无效的,而不是你期望的。
当$ counter为0时,在输出填充单元格或结束之前会中断。 您可以删除中断并使用其他内容,以确保始终达到结束。但是你仍然只会每行输出一个填充的单元格,因为你为每个循环输出一个完整的..
要获得每行两条记录,只需在输出第二条记录后关闭该行 - 可能是这样的:
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%"> </td>';
echo '<td width="45%">'. $str1 .'</td>';
$counter = 0;
echo '</tr>';
}
}
编辑:你也应该检查整个事情是否以1计数结束,并在这种情况下关闭该行。
答案 3 :(得分:0)
根据您发布的结果(以及您的预期),也许您可以尝试在第二个echo '</tr>'
内移动if
行?
即。改变这个:
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;
}
答案 4 :(得分:0)
问题在于你利用&#34;休息&#34;声明:break将停止执行最接近的while或for语句(在你的例子中,它是while($ row = $ rs-&gt; fetch_assoc())执行将被破坏)。
这里发生的事情如下:
首先是循环打印&#34; tr&#34;然后做
echo ''. $str1 .'';因为你有$ counter == 0,你设置$ counter = 1然后执行休息。
第二个循环,你正在打印另一个&#34; tr&#34;没有关闭第一个(这导致一个奇怪的行为),现在$ counter == 1是真的,你将打印两个&#34; td&#34;
重新开始休息,一切都应该可以正常工作
$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%"> </td>';
if($counter == 1) {
echo '<td width="45%">'. $str1 .'</td>';
$counter = 0;
}
echo '</tr>';
}
}