Php 根据选中的复选框更新数据库
我的数据库中有以下表格布局和一些数据。 我通过复选框进行输入,以便用户可以选择所有适用的事故道路条件,并将其保存到数据库中。我想说,如果您要添加一条新记录,您只需循环通过checkboexs checked并将其插入数据库中就可以了 第一个信息现在保存在数据库中,现在用户出于任何原因决定更改路况,用户返回并将其更改为以下内容 现在我的问题是,我应该如何更新我的表。我想到的第一件事是删除已经存在的记录并插入新的记录 我这里真正的问题是,假设用户之前选择了3个项目,但更改了两个或一个,那么我如何删除那些未检查的项目你知道我在说什么。下面是我一直在尝试的一些代码片段Php 根据选中的复选框更新数据库,php,mysql,sql,database,Php,Mysql,Sql,Database,我的数据库中有以下表格布局和一些数据。 我通过复选框进行输入,以便用户可以选择所有适用的事故道路条件,并将其保存到数据库中。我想说,如果您要添加一条新记录,您只需循环通过checkboexs checked并将其插入数据库中就可以了 第一个信息现在保存在数据库中,现在用户出于任何原因决定更改路况,用户返回并将其更改为以下内容 现在我的问题是,我应该如何更新我的表。我想到的第一件事是删除已经存在的记录并插入新的记录 我这里真正的问题是,假设用户之前选择了3个项目,但更改了两个或一个,那么我如
$accidentRoadConditions = AccidentRoadConditions::findAccidentRoadConditions($acc_det_id);
$wc_array = [];
while ($roadConditions = $accidentRoadConditions ->fetch(PDO::FETCH_OBJ)) {
$wc_array[] = $roadConditions ->rc_id;
}
上面我选择了数据库中已经存储的所有路况
if (isset($_POST['rta_ad_rc'])) {
foreach ($_POST['rta_ad_rc'] as $rc_id) {
//AccidentRoadConditions::save(array(null, $ad_lsid, $rc_id));
// $tmprory = AccidentRoadConditions::findByADAndRCIds($acc_det_id, $rc_id);
// if(!$tmprory){
// AccidentRoadConditions::save(array(null, $acc_det_id, $rc_id));
// }
if(in_array($rc_id, $wc_array)){
$errors[] = "in array <br />";
unset($wc_array[0]);
}
}
}
if(isset($\u POST['rta\u ad\u rc'])){
foreach($\u POST['rta\u ad\u rc']作为$rc\u id){
//意外路况::保存(数组(null,$ad_lsid,$rc_id));
//$tmprory=AccidentRoadConditions::findByadRcids($acc_det_id,$rc_id);
//如果(!$tProry){
//意外路况::保存(数组(null,$acc_det_id,$rc_id));
// }
if(在数组中($rc\u id,$wc\u数组)){
$errors[]=“在数组中
”;
未设置($wc_数组[0]);
}
}
}
所以我的问题是如何根据用户检查的内容更新数据库中的值,并删除以前检查过的未检查的值。变得有点复杂,所以简单地说,如何根据上述场景更新数据库
有什么想法吗 我认为这是你应该做的
- 在ad_id和rc_id上创建复合唯一约束
- 删除不在所选复选框ID中的所有行
- 尝试插入所有行,但用户插入忽略。如果记录不存在,这将插入该记录,或者忽略该记录。当您使用某个框架时,请查看如何做到这一点。 如果不能,则只需使用try/catch包装它,如果错误与约束冲突有关,则忽略它
这样,您就不需要检查这些值是否存在,也不会有任何不必要的插入。我认为您需要执行以下操作
- 将所选支票存储在数组中
- 如果其中任何一个已保存或未保存,请检入数据库
- 如果是,则跳过它们,否则将它们添加到数组中 $old_rc_数组=[]; $new_rc_array=[] 而($roadConditions=$accidentRoadConditions->fetch(PDO::fetch_OBJ)){ $old_rc_array[]=$roadConditions->rc_id; } 如果(isset($_POST['rta\u ad\u rc'])){ foreach($\u POST['rta\u ad\u rc']作为$rc\u id){ } } foreach($rc\u旧数组作为$rc\u to\u删除){ 意外路况::deleteByADIdAndRCId($hidden_acc_det_id,$rc_to_delete); } foreach($rc\u新数组作为$rc\u to\u插入){ 意外路况::保存(数组(null,$hidden_acc_det_id,$rc_to_insert)); }
$tmprory=acidentroadconditions::findbyaandrcids($acc_det_id,$rc_id);如果(!$tmprory){AccidentRoadConditions::save(数组(null,$acc_det_id,$rc_id));/}
Yes,但首先检查记录是否存在,然后插入。可以通过添加复合唯一约束来避免这种情况。上面的代码检查数据库中的记录是否已经存在如果没有插入新的,否则什么都不做try catch块下的所有操作我已经在这里转储了完整的代码是的,我明白了,但是您正在进行两个DB调用,首先检查行是否存在,然后插入。如果您有唯一约束,则无需检查行是否存在,如果存在,则DB将抛出错误,您可以忽略该错误。谢谢@Sharif,我将自己整理格式
if(in_array($rc_id, $old_rc_array)){
unset($old_rc_array[array_search($rc_id, $old_rc_array)]);
}else{
$new_rc_array[] = $rc_id;
}