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

问题描述 投票:0回答:2

我只是无法做到这一点。作为业余爱好程序员做一个爱好项目。这是我在php网页上使用的MySQL语句:

$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();

上面的代码,带有一些硬编码值,工作正常。对于每个玩家来说,它都是最好的选择。它排除了平台值“PS4”或“XB1”,控制器值“游戏手柄”或“键盘”以及设置值“自定义”的结果。但我想要做的是用变量替换WHERE子句中的硬编码值。我可以用 ?对于轨道,车辆,车辆类和限制和偏移,使用绑定参数,没问题。但是对于平台,控制器和设置,我不能使用变量,尽管代码在硬编码值下工作正常。

三个NOT IN子句排除带有这些值的记录。在该示例中,platform NOT IN ('PS4',XB1')排除了“平台”列中具有PC或PS4值的结果。而不是硬编码值,我想使用$ platform,$ controller,$ setup。我已经尝试了大括号,括号,后退,撇号,双引号的所有组合;似乎没什么用。

如果我打印例如$ platform的值,它会显示:'PS4','XB1'(只是一个例子,值由复选框设置。所以它看起来等于我的硬编码值。

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

如果我这样做:platform NOT IN ($platform)那么它的工作原理。但是,如果我对控制器和设置做同样的事情,controller NOT IN ($controller) AND setup NOT IN ($setup)我收到此错误消息:Fatal error: Call to a member function bind_param() on a non-object指向bind_param的行。我已调整bind_param行以更正“sss”和$变量的数量。

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

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

php mysql join where
2个回答
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, ?)

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


0
投票

您正在尝试使用一个变量绑定IN()中的多个值。参数化需要将文字值与绑定值进行一对一匹配。因此,您的以下尝试:

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

WHERE ... platform NOT IN (?)

应更换为:

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

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

可能,您希望在IN()中动态放置qmarks并动态绑定需要使用操作数组的多个变量。这个类型的问题已在PHP上的SO上多次询问和回答:

© www.soinside.com 2019 - 2024. All rights reserved.