Использование переменных в нескольких предложениях NOT IN - PullRequest
0 голосов
/ 20 марта 2019

Я просто не могу понять это правильно. Заниматься хобби-проектом в качестве хобби-программиста. Вот заявление MySQL, которое я использую на веб-странице php:

$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», значениями контроллера «Gamepad» или «Keyboard» и значениями настройки «Custom». Но я хочу заменить жестко закодированные значения в предложении WHERE переменными. Я могу использовать ? для трека, транспортного средства, класса транспортного средства и предела и смещения, используя параметры привязки, нет проблем. Но для платформы, контроллера и установки я не могу использовать переменные, хотя код отлично работает с жестко закодированными значениями.

Три предложения NOT IN исключают записи со значениями тезисов. В этом примере platform NOT IN ('PS4',XB1') исключает результаты со значениями ПК или 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" и $.

Так, как я могу использовать переменные вместо жестко закодированных значений?

Я вышел из своей лиги здесь, я не могу этого понять. Напечатанные значения переменных в точности соответствуют жестко закодированным примерам Нужен ли особый вид скобок или какой-то волшебный соус? Я не знаю. Надеюсь, я объяснил проблему достаточно хорошо. Если нет, дайте мне знать, и я попробую еще раз.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Если у вас есть список значений в строке через запятую, вы можете использовать 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 голосов
/ 20 марта 2019

Вы пытаетесь связать несколько значений внутри IN() с одной переменной. Параметризация требует однозначного совпадения литерального значения с привязанным значением. Поэтому ваша попытка ниже:

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

WHERE ... platform NOT IN (?)

Должен быть заменен на:

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

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

Вероятно, вы хотите динамически размещать qmarks внутри IN() и динамически связывать несколько переменных, что требует использования манипулирования массивом. Этот тип вопроса задавался и отвечался несколько раз в PHP на SO:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...