2015-09-05 2700 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查询的数组。太感谢了。 –

相关问题