Вероятно, вам стоит сначала взглянуть на этот ответ Поиск в массиве SQL (как хранить такую информацию в базе данных).Если вы все еще хотите использовать список, разделенный запятыми, лучше всего использовать explode()
, array_map()
и implode()
:
function generateLink( $tag){
$tag = htmlspecialchars( trim( $tag));
$str = "<a href=\"/tags/$tag\">$tag</a>";
}
$tags = explode( ',', $row['tags']);
$new_tags = array_map( 'generateLink', $tags);
echo implode( ', ', $new_tags);
// Of course you can chain it to:
echo implode( ', ', array_map( 'generateLink', explode( ',', $row['tags'])));
Однако, если вы используете правильный дизайн базы данных, вы должны это SELECT
(с отображением одного продукта):
SELECT tags.name
FROM tags_products
INNER JOIN tags ON tags_products.tag_id = tags.id
WHERE tags_products,product_id = ?
И с php:
$q = $db->query( 'mentioned select');
$result = array();
while( $row = $q->fetch_assoc()){
$result[] = genereateLink( $row['name']);
}
И в случаемассовый список продуктов для повышения производительности используйте этот выбор с GROUP_CONCAT
:
SELECT products.id, products.name, GROUP_CONCAT(tags.name ASC SEPARATOR ', ') AS tags
FROM products
LEFT JOIN tags_products ON tags_producsts.product_id = products.id
INNER JOIN tags ON tags_products.tag_id = tags.id
GROUP BY products.id
и примените первый упомянутый код к $row['tags']
:)