2017-09-12 29 views
1

我的主页显示一个基于当前用户的团队从数据库中获取不同数据的表。当用户登录时,我正在为团队创建一个cookie,以便在显示表格时阅读。空合并运算符和SQL IN子句

当用户没有登录时,我也想显示该表,但我希望它显示2个(或更多)团队的数据。我使用的是临时的解决方案,现在使用空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',我没有得到来自DB结果。我的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); 
+0

刚确保你使用的是什么版本的PHP? –

+0

我正在运行PHP版本7.0.3的WAMP – IcedAnt

+0

我通过参数化假设你的意思是准备好的语句。我意识到这一点,目前正在更新所有内容。至于你的建议,我不能说我确定你的意思。你能扩展还是提供一个例子?谢谢! – IcedAnt

回答

3

你应该各执一, 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

+0

我修改了您的解决方案以便与'odbc'一起使用,但我没有得到任何结果从我的数据库。 '$ associate =“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);我的'if(odbc_num_rows($ res_associates)> 0)'是错误的。 – IcedAnt

+0

'$ placeholders'进入查询中,'$ terms'是值的数组,需要绑定。 – chris85

+0

'$ placeholders'正在查询中,它取代了'?'。 – IcedAnt

0

这可能是一种问题,解决这类问题时,几件事情要问。 $_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

我同意这可能是一个类型问题,这就是为什么我玩弄引号。在数据库中,'team'是varchar(50),所以我认为cookie也是一个字符串。我会尝试你的确切代码,尽管我已经尝试将它转换为字符串。谢谢! – IcedAnt

+0

当cookie没有设置时,我在两个解决方案上得到'Notice:Undefined index:team'。 – IcedAnt

+0

根据将要发生的警告级别,尝试用 '$ team = isset($ _ COOKIE ['team'])'代替 – zzbomb