У меня есть некоторый код, где я хочу, чтобы он показывал только строки, в которых есть определенная строка в столбце. У меня есть столбец «Теги», в котором есть теги в этом формате «тег1, тег2» и т. Д. Я хочу иметь ссылки, чтобы люди могли показывать продукты только с определенным тегом. Здесь я сталкиваюсь с проблемами. Я не могу заставить его показывать строки с определенными тегами, он показывает каждую строку.
<?php
try {
//open the database
$db = new PDO('sqlite:prodDb.sqlite');
$tag = $_POST['tag'];
if (isset($tag)) {
$result = $db->query('SELECT * FROM Products WHERE instr(Tags, $tag) > 0');
} else {
$result = $db->query('SELECT * FROM Products ');
}
//now output the data to a simple html table...
$result = $db->query('SELECT * FROM Products');
foreach ($result as $row) {
print "" . $row['Id'] . "<br />";
print "" . $row['Name'] . "<br />";
$tags = explode(', ', $row['Tags']);
foreach ($tags as $tag) {
print "Tag: " . $tag . "<br />";
}
print "" . $row['Link'] . "<br />";
print "" . $row['Screenshot'] . "<br />";
print "" . $row['Download'] . "<br />";
}// close the database connection
$db = NULL;
}
catch (PDOException $e) {
print 'Exception : ' . $e->getMessage();
}
?>
Есть идеи, где я ошибся?
Избавиться от $db->query
строка здесь:
//now output the data to a simple html table...
$result = $db->query('SELECT * FROM Products');
Вы отбрасываете результаты запроса, соответствующего тегу, и используете этот запрос, который возвращает все продукты.
В запросе с тегом у вас есть синтаксическая ошибка, потому что вам нужны кавычки вокруг строки. Было бы лучше использовать подготовленный запрос:
$stmt = $db->prepare('SELECT * FROM Products WHERE INSTR(Tags, :tag)');
$stmt->execute(array(':tag' => $tag));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Кроме того, если у вас есть все теги в одном столбце, у вас плохой дизайн таблицы. Вы должны нормализовать свои данные, переместив теги в отдельную таблицу, по одной строке на тег для каждого продукта.
Это, вероятно, не работает, потому что здесь:
//now output the data to a simple html table...
$result = $db->query('SELECT * FROM Products');
Вы просто выбираете все товары и игнорируете предыдущий запрос / фильтр.