Моя домашняя страница отображает таблицу с различными данными, взятыми из БД на основе команды текущего пользователя. Я создаю 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 );
Вы должны разделить на ,
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
Это, скорее всего, проблема типа, пара вопросов, которые нужно задать при решении этого типа проблемы. Какой тип $_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';