我有动漫表,标题,流派 和genres-id,类型的流派表 和anime-id,genres-id的查找表 每部动漫至少有两种类型(动作,喜剧,戏剧)
HTML
<ul class="genres">
<li><input type='checkbox' name='genres[]' value='1'> action</li>
<li><input type='checkbox' name='genres[]' value='2'> comedy</li>
<li><input type='checkbox' name='genres[]' value='3'> drama</li>
</ul>
php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$genres = @$_POST['genres']or die('<p class="list" style="width: 100%;">Select at least one genres</p>');
$statement = '';
foreach ($genres as $genres_id) {
$statement .= " AND genres_id='$genres_id'";
}
$sql = "SELECT DISTINCT table FROM table
WHERE 1 $statement";
$result = mysqli_query($conn, $sql)or die('cant getd');
if(mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
$anime_id = $row['id'];
$sql = "SELECT id,title FROM table
WHERE id='$table'";
$r = mysqli_query($conn, $sql)or die('cant table from table');
if(mysqli_num_rows($r) > 0) {
while($table= mysqli_fetch_assoc($r)) {
$id = $table['id'];
$title = $table['title'];
echo "<p class='list'><a href='http://$_SERVER[SERVER_NAME]/watch.php?id=$id'>$title</a></p>";
}
}else {echo '<p class="animelist" style="width: 100%;">No Resault found, Try a different genres.</p>';}
}
}else {echo '<p class="table" style="width: 100%;">No Resault found, Try a different combination of genres.</p>';}
}?>
如果我只选择一种类型但是在多种类型上选择查询失败,则查询工作正常 拜托,有什么帮助吗?
ps:数据库中的所有动画都具有完全相同的类型
答案 0 :(得分:0)
想想你在做什么:
WHERE 1 AND foo=bar AND foo=baz AND foo=qux
究竟该单个字段是如何同时并且完全匹配多个不同的值?
你基本上是在说“这辆车必须是香蕉,小猫和潜水艇”。没有。一辆汽车只能成为一辆汽车(忽视Oscar Meier Weinermobiles ......)
也许您应该使用OR
而不是......
答案 1 :(得分:0)
如果您希望获得所有已选择的ID,则需要使用OR。使用AND只会获得同时具有所有ID的那些
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$genres = @$_POST['genres']or die('<p class="animelist" style="width: 100%;">Select at least one genres</p>');
$statement = '';
foreach ($genres as $genres_id) {
$statement .= " OR genres_id='$genres_id'";
}
答案 2 :(得分:0)
也许你想获得所提供id的所有记录?在这种情况下,您应该使用OR
或IN
运算符,例如
WHERE genres_id='a' OR genres_id = 'b' OR ..
OR
WHERE genres_id in ('a', 'b', ..)
答案 3 :(得分:0)
我怀疑每条记录只有一个genres_id,因此没有记录会同时具有genres_id = 1和genres_id = 2。它会匹配其中一个。在这种情况下,您希望您的查询是OR查询(genres_id = 1或genres_id = 2),或者更好的是使用IN子句 - genres_id IN(1,2)。
您可能还需要考虑清理输入以避免sql注入攻击向量等。看起来您将原始输入附加到sql查询而不是使用参数化查询,这可能是真正的安全风险,并允许用户获得对数据库的完全访问权限或擦除所有数据。
---基于评论的更新---
因此,您似乎无法理解记录选择的工作原理 - 您正在查询记录 - 如果您连接表,您仍然会过滤该连接的每一行。因此,如果“genre_id”有一列带有一个值,则该值不能为1和2,对于同一行。
AnimeID = 1,Genre_id =喜剧是一条记录
AnimeID = 1,Genre_id = Action是另一条记录
任何Genre_id = Comedy和Genre_ID = Action查询都不匹配任何一行,因为两行都不符合这两个标准
您可以使用子查询执行此操作 - WHERE AnimeID IN(SELECT AnimeID FROM Genres WHERE Genre_ID = Comedy)和AnimeID IN(SELECT AnimeID FROM Genres WHERE Genre_ID = Action)。这将为您提供指定动作和喜剧类型的记录
不是最有效的查询,但您需要在优化之前获得正确的结果,对吗?