PHP foreach构造混乱

时间:2014-01-08 06:34:29

标签: php mysql pdo foreach

我很难将头围绕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;
    }
}

这似乎在逻辑上对我有用!正确的解决方案是否相似?如果我需要澄清任何事情,请告诉我。

三江源,

萨姆

1 个答案:

答案 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的编辑建议,在循环之前更好地创建预准备语句。准备一次,永远享受。