Запросы данных из таблицы отсутствуют

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

Почему первые три изображения без каких-либо данных?

В таблице все изображения имеют свои данные.

  • 0
    не зная, что находится в базе данных, я просто догадываюсь, я бы поспорил, что $arr - это не то, что вы думаете.
  • 0
    Также, если вы собираетесь использовать двойные кавычки в $items .= "<img то вам не нужны . Dots. Например "<img class='itemtop' src='../banners/{$el}' alt='img' ...." Тем не менее, мне не нравятся одинарные кавычки в атрибутах HTML, но это всего лишь мнение.
Показать ещё 13 комментариев
Теги:
mysqli

2 ответа

1
Лучший ответ

Похоже, ваша переменная $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;
1

Вам нужно проверить результаты вашего внутреннего запроса

$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- основе того, что в запросе, тогда, если вы меняете "материал", это меньше кода для поддержки.

Вы можете проверить это здесь

https://3v4l.org/Lo9Vf

Последнее, что вы можете переименовать столбцы в запросе, если они не совпадают, например, скажем, в БД, на самом деле 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 

Честно говоря, мне нужна дополнительная информация о базе данных, чтобы действительно помочь больше. Но я предлагаю изучить отношения "многие к одному". Поскольку вы можете устранить непрерывный вызов БД внутри цикла, что может стать дорогостоящим и, вероятно, упростить многие вещи.

  • 0
    Большое спасибо. Решено с помощью обрезки el .
  • 0
    Я бы все-таки проверил, в порядке ли $row , я думаю, что использование столбца с запятыми для идентификаторов, вероятно, является неправильным способом сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню