2017-09-12 57 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