Php 多语句和语句不适用于sql
我有动画表,有动画id、标题、类型 和带有类型id的类型表,类型Php 多语句和语句不适用于sql,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有动画表,有动画id、标题、类型 和带有类型id的类型表,类型 和具有动画id、流派id的查找表 每部动画至少有两种类型(动作、喜剧、戏剧) html 行动 喜剧 戏剧 php if($\u服务器['REQUEST\u METHOD']=='POST'){ $genres=@$_POST['genres']或die('p class=“list”style=“width:100%;“>至少选择一种类型)”; $statement=''; foreach($genres as$genres
和具有动画id、流派id的查找表 每部动画至少有两种类型(动作、喜剧、戏剧) html
- 行动
- 喜剧
- 戏剧
php
if($\u服务器['REQUEST\u METHOD']=='POST'){
$genres=@$_POST['genres']或die('p class=“list”style=“width:100%;“>至少选择一种类型)”;
$statement='';
foreach($genres as$genres\u id){
$statement.=“AND tyres\u id=”$tyres\u id';
}
$sql=“从表中选择不同的表
其中1$对账单”;
$result=mysqli_query($conn,$sql)或die('cant getd');
如果(mysqli_num_行($result)>0){
while($row=mysqli\u fetch\u assoc($result)){
$anime_id=$row['id'];
$sql=“从表中选择id、标题
其中id=“$table”;
$r=mysqli_查询($conn,$sql)或die('cant table from table');
如果(mysqli_num_行($r)>0){
而($table=mysqli\u fetch\u assoc($r)){
$id=$table['id'];
$title=$table['title'];
回声“”;
}
}否则{echo'未找到结果,请尝试其他类型。
'}
}
}否则{echo''}
}?>
如果我只选择一种类型,但在多个类型上选择查询失败,则查询工作正常
求求你,有什么帮助吗
ps:数据库中的所有动画都有完全相同的类型想想你在做什么:
WHERE 1 AND foo=bar AND foo=baz AND foo=qux
一个字段如何同时精确地匹配多个不同的值
你基本上是说“这辆车一定是一只香蕉、一只小猫和一艘潜艇”。不,一辆车只能是一辆车(忽略奥斯卡·梅尔·韦内莫比尔…)
也许您应该使用
或来代替…如果您想要获得所有具有您选择的任何ID的,您需要使用或。使用AND将只获取同时具有所有ID的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'";
}
if($\u服务器['REQUEST\u METHOD']=='POST'){
$genres=@$_POST['genres']或die('p class=“animelist”style=“width:100%;”>至少选择一种流派);
$statement='';
foreach($genres as$genres\u id){
$statement.=“或类型id=”$genres\u id';
}
也许您想要获取所提供id的所有记录?在这种情况下,您应该在
操作符中使用或
或,例如
其中类型id='a'或类型id='b'或..
或
其中genres\u id in('a','b',…)
我怀疑每个记录只有一个genres\u id,因此没有记录同时具有genres\u id=1和genres\u id=2。它将匹配一个或另一个。在这种情况下,您希望查询是一个or查询(genres\u id=1或genres\u id=2),或者最好在(1,2)中使用IN子句-genres_id
您可能还想研究清理输入以避免sql注入攻击向量等。您似乎是在将原始输入附加到sql查询,而不是使用参数化查询,这可能会带来真正的安全风险,并允许用户获得对数据库的完全访问权或擦除所有数据
---根据评论更新---
因此,您似乎不了解记录选择是如何工作的—您正在查询记录—如果您加入表,您仍在筛选该加入的每一行。因此,如果您有一列“流派id”具有值,则同一行的值不能是1和2。
AnimeID=1,类型=喜剧是一个记录
AnimeID=1,Genre_id=Action是另一个记录。
任何类型id=喜剧和类型id=动作查询都不会匹配任何一行,因为两行都不满足这两个条件。
但是,您可以通过子查询来实现这一点-其中AnimeID位于何处(从类型中选择AnimeID,其中类型为喜剧)和AnimeID位于何处(从类型中选择AnimeID,其中类型为动作)。这将获得指定动作和喜剧类型的记录。
不是最有效的查询,但在优化之前需要得到正确的结果,对吗?var\u dump$sql,然后再执行它,看看它有多糟糕,如果使用或for(动作和喜剧)例如,这意味着我将获得所有带有动作或
喜剧ID的动画,但如果将或
用于(动作和喜剧),我只希望动画同时具有动作和
喜剧例如,这意味着我将获得所有带有动作<代码>或<代码>喜剧ID的动画,但我只希望动画同时具有动作<代码>和<代码>喜剧,然后你需要更复杂的东西:其中,流派在(…)中具有计数(流派)=2
-类型。这似乎是一个好的解决方案,我可能需要一个整数($int)要计算选择了多少种类型来替换2,而不是像这样的其中(…)中的类型具有count(genera)=$int
对吗?差不多。在x(foo,bar,…)
只是重复的x=foo或x=bar或…
的快捷方式,如果任何匹配项都会成功,但无法直接指定最小匹配数,这就是的计数(…)
进入。正如我在前面所说的,所有记录都同时具有所有类型,如果我使用或进行(动作和喜剧)查询,我不希望使用或进行查询例如,这意味着我将获得所有带有action或
喜剧ID的动画,但我只希望动画同时具有action和
喜剧ID,因此您似乎不了解记录选择的工作原理-您正在查询记录-如果您加入表,您仍在筛选该加入的每一行。因此,如果您有一个记录选择,那么带有值的“类型id”列
WHERE 1 AND foo=bar AND foo=baz AND foo=qux
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'";
}