PHP foreach 构造困惑

标签 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不是主键,它只是反射(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/

相关文章:

php - 仅当文件路径具有特定扩展名时才显示数组行

php - 菜单元素事件状态

mysql - 无法在工作台中创建 mysql 表

mysql - Express Angular 和 mysql

php - sql更新不执行

php - PDO 中的操作数选择

php - PDO - 引号正在生成 MySQL 语法错误

php - Wordpress > 更改 x-robots-tag

javascript - 如何使用 PHP 在 javascript 中定义变量

mysql - SQL 中带有 where 条件的 Case 语句