$items = '';
$sql = "select items from bplus where pos = 'home-01' limit 1";
$st = $db->query($sql);
$res = $st->fetchColumn();
$arr = explode("\n", $res);
foreach ($arr as $el){
//echo $el . "<br>"; // as a test - it's ok - four images.
$sqlb = "select * from banners where fname = '" . $el . "'";
$stb = $db->query($sqlb);
$row = $stb->fetch();
$items .= "<img class='itemtop' src = '../banners/" . $el . "' alt='img' data-id = " . $row['id'] . " data-fname = '" . $row['fname'] . "' data-w = " . $row['width'] . " data-h = " . $row['height'] . ">\n";
}
echo $items;
最终结果:
<img class='itemtop' src = '../banners/5ad461206f52e.jpg
' alt='img' data-id = data-fname = '' data-w = data-h = >
<img class='itemtop' src = '../banners/5ad461206f916.jpg
' alt='img' data-id = data-fname = '' data-w = data-h = >
<img class='itemtop' src = '../banners/5ad461206fcff.jpg
' alt='img' data-id = data-fname = '' data-w = data-h = >
<img class='itemtop' src = '../banners/5ad461207d7c2.jpg' alt='img' data-id = 29 data-fname = '5ad461207d7c2.jpg' data-w = 320 data-h = 50>
为什么前三张图片没有任何数据?
在表格中,所有图像都有其数据。
答案 0 :(得分:0)
您需要检查内部查询的结果
$sqlb = "select * from banners where fname = '" . $el . "'";
$stb = $db->query($sqlb);
$row = $stb->fetch();
if(!$row) throw new Exception("missing row [$el]");
$items .= "<img class='itemtop' src = '../banners/" . $el . "' alt='img' data-id = " . $row['id'] . " data-fname = '" . $row['fname'] . "' data-w = " . $row['width'] . " data-h = " . $row['height'] . ">\n";
对于我要添加的项目(在循环外)
$createData = function($k, $v){
return 'data-'.$k.'="'.$v.'"';
};
然后在检查行
后的循环中if(!$row) throw new Exception("missing row $el");
$data = implode(' ',array_map($createData, array_keys($row), $row));
$items .= '<img class="itemtop" src="../banners/'.$el.'" alt="img" '.$data.' >'.PHP_EOL;
这样它会根据查询中的内容动态创建data-
,然后如果更改“stuff”,则维护的代码就会减少。
你可以在这里测试一下
最后一件事是你可以重命名查询中的列,如果它们不匹配,例如在数据库中w
实际上是width
,那么你可以像这样重命名
$sqlb = "select width AS w, first AS fname from banners ....;
依此类推,我提到它是因为后者如果你向data
添加一列你只需要更改查询和你的所有集合,你就不必改变HTML的构建方式,但是那取决于你。这就是我如何做到的。
<强>更新强>
这里更大的问题是你的数据库模型不是很正确,这导致了这个问题的其他复杂性。
基本上,您在两个表之间存在许多关系,并且您正在严格限制未正确成型数据所能做的事情。目前你有
//table bplus
items
1,2,3,4
//table banners
fname
1
2
3
4
不要担心数字中的实际数据几乎无关紧要。
你需要的是这样的东西
//table bplus
//other fields
//table banners
fname bplus_id
1 1
2 1
3 1
4 1
老实说,我需要有关数据库的更多信息才能真正提供更多帮助。但我建议调查多对一关系。因为你可以消除在循环中不断调用DB,这可能会变得昂贵,并且可能会简化许多事情。
答案 1 :(得分:0)
您的$el
变量似乎包含导致问题的空格。因此,修剪此数据,然后从db
$sqlb = "select * from banners where fname = '" . trim($el) . "'";
$stb = $db->query($sqlb);
$row = $stb->fetch();
$items .= "<img class='itemtop' src = '../banners/" . $el . "' alt='img' data-id = " . $row['id'] . " data-fname = '" . $row['fname'] . "' data-w = " . $row['width'] . " data-h = " . $row['height'] . ">\n";
}
echo $items;