在多个“ NOT IN”子句中使用变量

时间:2019-03-19 21:22:47

标签: php mysql join where

我就是做错了。作为一个业余程序员来做一个业余项目。这是我在php网页上使用的MySQL语句:

Spring Boot

上面的代码带有一些硬编码的值,可以正常工作。对于排行榜来说,这对于每个玩家来说都是最佳的圈速时间。并且不包括平台值为“ PS4”或“ XB1”,控制器值为“ Gamepad”或“ Keyboard”以及设置值为“ Custom”的结果。但是我想做的是用变量替换WHERE子句中的硬编码值。我可以用 ?对于轨道,车辆,车辆类别以及限制和偏移,使用绑定参数,没有问题。但是对于平台,控制器和设置,我不能使用变量,尽管代码可以与硬编码的值很好地工作。

三个NOT IN子句排除具有这些值的记录。在示例中,$stmt = $mysqli->prepare("SELECT t1.* FROM laptimes t1 JOIN ( SELECT gamertag, track, vehicle, vehicleclass, platform, controller, setup, MIN(laptime) AS min_laptime FROM laptimes WHERE track LIKE ? AND vehicle LIKE ? AND vehicleclass LIKE ? AND platform NOT IN ('PS4','XB1') AND controller NOT IN ('Gamepad','Keyboard') AND setup NOT IN ('Custom') GROUP BY gamertag, vehicle, vehicleclass ) AS t2 ON t1.gamertag = t2.gamertag AND t1.laptime = t2.min_laptime AND t1.track = t2.track AND t1.vehicle = t2.vehicle AND t1.vehicleclass = t2.vehicleclass AND t1.platform = t2.platform AND t1.controller = t2.controller AND t1.setup = t2.setup ORDER BY laptime ASC LIMIT ? OFFSET ?"); $stmt->bind_param("sssii", $trackselect, $carselect ,$classelect, $limit, $offset); $stmt->execute(); 排除“平台”列中PC或PS4值的结果。而不是硬编码的值,我想使用$ platform,$ controller,$ setup。我已经尝试了大括号,括号,反勾,撇号,双引号的所有组合;似乎没有任何工作。

例如,如果我在$ platform上打印值,它将显示:platform NOT IN ('PS4',XB1')(仅作为示例,值是由复选框设置的。因此它看起来与我的硬编码值相等。

如果我将硬编码值替换为? (相应地调整bind_param),即使我勾选了复选框,也不会从结果中排除任何东西(我打印了$ platform,$ controller,$ setup的值,看起来很正确)。

如果我改为这样做:'PS4','XB1',那么它可以工作。但是,如果我对控制器和设置进行相同的操作,platform NOT IN ($platform)则会收到以下错误消息: controller NOT IN ($controller) AND setup NOT IN ($setup)指向具有bind_param的行。我已调整bind_param行以更正“ sss”和$ variables的数量。

那么我该如何使用变量而不是硬编码的值?

我不在这里,我听不懂。打印的变量值与硬编码示例完全相同。我需要特殊的括号还是某种魔术酱?我不知道。 希望我已经很好地解释了这个问题。如果没有,请告诉我,我会再试一次。

2 个答案:

答案 0 :(得分:2)

如果字符串中包含逗号分隔的值列表,则可以使用FIND_IN_SET()来匹配其中之一。您将绑定参数用作列表的字符串。

因此使用:

$controller = 'Gamepad,Keyboard';
$platform = 'PS4,XB1';
$setup = 'Custom';

,然后使用您的查询:

AND NOT FIND_IN_SET(platform, ?) 
AND NOT FIND_IN_SET(controller, ?) 
AND NOT FIND_IN_SET(setup, ?)

并将这些参数绑定到上述变量。

答案 1 :(得分:0)

您正在尝试将IN()内的多个值绑定到一个变量。参数化要求文字值与绑定值一对一匹配。因此,您尝试以下操作:

$platform = "'PS4','XB1'"
...

WHERE ... platform NOT IN (?)

应替换为:

$platform1 = 'PS4'
$platform2 = 'XB1'
...

WHERE ... platform NOT IN (?, ?)

同样,您希望将qmark动态放置在IN()内,并动态绑定需要使用操纵数组的多个变量。在SO上的PHP中已经多次询问并回答了此类问题: