致命错误:未捕获PDOException:SQLSTATE [42S22]:找不到列

时间:2017-05-28 14:20:51

标签: php mysql pdo

我目前正在制作一个项目,其中显示了一个配方,其中包含以公式形式检查的成分。我接近结束但我真的不明白我的错误是什么。如果有人可以向我解释:

  

致命错误:未捕获PDOException:SQLSTATE [42S22]:找不到列:   1054未知专栏' $ idingredient'在' where子句'在   /homepages/30/d675437312/htdocs/assets/recettemalin/recetteselectionnee.php:55   堆栈跟踪:#0   /homepages/30/d675437312/htdocs/assets/recettemalin/recetteselectionnee.php(55):   PDO->查询(' SELECT DIST ...')#1 {main}引入   /homepages/30/d675437312/htdocs/assets/recettemalin/recetteselectionnee.php   在第55行

这是我阻止的代码:

if (isset($_POST['ingredients'])) {
        $idingredient = implode(",", $_POST['ingredients']);
        echo $idingredient.'<br>';
        $recette = $bdd->query('    SELECT DISTINCT r.*
                                    FROM ingredient i
                                    INNER JOIN contient c
                                       ON i.id_i = c.id_i
                                    INNER JOIN recette r
                                       ON c.id_r = r.id_r
                                    WHERE i.id_i IN ($idingredient)');
    while ($donnees = $recette->fetch()) {
        echo $donnees['nom_r'];
        echo $donnees['type_r'];
        echo $donnees['description'];
    }
}

当我回复$idingredient时,我得到一份这样的成分ID列表:6,9,11,12,1,5但似乎不喜欢这个和我的条款#39;我想知道为什么?

2 个答案:

答案 0 :(得分:0)

您应该在查询字符串中使用“而不是”来评估变量:

$recette = $bdd->query("  SELECT DISTINCT r.*
                                    FROM ingredient i
                                    INNER JOIN contient c
                                       ON i.id_i = c.id_i
                                    INNER JOIN recette r
                                       ON c.id_r = r.id_r
                                    WHERE i.id_i IN ($idingredient)");

或者你可以将变量concatinate到字符串:

'.....' . $idingredient . '...';

答案 1 :(得分:0)

评论太长了。

首先,参数化您的查询。不要将随机字符串转储到查询中,因为它可能导致语法错误。

其次,你的具体问题是你输入一个字符串,但是没有字符串分隔符。因此,该值被解释为标识符 - 特别是列别名。我不推荐这个解决方案,但WHERE i.id_1 IN ('$idingredient')可能会做你想要的。

第三,不要使用IN来比较单个值。这是误导。此外,该值是单个值,即使它有逗号。 。 。 'butter,margarine'是一个带逗号的值,而不是两个值。