Нулевой оператор объединения и предложение SQL IN

Моя домашняя страница отображает таблицу с различными данными, взятыми из БД на основе команды текущего пользователя. Я создаю cookie с командой, когда пользователь входит в систему, в которую я читаю при отображении таблицы.

Когда пользователь не вошел в систему, я также хочу отобразить таблицу, но я хочу, чтобы она показывала данные для 2 (или более) команд. Я сейчас использую временное решение, используя оператор null coalesce, который по умолчанию равен первой команде и выглядит так: $team = $_COOKIE ['team'] ?? 1;

И мой запрос: $associates = "SELECT associate_id, first_name, last_name FROM scp.associates WHERE team = '$team' ORDER BY associate_id ASC";

Есть ли способ изменить один или оба из них, чтобы получить желаемый результат? До сих пор я пробовал следующее:

$team = $_COOKIE ['team'] ?? '1, 2';
$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN ('$team') ORDER BY team ASC, associate_id ASC";

который работает, если установлен cookie и:

$team = $_COOKIE ['team'] ?? "'1', '2'";
$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN ($team) ORDER BY team ASC, associate_id ASC";

который работает, когда cookie не установлен … Я пробовал другие варианты, но не смог заставить его работать. Есть идеи? Спасибо!

редактировать: Мой файл cookie — это строка, и я сейчас использую подготовленные операторы. Новый код выглядит так:

$team = $_COOKIE['team'] ?? '1';
$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN (?) ORDER BY team ASC, associate_id ASC";
$res_associates = odbc_prepare ( $conn, $associates );
odbc_execute ( $res_associates, array ( $team ) );

Когда я перехожу на '1, 2'Я не получаю никаких результатов от БД. мой if ( odbc_num_rows ( $res_associates ) > 0 ) ложно

Edit2: Когда я добавляю значения непосредственно в мой запрос, он работает, но когда он берет их из переменной (подготовленной или нет), он не …

Так что это работает:

$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN ('1', '2') ORDER BY team ASC, associate_id ASC";

Но это не так:

$team = $_COOKIE['team'] ?? " '1', '2'";
$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN (?) ORDER BY team ASC, associate_id ASC";

(пробел между «и» необходим, чтобы он не думал, что это файл)

Решение:

$team = $_COOKIE['team'] ?? '1,2';
$terms = explode ( ',', $team );
$placeholders = rtrim ( str_repeat ( '?, ', count ( $terms ) ), ', ' );

$associates = "SELECT associate_id, first_name, last_name FROM scp.associates
WHERE team IN ($placeholders) ORDER BY team ASC, associate_id ASC";

$res_associates = odbc_prepare ( $conn, $associates );
odbc_execute ( $res_associates, $terms );

1

Решение

Вы должны разделить на ,s, поместите заполнители в ваш запрос, а затем свяжите каждый термин.

Что-то вроде (я предполагаю, что вы используете PDO, если не очистить execute позвоните и используйте соответствующий вызов для вашего водителя) это будет делать это:

$team = $_COOKIE['team'] ?? '1, 2';
$terms = explode(',', $team);
$placeholders = rtrim(str_repeat('?, ', count($terms)), ', ');
$associates = "SELECT associate_id, first_name, last_name
FROM scp.associates
WHERE team IN ($placeholders)
ORDER BY team ASC, associate_id ASC";
$get_stuff = $pdo->prepare($associates);
$get_stuff->execute($terms));

Грубая демонстрация: https://3v4l.org/REqPc

3

Другие решения

Это, скорее всего, проблема типа, пара вопросов, которые нужно задать при решении этого типа проблемы. Какой тип $_COOKIE ['team']? и какой тип team в базе данных?

Вариант 1: я думаю, что PHP, вероятно, думает $_COOKIE ['team'] int, когда он должен быть строкой, и ему нужны кавычки. Таким образом, вы можете сделать что-то вроде этого, что неявно приведёт это к строке и добавляет кавычки

$team = $_COOKIE ['team'] ? "'" . $_COOKIE ['team'] . "'" : "'1', '2'";

Вариант 2: Добавить кавычки в запросе, как в первом
WHERE team IN ('$team')
а затем просто бросить его в строку.

$team = $_COOKIE ['team'] ? (string) $_COOKIE ['team'] : '1, 2';

0

По вопросам рекламы [email protected]