2017-06-16 83 views
0

我有一個用於調度現場技術的數據庫。每個領域的技術人員都有自己獨特的登錄ID,只能看到他自己的具體工作。我最近添加了將多個技術添加到單個票證的功能。我目前正在運行以下循環。每個技術人員目前都可以看到他單獨分配的每項工作。當我開始分配多種技術時,它會變得棘手。假設我總共有3個科技:米奇,達斯汀和邁克爾。PHP - in_array,循環和if語句

如果我將1項工作分配給Michael和Dustin的多項技術工作,那麼在技術人員名單中看起來都不錯。如果我然後爲米奇和達斯汀分配另一份工作。我之前分配給達斯汀的多種技術的工作從他的名單中消失,但仍顯示在Michaels上。

我假設有什麼東西正陷入循環中,但我很難搞清楚。我是一個noob。需要幫忙。

$gettechresult = mysql_query("SELECT tech_id2, tech_id FROM jobs WHERE ((status = '2')) ORDER by $listsort;",$link); 

while ($p_row =mysql_fetch_array ($gettechresult)) { 
    $tech_id2 = $p_row[tech_id2]; 
    $tech_id = $p_row[tech_id]; 
    $fids = explode(",",$tech_id2); 
    $fids2 = explode(",",$tech_id); 

    if (in_array($l_tech_id, $fids)) 
    { 
     $techteam = 'TRUE'; 
    } 
    else{ 
     $techteam = 'False'; 
    } 
    /// Used to make sure the query is not returning False Values   
    echo "$techteam,"; 

    if ($grp_all == "1") 
    { 
     $jobresult = mysql_query("SELECT * FROM jobs WHERE ((status = '2')) ORDER by $listsort;",$link); 
    } 
    elseif ((in_array($l_tech_id, $fids))) 
    { 
     $jobresult = mysql_query("SELECT * FROM jobs WHERE ((tech_id2 ='$l_tech_id' AND status = '2' || tech_id2 IN ('".$fids."') AND status = '2')) ORDER by $listsort;",$link); 
    } 
} 

這裏是我目前的結果This is an image of the scheduled jobs currently in the database

Image of Field tech Dustin's Scheduled List - $l_tech_id = 16

的圖片是不正確的報告回來的唯一工作是一個地方米奇和達斯汀多個科技股。達斯汀是唯一一個不報告一份工作的人。 $ tech_id2是以數組形式捕獲此信息的字段。

+1

實際上,您應該使用關係表查找來查找此表,而不是僅使用Jobs表和後續查詢中的更多列。像'job_assignment'和'jobID'和'techID' - 然後你可以從作業內部加入job_assignment中選擇... jobs.id = job_assignment.jobID where ...'。特別是如果你的數據庫在一個單獨的服務器上(它應該是......),通過讓Sql服務器執行簡單的連接,你可以在PHP應用程序中減少額外的過程/循環時間。 –

+0

這是一個由另一個開發人員創建的10年曆史的系統,我們正嘗試在這一點上與我們的工作一起努力。除非你能提供答案,否則請不要回答問題。 –

+0

'$ l_tech_id'定義在哪裏? – SaidbakR

回答

0

只要tech_id2具有2個或更多值的組合,並且測試值不是列表中的第一個,則SQL where條件tech_id2 ='$l_tech_id'的條件tech_id2 ='$l_tech_id'將爲假。

相反,我會建議使用MySQL find_in_set功能:

where find_in_set(?, tech_id2) and status = 2 

一旦你的設置,你可以從PHP中刪除相應的處理邏輯。

如果你爲這個tech_id2解決方案,然後放棄使用tech_id,或它將成爲一個混亂的每個參考真正的含義。

注意:我特意將?包含在建議的SQL中,因爲您確實應該使用prepared statements來避免SQL injection?代表$l_tech_id的值。

此外,請考慮moving away from mysql_ functions,因爲它們已被棄用多年,現在不再支持PHP 7.x.