mysql IN子句不接受字符串变量

时间:2013-06-16 18:19:57

标签: mysql

我对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'燃料'是一个ENUM字段('gas','diesel','hybrid','electric')

据我所知,$ fuel的格式正确为字符串。

请告知

3 个答案:

答案 0 :(得分:4)

您的问题是IN子句的值需要引用WHERE whatever IN ('one','two','three')等等。您可以使用$fuel = "'" . implode("','", $fuel) . "'";解决此问题。但需要注意的是,如果您选择所有可能的值,为什么不在这种情况下将AND fuel IN完全从查询中删除?

答案 1 :(得分:1)

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

相反,请使用find_in_set()

. . .
and find_in_set(fuel, $fuel) > 0)

答案 2 :(得分:0)

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

$fuel=implode("','",$fuel);