我只是无法做到这一点。作为业余爱好程序员做一个爱好项目。这是我在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”和$变量的数量。
那么我如何使用变量而不是硬编码值呢?
我离开了我的联盟,我无法理解。打印变量值与硬编码示例完全相同。我需要一种特殊的括号,或某种魔术酱?我不知道。希望我已经很好地解释了这个问题。如果没有,请告诉我,我会再试一次。
如果字符串中有逗号分隔的值列表,则可以使用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, ?)
并将这些参数绑定到上面的变量。
您正在尝试使用一个变量绑定IN()
中的多个值。参数化需要将文字值与绑定值进行一对一匹配。因此,您的以下尝试:
$platform = "'PS4','XB1'"
...
WHERE ... platform NOT IN (?)
应更换为:
$platform1 = 'PS4'
$platform2 = 'XB1'
...
WHERE ... platform NOT IN (?, ?)
可能,您希望在IN()
中动态放置qmarks并动态绑定需要使用操作数组的多个变量。这个类型的问题已在PHP上的SO上多次询问和回答: