缺少从表中查询数据

时间:2018-04-17 05:31:17

标签: php mysql mysqli

$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>

为什么前三张图片没有任何数据?

在表格中,所有图像都有其数据。

2 个答案:

答案 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”,则维护的代码就会减少。

你可以在这里测试一下

https://3v4l.org/Lo9Vf

最后一件事是你可以重命名查询中的列,如果它们不匹配,例如在数据库中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;