2015-09-05 2686 views
0

我正在使用現有的HTML表單來收集有關項目的數據,然後使用PHP將該項目記錄插入到MySQL數據庫中。如何將MySQL列值從數組轉換爲字符串

在窗體中,有一個名爲「staff []」的輸入字段。該字段是一個多選元素,允許用戶選擇多個團隊成員來處理項目。

<form action="" method="post"> 
    <select multiple name="staff[]"> 
     <option value="1">Mary</option> 
     <option value="2">Tyrone</option> 
     <option value="3">Rod</option> 
     <option value="4">Marcus</option> 
     <option value="5">David</option> 
    </select> 
</form> 

例如,用戶選擇Tyrone,Rod和David作爲這個特定項目。如果我們現在插入記錄,那麼數據庫只存儲第一個記錄值,即Tyrone的ID爲2.一般做法是將每個實例存儲在單獨的表中,但這不是我們的系統,並且由於每個項目有4名成員,爲了方便起見,管理層希望我們在每個項目的員工列中插入逗號分隔的數組。

爲了處理這個問題,我們已經創建了一個foreach循環,通過從下拉菜單中選擇的值循環,同時確保後面的逗號不存在:

// Add array into one variable 
$staff_count = count($_POST['project_staff']); 
$i = 0; 
foreach($_POST['project_staff'] as $staff) { 
    if (++$i === $staff_count) { 
     $member_variable .= $staff; 
    } else { 
     $member_variable .= $staff . ", "; 
    } 
} 

按下提交後按鈕,上面的腳本被運行(產生(2,3,5)的數組值),並且該記錄被插入'projects'表中而沒有問題。

這裏說謊的問題。

最後,我們有一個視圖頁面,我們將根據查詢參數調用分配給項目的所有員工,這將是項目ID。例如,如果以前的項目編號爲6,以下URL將用於:

site.com/project/view/?project=6 

在此頁面中,我可以使用下面的變量賦值拯救人員名單:

$project = "SELECT * FROM projects WHERE project = 6"; 
$employee_chosen = $project['project_employee'] 

如果「員工」列僅接受一個僱員(例如如圖4所示,只有一個值),則變量將具有一個編號的值:

$project['project_employee'] (4) 

然後我將能夠運行僱員輔助查詢s這樣:

$employee_chosen = $project['project_employee']; (4) 
query2 = "SELECT * FROM employees WHERE employee_ID = $employee_chosen"; 

這將很容易地帶回在「員工」列中輸入的一名員工。然而,我們正在處理在此列中的值的陣列(2,3,5),所以我質疑以下語句:

$employee_list = $project['project_staff']; (2,3,5) 
$query_employees = "SELECT * FROM employees WHERE employee_id IN ($employee_list)"; 

當運行此查詢,我只接收第一結果從僱員ID 2(如最初用HTML表格所述)。

但是,如果我使用phpMyAdmin直接鍵入三個數字作爲一個字符串:

$query_employees = "SELECT * FROM employees WHERE employee_id IN (2,3,5)"; 

我收到的所有三個員工記錄。

只是爲了確保列數組實際上表現爲一個字符串,我開始對價值的var_dump:

echo var_dump($project['project_staff']); 

這之後,我收到了以下信息:

string(7) "4, 5, 6" 

不有人有主意嗎?

我對我能夠查詢該值的想法感到滿意,因爲之前我收到了幾個非對象和數組錯誤。

在此先感謝您提供的任何幫助。

+0

你有沒有考慮一個不同的模式,有一個多對多的表有一排工作人員的每個成員,每個項目?然後它是一個簡單的連接來查找員工的詳細信息,而不是查詢,解析和重新查詢 –

+0

@RowlandShaw我完全同意。然而,客戶是一家中等規模的公司,我沒有太多喘息空間來提供更好的解決方案。最令我沮喪的是var_dump之後,數組似乎被識別爲一個字符串,但查詢只返回數組中的第一項。 –

+0

不用括號就可以簡單地連接:'$ query_employees =「選擇*從僱員哪裏employee_id IN」。 $ employee_list;' – Parfait

回答

0

我很確定你說的是你正在存儲一個字符串$employee_list可能是'2,3,4'。那麼你的IN ($employee_list)真的是IN ('2,3,4'),但你真正想要的是IN (2,3,4)。有各種各樣的方式到那裏,但你可以做

$employee_list = implode(','(explode(',', $employee_list)); 
+0

幾乎在草稿模式下,我的答案與'explode',然後是'implode'幾乎相同,但正等待OP迴應我的最後評論。即使在最初的'2,3,4'字符串中,原始查詢'$ query_employees'也應該有效。 – Parfait

+0

SQL絕對不會知道你想把它看作整數列表,而不是一個恰好有逗號的字符串。它與'a,b,c'與'a','b','c'沒有區別。 – Elin

+0

@Elin,這個工作很完美。看來這是一個數組轉換爲字符串的問題,由於逗號和引號,它仍然作爲MySQL查詢的數組。太感謝了。 –

相關問題