基于共享ID更新循环中的单独MSSQL记录


Updating separate MSSQL records in a loop, based on a shared ID

我有一个表单,其中有几个字段设置为数组,因此:

<input type="text" name="proj[]" id="proj[]" value="<?php echo $proj[0]; >?" />
<input type="text" name="budget[]" id="budget[]" value="<?php echo $budget[0]; >?" />

(为了简洁起见,某些代码功能,如htmlspecialchars,已被编辑。)

有四个这样的分组,在INSERT时,将创建四个单独的记录。

<?php for($i=0; $i<=3; $i++) {
$new = $con->prepare("INSERT INTO table (proj, budget, formId) 
VALUES(:proj, :budget, :formid)");
$data = array('proj'=>$_POST['proj'][$i],
'budget'=>$_POST['budget'][$i],'formid'=>$formId);
//formId comes from a calculation performed elsewhere (x=x+1)
$new->execute($data);
} ?>

插入操作很好,在查询数据库后,我可以调用记录并在表单上显示它们。

<?php while($row = $data->fetch(PDO::FETCH_BOTH)) {
$proj[] =   $row['proj'];
$budget[] = $row['budget'];
} ?>

然而,当谈到更新它们时,我遇到了麻烦。我不知道如何更新各个行。这就是我迄今为止所尝试的:

<?php for($i=0; $i<=3; $i++) {
$upd = $con->prepare("UPDATE table SET proj=:proj, budget=:budget
WHERE formId = :formid");
$data = array('proj'=>$_POST['proj'][$i], 'budget'=>$_POST['budget'][$i],
'formid'=>$_SESSION['formId']);
$upd->execute($data);
}

这就是我陷入困境的地方。我不知道如何告诉MSSQL我正在更新具有相同formId的单独行。上面的代码只是将所有内容设置为NULL。我还尝试过$_SESSION['formId'][$I](给会话变量一个索引),这只会将第一行重复三次。现有数据会被项目[1]和预算[1]中的任何内容覆盖。

因此,如果用户取proj[1]=100并将其改变为proj[1]=50,并且如果他取proj[2]=50并将其改变为proj[2]=100,则我需要将其反映在相应的DB记录中。一切不变的东西都需要保持不变。想法?我觉得我很接近,但错过了一些显而易见的东西。

想明白了。我在for()循环的顶部添加了以下SELECT和while()语句:

//UID uniquely identifies each row
$getId = $con->prepare("SELECT UID FROM table WHERE formId = :formid");
$input = array('formid'=>$_SESSION['formId']);
$getId->execute($input);
//Assign the values of $row['UID'] to an array
while($row = $getId->fetch(PDO::FETCH_BOTH)) {
$uid[] = $row['UID'];

我修改了UPDATE语句,在WHERE子句中使用$uid[]的值:

WHERE formId = :formid AND UID = :uid;
$data = array('formid'=>$_SESSION['formId'], 'uid'=>$uid[$i]);

现在,只要UID是唯一的并且和它对应的formId配对,每一行都会独立于其他行进行更新。