迭代时更新每一行 - 逻辑结构辅助

时间:2016-06-20 18:34:24

标签: php mysql

我需要帮助才能找出这个问题。我试图尽可能地简化事情。没有任何错误,这只是访问的问题,我无法理解。

想象一下:

<?php
   for($i=0;$i<3;$i++){
   ?>
    Member:
    <input type="text" name="<?php echo trim("member_".$i);?>" />
    <br/>
   <?php
   } ?>

以上代码生成:

<input name="member_1">
 <input name="member_2">
 <input name="member_3">

现在假设,表中的数据

org_ID (Foreign Key)    member
A                          1
A                          2
A                          3

现在来更新功能:

public function updateTo($tableName, $org_D,$member) {
        try {
            $stm = "update " . $tableName . " SET member = :member WHERE org_D= :org_D";
            $eksekutor = $this->koneksi->prepare($stm);
            $eksekutor->bindValue(":org_D",  $org_D, PDO::PARAM_STR);
            $eksekutor->bindValue(":member ", $member, PDO::PARAM_STR);
             $eksekutor->execute();
            $done = true;
        } catch (PDOException $e) {
            $done = false;
        }
        return $done;
    }

最后是更新操作:

如果我这样做这是错误的,因为它不断更新每次迭代的所有行):

for($i=0;$i<3;$i++) {
    $member = $_POST["member_$i"];
    $update = $kad->updateTo("table_name", $org_D,  $member);
}

我需要帮助,我无法理解如何实现此更新操作:

$_POST["member_1"]; ------ UPDATE TO-------> row "member" contains 1
$_POST["member_2"]; ------ UPDATE TO-------> row "member" contains 2
$_POST["member_3"]; ------ UPDATE TO-------> row "member" contains 3

因为在更新操作中我要为每个 WHERE=

决定价值

2 个答案:

答案 0 :(得分:1)

目前,您在每次迭代中向您的数据库发送相同的UPDATE语句。如果要在每次迭代时更新单个成员,则必须将其添加到WHERE子句中。

也许你有更多的东西来引用一个成员而不是你的例子中给出的东西。否则,您必须将以前的成员值添加到where子句中。

public function updateTo($tableName, $org_D, $prevMember, $newMember) {
    ...
    $stm = "update " . $tableName . " SET member= :newMember WHERE org_D=:org_D AND member = :prevMember";
    $eksekutor = $this->koneksi->prepare($stm);
    $eksekutor->bindValue(":org_D",  $org_D, PDO::PARAM_STR);
    $eksekutor->bindValue(":newMember", $newMember, PDO::PARAM_STR);
    $eksekutor->bindValue(":prevMember", $prevMember, PDO::PARAM_STR);
    ...
}

答案 1 :(得分:1)

问题在于您的WHERE条件。见这里,

...WHERE org_D= :org_D";

由于您将A作为方法的参数传递org_D,因此它会在for循环的每次迭代中更新所有三行。您还需要将当前成员的ID传递给updateTo()方法。

因此,首先按以下方式更改for循环,

for($i=0;$i<3;$i++) {
    $member = $_POST["member_$i"];
    $update = $kad->updateTo("table_name", $i+1, $org_D,  $member);
}

然后按以下方式更改updateTo()方法,

public function updateTo($tableName, $oldMemberId, $org_D, $newMemberId) {
    try {
        $stm = "update " . $tableName . " SET member = :newMemberId WHERE member = :oldMemberId AND org_D= :org_D";
        $eksekutor = $this->koneksi->prepare($stm);
        $eksekutor->bindValue(":newMemberId ", $newMemberId, PDO::PARAM_STR);
        $eksekutor->bindValue(":oldMemberId ", $oldMemberId, PDO::PARAM_STR);
        $eksekutor->bindValue(":org_D",  $org_D, PDO::PARAM_STR);
        $eksekutor->execute();
        $done = true;
    } catch (PDOException $e) {
        $done = false;
    }
    return $done;
}