Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多语句和语句不适用于sql_Php_Mysql_Sql_Mysqli - Fatal编程技术网

Php 多语句和语句不适用于sql

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的类型表,类型
和具有动画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'";
    }