空合并运算符和 SQL IN 子句

Null Coalesce Operator and SQL IN clause

我的主页显示 table,其中包含根据当前用户团队从数据库中获取的不同数据。当用户登录时,我正在与团队一起创建一个 cookie,我在显示 table.

时正在阅读

当用户未登录时,我也想显示 table,但我希望它显示 2 个(或更多)团队的数据。我正在使用一个临时解决方案,现在使用默认为第一个团队的空合并运算符,看起来像这样:$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";

(" 和 ' 之间的 space 是必需的,所以它认为它不是文件)

解决方案:

$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 );

这可能是类型问题,解决此类问题时要问几个问题。 $_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';

您应该拆分 ,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