多个AND语句不适用于sql

时间:2016-10-12 21:42:09

标签: php mysql sql mysqli

我有动漫表,标题,流派 和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:数据库中的所有动画都具有完全相同的类型

4 个答案:

答案 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的所有记录?在这种情况下,您应该使用ORIN运算符,例如

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)。这将为您提供指定动作和喜剧类型的记录 不是最有效的查询,但您需要在优化之前获得正确的结果,对吗?