$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 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>
Почему первые три изображения без каких-либо данных?
В таблице все изображения имеют свои данные.
Похоже, ваша переменная $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;
Вам нужно проверить результаты вашего внутреннего запроса
$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-
основе того, что в запросе, тогда, если вы меняете "материал", это меньше кода для поддержки.
Вы можете проверить это здесь
Последнее, что вы можете переименовать столбцы в запросе, если они не совпадают, например, скажем, в БД, на самом деле width
w
, тогда вы можете переименовать его так
$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
Честно говоря, мне нужна дополнительная информация о базе данных, чтобы действительно помочь больше. Но я предлагаю изучить отношения "многие к одному". Поскольку вы можете устранить непрерывный вызов БД внутри цикла, что может стать дорогостоящим и, вероятно, упростить многие вещи.
el
.
$row
, я думаю, что использование столбца с запятыми для идентификаторов, вероятно, является неправильным способом сделать это.
$arr
- это не то, что вы думаете.$items .= "<img
то вам не нужны.
Dots. Например"<img class='itemtop' src='../banners/{$el}' alt='img' ...."
Тем не менее, мне не нравятся одинарные кавычки в атрибутах HTML, но это всего лишь мнение.