PHP/MySQL 如何有效地评估数组中的每一行并根据结果添加到字符串中?



我目前有一个笨拙而冗长的解决方案,我想显着简化。

在不粘贴过多代码的情况下,我将尝试精确地描述我正在做什么以及我想做什么。

该页面用于将俱乐部成员或一组俱乐部成员添加到特定事件。有包含所有成员的"音乐家"表,以及包含所有活动出席记录的"出席"表。我还有一个"排练"表,每个事件都有细节。"出勤"表有三列:"attCode"、"mus_number"和"rhcode"。

页面上的表单为用户提供了一个下拉菜单。这些选择允许插入一组成员(提供四个部分(,或所有成员,或任何单个成员。

因此,代码检查GET或POST;如果有GET,它会显示表单;如果有POST,它会执行INSERT代码并重定向到不同的页面。

因此,我们首先获取 rhcode(事件代码(,然后从"成员"表中选择所有成员(我用它来填充下拉菜单(。然后我们检查 POST,如果有数据,我们会进行一系列 IF/ELSEIF 评估,检查从下拉菜单中提交的选项。对于每个部分,我创建一个单独的 SELECT 查询,其中 section_ID 是一个特定值(基于 POST 中的值(,然后遍历生成的数组,从结果构建一个 INSERT 查询,如下所示:

if (isset($musnumber) && ($musnumber == .2)) { // if lesser than 1, it's a section and not an individual
$query_Musicians = "SELECT `number` FROM musicians WHERE instr_section == 20";
$Musicians = mysqli_query($dbConnection, $query_Musicians) or die(mysqli_error());
$insertSQL = "INSERT INTO attendance (musician_number, rhcode) VALUES ";
$i = 0;
while ($row_Musicians = mysqli_fetch_assoc($Musicians)) { 
if ($i>0) {$insertSQL .= ", ";}
$insertSQL .= "(".$row_Musicians['number'].", '".$rhcode."')";
$i++;
} 
$Result1 = mysqli_query($dbConnection, $insertSQL) or die(mysqli_error());
}

我让这个块重复四次,每个部分一次(第 30 节 .3,第 40 节 .4,整个列表 .7(,如果"$musnumber"值形成 POST>= 1(意思是,它是一个单独的成员,而不是一个组(。对于那个,我只需插入该成员信息(成员编号,事件编号(。

我一直在努力简化这一点。如果可能的话,我的目标是在一个块中完成它。逻辑是这样的:

IF  THEN
.1  INSERT into table WHERE source data Section == 10
.2  INSERT into table WHERE source data Section == 20
.3  INSERT into table WHERE source data Section == 30
.4  INSERT into table WHERE source data Section == 40
.7  INSERT into table WHERE source data Section == [anything] -- in other words, the whole list
>=1 INSERT a single record

因此,在遍历源记录时,我必须检查该源"部分"列,并且根据提交的值,仅选择要添加到 INSERT 字符串的特定记录。

有没有人建议如何在单个、更简单、更优雅的代码块中构建该 INSERT 查询,而不是多个单独的 IF/ELSEIF 评估?

在PHP中,这些抨击都不是必需的。只需直接插入数据:

INSERT INTO attendance (musician_number, rhcode)
SELECT `number`, ? FROM musicians WHERE instr_section=?

您有两个占位符,一个用于rhcode另一个用于instr_section

如果您知道要匹配一堆可能的值,请考虑将其范围扩大:

INSERT INTO attendance (musician_number, rhcode)
SELECT `number`, ? FROM musicians WHERE instr_section IN (?,?,...)

您可以在其中将(?,?,...)部分扩展到任意数量的占位符。请注意,您仍然必须绑定这些。

值得注意的是,PDO使动态绑定变得更加容易,并且更容易的是使用可以接受数组的ORM。

最新更新