PHP/MySQL如何有效地对数组中的每一行进行求值,并根据结果添加到字符串中?

PHP/MySQL如何有效地对数组中的每一行进行求值,并根据结果添加到字符串中?,php,mysql,conditional-statements,Php,Mysql,Conditional Statements,我目前有一个笨重冗长的解决方案,我想大大简化它 在不粘贴过多代码的情况下,我将尝试精确地描述我正在做什么以及我想做什么 该页面用于向特定活动添加俱乐部成员或俱乐部成员组。有包含所有成员的“音乐家”表和包含所有活动出席记录的“出席”表。我还有一张“排练”表,上面有每项活动的细节“考勤”表有三列:“attCode”、“mus_number”和“rhcode” 页面上的表单为用户提供了一个下拉菜单。这些选项允许插入一组成员(提供四个部分)、所有成员或任何单个成员 因此,代码检查GET或POST;如果有

我目前有一个笨重冗长的解决方案,我想大大简化它

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

该页面用于向特定活动添加俱乐部成员或俱乐部成员组。有包含所有成员的“音乐家”表和包含所有活动出席记录的“出席”表。我还有一张“排练”表,上面有每项活动的细节“考勤”表有三列:“attCode”、“mus_number”和“rhcode”

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

因此,代码检查GET或POST;如果有GET,则显示表单;如果有POST,它将执行INSERT代码并重定向到其他页面

因此,我们首先获取rhcode(事件代码),然后从“members”表中选择所有成员(我使用它填充下拉菜单)。然后我们检查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
因此,在遍历源记录时,我必须检查源“Section”列,并且根据提交的值,只选择要添加到插入字符串中的特定列


有没有人建议如何在一个简单、优雅的代码块中构建插入查询,而不是在多个单独的IF/ELSEIF求值中构建插入查询?

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

INSERT INTO attendance (musician_number, rhcode)
  SELECT `number`, ? FROM musicians WHERE instr_section=?
其中有两个占位符,一个用于
rhcode
,另一个用于
instr\u部分

如果你知道你与一系列可能的价值相匹配,那么就把它做得更广泛:

INSERT INTO attendance (musician_number, rhcode)
  SELECT `number`, ? FROM musicians WHERE instr_section IN (?,?,...)
在这里,您可以根据需要将
(?,?,…)
部分展开为尽可能多的占位符。请注意,您仍然需要绑定这些


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

注意:PDO的详细程度大大降低,使代码更易于阅读和审核,并且不容易与过时的
mysql\u query
接口混淆,因为缺少一个
i
接口可能会造成麻烦。示例:
$db=new mysqli(…)
$db->prepare(“…”)
过程接口是PHP4时代的产物,不应在新代码中使用。警告:使用
mysqli
时,您应该使用并向查询中添加任何数据。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能非常有害。请注意,MySQL中的比较是
=
,不是
==
。提示:许多问题都可以通过检测和解决,因此由简单错误导致的错误不容易被忽略。毫无例外,您必须密切关注返回值,其中许多表示您必须解决或向用户报告的问题。异常允许更复杂的流控制,因为它们可以“冒泡”到代码的其他部分,以便更方便地处理它们。需要一个论点。请考虑切换错误模式。谢谢你的回答和建议。我有一些程序经验,但我真的需要学习面向对象接口和PDO。我很清楚,在这个陈旧过时的代码中进行的所有修补都是毫无意义的……PDO是从
mysqli
的一个巨大进步。我还鼓励您检查ORMs,它可以为您提供一个控制层,而不仅仅是为所有内容编写SQL。