我就是做错了。作为一个业余程序员来做一个业余项目。这是我在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的数量。
那么我该如何使用变量而不是硬编码的值?
我不在这里,我听不懂。打印的变量值与硬编码示例完全相同。我需要特殊的括号还是某种魔术酱?我不知道。 希望我已经很好地解释了这个问题。如果没有,请告诉我,我会再试一次。
答案 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中已经多次询问并回答了此类问题: