我很难理解 foreach
构造。当然,我找到了很多例子,但我似乎永远无法使它们适应我的需要。
请考虑我的这个工作示例:
我正在 HTML 表单中收集两个日期:
<form method="post">
<legend>Minutes and Records</legend>
<label for="FirstAGMDate">First AGM Date (only if known)</label>
<input type="text" name="FirstAGMDate" value="2014-01-01" />
<label for="MinutesInspectedFromDate">Minutes Inspected From Date</label>
<input type="text" name="MinutesInspectedFromDate" value="2014-01-02" />
<input type="submit" name="submit" />
</form>
提交时,值将通过 PDO 准备好的语句推送到 mysql 数据库:
if (isset($_POST['submit'])) {
$sql = "UPDATE jobsinglevalues SET Date = :FirstAGMDate WHERE FormId = 0;
UPDATE jobsinglevalues SET Date = :MinutesInspectedFromDate WHERE FormId = 1;";
$sth = $db->prepare($sql);
$sth->execute(array(':FirstAGMDate'=>($_POST['FirstAGMDate']), ':MinutesInspectedFromDate'=>($_POST['MinutesInspectedFromDate'])));
}
这没有问题,但当我需要对十几个输入重复此操作时,它不是很聪明。我想要做的是只用一行sql来实现这一点;循环每个 <input type="text" name="Value" />
。
如何将其放入 foreach
循环?
在我的脑海中它的工作原理是这样的:
提交时,每个输入都会根据 FormId
更新数据库中的值,从 0 开始每个循环加 1。 FormId
不是主键,它只是反射(reflect)表单元素的显示顺序。
更新 - 工作示例
if (isset($_POST['submit'])) {
$FormId = 0;
foreach($_POST['Value'] as $avalue){
$sql = "UPDATE jobsinglevalues SET Date = :Value WHERE FormId = :FormId";
$sth = $db->prepare($sql);
$sth->execute(array(':Value'=>($avalue), ':FormId'=>($FormId)));
++$FormId;
}
}
这对我来说似乎是合乎逻辑的!正确的解决方案是否相似?如果我需要澄清任何事情,请告诉我。
谢谢,
山姆
最佳答案
首先,我们要确保所有的值在发布后都在一个数组中;如果你不关心 key ,你可以使用 name="Values[]"
,但我会使用 name="Value[FirstAGMDate]"
等等,这样我们就知道一个值属于哪个键。
<form method="post">
<legend>Minutes and Records</legend>
<label for="FirstAGMDate">First AGM Date (only if known)</label>
<input type="text" id="FirstAGMDate" name="Value[FirstAGMDate]" value="2014-01-01" />
<label for="MinutesInspectedFromDate">Minutes Inspected From Date</label>
<input type="text" id="MinutesInspectedFromDate" name="Value[MinutesInspectedFromDate]" value="2014-01-02" />
<input type="submit" name="submit" />
</form>
现在我们可以处理发布的值数组。如果我们想用 key 做一些事情,我们可以使用 foreach($_POST['Value'] as $akey => $avalue)
,如果我们只对值感兴趣,那么 foreach($_POST['Value'] as $avalue)
就够了。
$sql = "UPDATE jobsinglevalues SET Date = :Value WHERE FormId = :FormId;";
$sth = $db->prepare($sql);
foreach($_POST['Value'] as $akey => $avalue) {
$sth->execute(array(':Value' => $avalue, ':FormId'=> $FormId ));
++$FormId;
}
[编辑] 根据 @AravindKishore 的编辑建议,最好在循环之前创建准备好的语句。准备一次,永远享受。
关于PHP foreach 构造困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988565/