【问题标题】:How to Convert MySQL Column Value From Array to String如何将 MySQL 列值从数组转换为字符串
【发布时间】: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


【解决方案1】:

从你所说的我很确定你正在存储一个字符串$employee_list,它可能是'2,3,4'。那么你的IN ($employee_list) 真的是IN ('2,3,4') 但你真正想要的是IN (2,3,4)。有多种方法可以到达那里,但你可以这样做

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

【讨论】:

  • 我在草稿模式下对explode的回答几乎相同,然后是implode,但正在等待OP回复我的最后一条评论。即使在原始的 '2,3,4' 字符串中,原始查询 $query_employees 也应该可以工作。
  • SQL 绝对不会知道您想将其视为整数列表,而不是恰好包含逗号的字符串。它与 'a,b,c' 与 'a','b','c' 没有什么不同。
  • @Elin,这非常有效。看起来这是一个将数组转换为字符串的问题,由于逗号和引号,它似乎仍然充当 MySQL 查询的数组。谢谢一百万。
  • @Parfait 非常感谢您的指导。到目前为止,您给我的帮助似乎正朝着这个方向缓慢发展。我会对这个数据库采取不同的方式,但我们处于环境无法改变的情况,我们不得不考虑一种解决方案,允许四个或更少 ID 的逗号分隔数组位于内部相同的列值。感谢您所有的帮助。真的很感激。
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2019-05-31
  • 2022-07-26
  • 2018-09-29
  • 2020-06-14
相关资源
最近更新 更多