【发布时间】:2015-09-05 19:59:23
【问题描述】:
我正在处理一个现有的 HTML 表单,用于收集有关项目的数据,然后使用 PHP 将该项目记录插入 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)),记录被插入到“项目”表中,没有问题。
这就是问题所在。
最后我们有一个视图页面,我们将根据查询参数(即项目 ID)调用分配给项目的所有员工。例如,如果之前的项目 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)
然后我就可以像这样对员工运行辅助查询:
$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)";
我收到所有三个员工记录。
为了确保列 ARRAY 实际上是一个字符串,我在值上启动了一个 var_dump:
echo var_dump($project['project_staff']);
之后我收到了以下信息:
string(7) "4, 5, 6"
有人有什么想法吗?
我对能够查询值的想法感到满意,因为我收到了几个非对象和数组错误。
提前感谢您提供的任何帮助。
【问题讨论】:
-
您是否考虑过不同的架构,每个项目都有一个多对多表,每个员工都有一行?然后就是简单的join查找人员的详细信息,而不是查询、解析、再查询
-
@RowlandShaw 我完全同意。但是,客户是一家中型公司,我没有太多喘息的空间来提供更好的解决方案。最让我沮丧的是在 var_dump 之后,数组似乎被识别为字符串,但查询只带回数组中的第一项。
-
不带括号的简单连接:
$query_employees = "SELECT * FROM employees WHERE employee_id IN " . $employee_list; -
@Parfait 感谢您的建议。我试过了,但“project_staff”变量的值是一个逗号分隔的字符串,包含三个员工 ID 号 (2,3,5)。所以我收到一个查询错误,因为字符串中的这两个逗号没有被括号绑定。再次感谢。
-
当您在代码中构建字符串查询时,上述查询应该可以正常工作,就像在 phpMyAdmin 中键入字符串一样。尝试回显以下内容并检查它是否是带有 IN 子句的合法查询,并带有括号和逗号:
"SELECT * FROM employees WHERE employee_id IN (". $employee_list .")";
标签: php mysql arrays string multi-select