1

我对 IN 子句有这个奇怪的问题

变量 $fuel 来自对这个 php 页面的 Ajax 调用。

$fuel = $_REQUEST['fuel'];

var_dump($fuel) = 'gas' ( for instance)

现在,当在发起 Ajax 调用的 php 页面中未选择 $fuel 时,我需要使用以下代码为 $fuel 插入所有可能的值:

 if($fuel=='none'){
    $fuel=array('gas','diesel','hybrid','electric');
    $fuel=implode(',',$fuel);
} 

这是查询。当值直接来自 Ajax 调用时,它可以正常工作,例如,当 $fuel = 'gas' 时。

但是当我的 IF 子句生成 $fuel 并且是 $fuel = 'gas,diesel,hybrid,electric' 时,它给了我一个空集。

SELECT * FROM vprice_range WHERE (power >= $power)
            AND (price BETWEEN $low AND $high)
            AND (fuel IN ('$fuel'))
            AND (mileagemix < $mileage)
            AND (emission_co2 < $co2)
            AND (trunk >= $trunk)

这可能无关紧要,但请注意 FIELD 'fuel' 是一个 ENUM 字段('gas','diesel','hybrid','electric')

据我所知 $fuel 被正确格式化为字符串。

请指教

4

3 回答 3

5

您的问题是您的IN子句的值需要被引用WHERE whatever IN ('one','two','three'),等等。您可以使用$fuel = "'" . implode("','", $fuel) . "'";. 不过需要注意的是,如果您要按所有可能的值进行选择,为什么不AND fuel IN完全不考虑这种情况呢?

于 2013-06-16T18:25:28.947 回答
1

它正在接受字符串变量。问题是整个字符串被解释为一个值,例如'gas,diesel,. . .'. 这不是你的意思。

相反,使用find_in_set()

. . .
and find_in_set(fuel, $fuel) > 0)
于 2013-06-16T18:22:01.367 回答
0

@Gordon Linoff 是正确的。另一种解决方案是提供缺少的单引号:

$fuel=implode("','",$fuel);
于 2013-06-16T18:25:58.090 回答