我很难将头围绕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
不是主键,它只是反映了表格元素显示。
更新 - 工作示例
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;
}
}
这似乎在逻辑上对我有用!正确的解决方案是否相似?如果我需要澄清任何事情,请告诉我。
三江源,
萨姆
答案 0 :(得分:1)
让我们首先确保我们所有的值在发布后都在数组中;如果您不关心密钥,可以使用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>
现在我们可以处理已发布的值数组。如果我们想要使用密钥执行某些操作,我们可以使用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;
}
[edit] 根据@AravindKishore的编辑建议,在循环之前更好地创建预准备语句。准备一次,永远享受。